xref: /llvm-project/mlir/lib/Dialect/SparseTensor/Transforms/BufferizableOpInterfaceImpl.cpp (revision 6ed4d15cf49bca27157c6c8c896a7f674ef5df3a)
13798678bSMatthias Springer //===- BufferizableOpInterfaceImpl.cpp - Impl. of BufferizableOpInterface -===//
23798678bSMatthias Springer //
33798678bSMatthias Springer // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43798678bSMatthias Springer // See https://llvm.org/LICENSE.txt for license information.
53798678bSMatthias Springer // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63798678bSMatthias Springer //
73798678bSMatthias Springer //===----------------------------------------------------------------------===//
83798678bSMatthias Springer //
93798678bSMatthias Springer // These BufferizableOpInterface implementations provide analysis-related
103798678bSMatthias Springer // interface methods only. They are getting bufferized by the
113798678bSMatthias Springer // SparseTensorConversion pass.
123798678bSMatthias Springer 
133798678bSMatthias Springer #include "mlir/Dialect/SparseTensor/Transforms/BufferizableOpInterfaceImpl.h"
143798678bSMatthias Springer 
153798678bSMatthias Springer #include "mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h"
163798678bSMatthias Springer #include "mlir/Dialect/Bufferization/IR/Bufferization.h"
173798678bSMatthias Springer #include "mlir/Dialect/SparseTensor/IR/SparseTensor.h"
183798678bSMatthias Springer #include "mlir/IR/Dialect.h"
193798678bSMatthias Springer #include "mlir/IR/Operation.h"
203798678bSMatthias Springer #include "mlir/IR/PatternMatch.h"
213798678bSMatthias Springer 
223798678bSMatthias Springer using namespace mlir::bufferization;
233798678bSMatthias Springer using namespace mlir::sparse_tensor;
243798678bSMatthias Springer 
253798678bSMatthias Springer namespace mlir {
263798678bSMatthias Springer namespace sparse_tensor {
273798678bSMatthias Springer namespace {
283798678bSMatthias Springer 
2979ff70fdSMatthias Springer template <typename ConcreteModel, typename ConcreteOp>
3079ff70fdSMatthias Springer struct SparseBufferizableOpInterfaceExternalModel
3179ff70fdSMatthias Springer     : public BufferizableOpInterface::ExternalModel<ConcreteModel, ConcreteOp> {
bufferizemlir::sparse_tensor::__anonf7ee666a0111::SparseBufferizableOpInterfaceExternalModel3279ff70fdSMatthias Springer   LogicalResult bufferize(Operation *op, RewriterBase &rewriter,
3379ff70fdSMatthias Springer                           const BufferizationOptions &options) const {
3479ff70fdSMatthias Springer     return op->emitError(
35c43e6274STim Harvey         "sparse_tensor ops must be bufferized with the sparsifier");
3679ff70fdSMatthias Springer   }
3779ff70fdSMatthias Springer };
3879ff70fdSMatthias Springer 
39fa639d3bSMatthias Springer struct ConcatenateOpInterface
4079ff70fdSMatthias Springer     : SparseBufferizableOpInterfaceExternalModel<ConcatenateOpInterface,
4179ff70fdSMatthias Springer                                                  sparse_tensor::ConcatenateOp> {
bufferizesToAllocationmlir::sparse_tensor::__anonf7ee666a0111::ConcatenateOpInterface42a02ad6c1SMatthias Springer   bool bufferizesToAllocation(Operation *op, Value value) const { return true; }
43fa639d3bSMatthias Springer 
bufferizesToMemoryReadmlir::sparse_tensor::__anonf7ee666a0111::ConcatenateOpInterface44fa639d3bSMatthias Springer   bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
45fa639d3bSMatthias Springer                               const AnalysisState &state) const {
46fa639d3bSMatthias Springer     return true;
47fa639d3bSMatthias Springer   }
48fa639d3bSMatthias Springer 
bufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::ConcatenateOpInterface49fa639d3bSMatthias Springer   bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
50fa639d3bSMatthias Springer                                const AnalysisState &state) const {
51fa639d3bSMatthias Springer     return false;
52fa639d3bSMatthias Springer   }
53fa639d3bSMatthias Springer 
getAliasingValuesmlir::sparse_tensor::__anonf7ee666a0111::ConcatenateOpInterface54a02ad6c1SMatthias Springer   AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
55fa639d3bSMatthias Springer                                       const AnalysisState &state) const {
56fa639d3bSMatthias Springer     return {};
57fa639d3bSMatthias Springer   }
58fa639d3bSMatthias Springer 
isWritablemlir::sparse_tensor::__anonf7ee666a0111::ConcatenateOpInterface59fa639d3bSMatthias Springer   bool isWritable(Operation *op, Value value,
60fa639d3bSMatthias Springer                   const AnalysisState &state) const {
61fa639d3bSMatthias Springer     return true;
62fa639d3bSMatthias Springer   }
63fa639d3bSMatthias Springer };
64fa639d3bSMatthias Springer 
6579ff70fdSMatthias Springer struct ConvertOpInterface : public SparseBufferizableOpInterfaceExternalModel<
6679ff70fdSMatthias Springer                                 ConvertOpInterface, sparse_tensor::ConvertOp> {
bufferizesToAllocationmlir::sparse_tensor::__anonf7ee666a0111::ConvertOpInterface67a02ad6c1SMatthias Springer   bool bufferizesToAllocation(Operation *op, Value value) const {
683798678bSMatthias Springer     // ConvertOps may allocate. (Unless they convert between two identical
693798678bSMatthias Springer     // types, then they fold away.)
703798678bSMatthias Springer     return true;
713798678bSMatthias Springer   }
723798678bSMatthias Springer 
bufferizesToMemoryReadmlir::sparse_tensor::__anonf7ee666a0111::ConvertOpInterface733798678bSMatthias Springer   bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
743798678bSMatthias Springer                               const AnalysisState &state) const {
753798678bSMatthias Springer     return true;
763798678bSMatthias Springer   }
773798678bSMatthias Springer 
bufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::ConvertOpInterface783798678bSMatthias Springer   bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
793798678bSMatthias Springer                                const AnalysisState &state) const {
803798678bSMatthias Springer     return false;
813798678bSMatthias Springer   }
823798678bSMatthias Springer 
getAliasingValuesmlir::sparse_tensor::__anonf7ee666a0111::ConvertOpInterface83a02ad6c1SMatthias Springer   AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
843798678bSMatthias Springer                                       const AnalysisState &state) const {
853798678bSMatthias Springer     return {};
863798678bSMatthias Springer   }
873798678bSMatthias Springer 
isWritablemlir::sparse_tensor::__anonf7ee666a0111::ConvertOpInterface883798678bSMatthias Springer   bool isWritable(Operation *op, Value value,
893798678bSMatthias Springer                   const AnalysisState &state) const {
903798678bSMatthias Springer     return true;
913798678bSMatthias Springer   }
923798678bSMatthias Springer };
933798678bSMatthias Springer 
943798678bSMatthias Springer struct LoadOpInterface
9579ff70fdSMatthias Springer     : public SparseBufferizableOpInterfaceExternalModel<LoadOpInterface,
963798678bSMatthias Springer                                                         sparse_tensor::LoadOp> {
bufferizesToMemoryReadmlir::sparse_tensor::__anonf7ee666a0111::LoadOpInterface973798678bSMatthias Springer   bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
983798678bSMatthias Springer                               const AnalysisState &state) const {
993798678bSMatthias Springer     return false;
1003798678bSMatthias Springer   }
1013798678bSMatthias Springer 
bufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::LoadOpInterface1023798678bSMatthias Springer   bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
1033798678bSMatthias Springer                                const AnalysisState &state) const {
1043798678bSMatthias Springer     return false;
1053798678bSMatthias Springer   }
1063798678bSMatthias Springer 
getAliasingValuesmlir::sparse_tensor::__anonf7ee666a0111::LoadOpInterface107a02ad6c1SMatthias Springer   AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
1083798678bSMatthias Springer                                       const AnalysisState &state) const {
1099fa6b350SMatthias Springer     return {{op->getOpResult(0), BufferRelation::Equivalent}};
1103798678bSMatthias Springer   }
1113798678bSMatthias Springer };
1123798678bSMatthias Springer 
1133798678bSMatthias Springer struct NewOpInterface
11479ff70fdSMatthias Springer     : public SparseBufferizableOpInterfaceExternalModel<NewOpInterface,
1153798678bSMatthias Springer                                                         sparse_tensor::NewOp> {
resultBufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::NewOpInterface11634d65e81SMatthias Springer   bool resultBufferizesToMemoryWrite(Operation *op, OpResult opResult,
1173798678bSMatthias Springer                                      const AnalysisState &state) const {
1183798678bSMatthias Springer     // NewOps allocate but do not write.
1193798678bSMatthias Springer     return false;
1203798678bSMatthias Springer   }
1213798678bSMatthias Springer 
bufferizesToAllocationmlir::sparse_tensor::__anonf7ee666a0111::NewOpInterface122a02ad6c1SMatthias Springer   bool bufferizesToAllocation(Operation *op, Value value) const { return true; }
1233798678bSMatthias Springer };
1243798678bSMatthias Springer 
1256ca47eb4SPeiming Liu struct AssembleOpInterface
1266ca47eb4SPeiming Liu     : public SparseBufferizableOpInterfaceExternalModel<
1276ca47eb4SPeiming Liu           AssembleOpInterface, sparse_tensor::AssembleOp> {
bufferizesToAllocationmlir::sparse_tensor::__anonf7ee666a0111::AssembleOpInterface128a02ad6c1SMatthias Springer   bool bufferizesToAllocation(Operation *op, Value value) const {
1296ca47eb4SPeiming Liu     // AssembleOp reuses all the buffers instead of allocating new ones
1307fef8d69SPeiming Liu     return false;
1317fef8d69SPeiming Liu   }
1327fef8d69SPeiming Liu 
bufferizesToMemoryReadmlir::sparse_tensor::__anonf7ee666a0111::AssembleOpInterface1337fef8d69SPeiming Liu   bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
1347fef8d69SPeiming Liu                               const AnalysisState &state) const {
1357fef8d69SPeiming Liu     return true;
1367fef8d69SPeiming Liu   }
1377fef8d69SPeiming Liu 
bufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::AssembleOpInterface1387fef8d69SPeiming Liu   bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
1397fef8d69SPeiming Liu                                const AnalysisState &state) const {
1407fef8d69SPeiming Liu     return false;
1417fef8d69SPeiming Liu   }
1427fef8d69SPeiming Liu 
getAliasingValuesmlir::sparse_tensor::__anonf7ee666a0111::AssembleOpInterface143a02ad6c1SMatthias Springer   AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
1447fef8d69SPeiming Liu                                       const AnalysisState &state) const {
1457fef8d69SPeiming Liu     assert(op->getNumResults() == 1);
1466ca47eb4SPeiming Liu     // AssembleOp reuses the input tensors as values/coordinates instead of
14784cd51bbSwren romano     // creating new ones when packing into a COO format.
1489fa6b350SMatthias Springer     return {{op->getOpResult(0), BufferRelation::Equivalent}};
1497fef8d69SPeiming Liu   }
150dc6427d6SPeiming Liu 
bufferRelationmlir::sparse_tensor::__anonf7ee666a0111::AssembleOpInterface151dc6427d6SPeiming Liu   BufferRelation bufferRelation(Operation *oo, OpResult opResult,
152dc6427d6SPeiming Liu                                 const AnalysisState &state) const {
153dc6427d6SPeiming Liu     return BufferRelation::Unknown;
154dc6427d6SPeiming Liu   }
155dc6427d6SPeiming Liu };
156dc6427d6SPeiming Liu 
1576ca47eb4SPeiming Liu struct DisassembleOpInterface
1586ca47eb4SPeiming Liu     : public SparseBufferizableOpInterfaceExternalModel<
1596ca47eb4SPeiming Liu           DisassembleOpInterface, sparse_tensor::DisassembleOp> {
bufferizesToAllocationmlir::sparse_tensor::__anonf7ee666a0111::DisassembleOpInterface160a02ad6c1SMatthias Springer   bool bufferizesToAllocation(Operation *op, Value value) const {
161b2e6b735SPeiming Liu     // The output buffer is pre-allocated by the user.
162b2e6b735SPeiming Liu     return false;
163dc6427d6SPeiming Liu   }
164dc6427d6SPeiming Liu 
bufferizesToMemoryReadmlir::sparse_tensor::__anonf7ee666a0111::DisassembleOpInterface165dc6427d6SPeiming Liu   bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
166dc6427d6SPeiming Liu                               const AnalysisState &state) const {
167b2e6b735SPeiming Liu     // The first operand is the sparse tensor that we are unpacking.
168b2e6b735SPeiming Liu     return opOperand.getOperandNumber() == 0;
169dc6427d6SPeiming Liu   }
170dc6427d6SPeiming Liu 
bufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::DisassembleOpInterface171dc6427d6SPeiming Liu   bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
172dc6427d6SPeiming Liu                                const AnalysisState &state) const {
173b2e6b735SPeiming Liu     // We write into the output operand.
174a63d6a00SPeiming Liu     assert(2 * (op->getNumOperands() - 1) == op->getNumResults());
175b2e6b735SPeiming Liu     return opOperand.getOperandNumber() > 0;
176dc6427d6SPeiming Liu   }
177dc6427d6SPeiming Liu 
getAliasingValuesmlir::sparse_tensor::__anonf7ee666a0111::DisassembleOpInterface178a02ad6c1SMatthias Springer   AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
179dc6427d6SPeiming Liu                                       const AnalysisState &state) const {
180a63d6a00SPeiming Liu     assert(2 * (op->getNumOperands() - 1) == op->getNumResults());
181b2e6b735SPeiming Liu 
182b2e6b735SPeiming Liu     if (opOperand.getOperandNumber() == 0)
183dc6427d6SPeiming Liu       return {};
184b2e6b735SPeiming Liu     // We write directly into the output tensors and returns them.
185b2e6b735SPeiming Liu     return {{op->getResult(opOperand.getOperandNumber() - 1),
186b2e6b735SPeiming Liu              BufferRelation::Equivalent}};
187dc6427d6SPeiming Liu   }
1887fef8d69SPeiming Liu };
1897fef8d69SPeiming Liu 
190*6ed4d15cSMatthias Springer struct ForeachOpInterface : public SparseBufferizableOpInterfaceExternalModel<
191*6ed4d15cSMatthias Springer                                 ForeachOpInterface, sparse_tensor::ForeachOp> {
bufferizesToMemoryReadmlir::sparse_tensor::__anonf7ee666a0111::ForeachOpInterface192*6ed4d15cSMatthias Springer   bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
193*6ed4d15cSMatthias Springer                               const AnalysisState &state) const {
194*6ed4d15cSMatthias Springer     return true;
195*6ed4d15cSMatthias Springer   }
196*6ed4d15cSMatthias Springer 
bufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::ForeachOpInterface197*6ed4d15cSMatthias Springer   bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
198*6ed4d15cSMatthias Springer                                const AnalysisState &state) const {
199*6ed4d15cSMatthias Springer     return false;
200*6ed4d15cSMatthias Springer   }
201*6ed4d15cSMatthias Springer 
getAliasingValuesmlir::sparse_tensor::__anonf7ee666a0111::ForeachOpInterface202*6ed4d15cSMatthias Springer   AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
203*6ed4d15cSMatthias Springer                                       const AnalysisState &state) const {
204*6ed4d15cSMatthias Springer     return {};
205*6ed4d15cSMatthias Springer   }
206*6ed4d15cSMatthias Springer 
verifyAnalysismlir::sparse_tensor::__anonf7ee666a0111::ForeachOpInterface207*6ed4d15cSMatthias Springer   LogicalResult verifyAnalysis(Operation *op,
208*6ed4d15cSMatthias Springer                                const AnalysisState &state) const {
209*6ed4d15cSMatthias Springer     // A more complex analysis (similar to scf.for) is needed if the op returns
210*6ed4d15cSMatthias Springer     // a tensor. That tensor would have to be bufferized (not implemented yet).
211*6ed4d15cSMatthias Springer     for (OpResult result : op->getResults()) {
212*6ed4d15cSMatthias Springer       if (isa<TensorType>(result.getType()))
213*6ed4d15cSMatthias Springer         return op->emitOpError("tensor results are not supported yet");
214*6ed4d15cSMatthias Springer     }
215*6ed4d15cSMatthias Springer     return success();
216*6ed4d15cSMatthias Springer   }
217*6ed4d15cSMatthias Springer };
218*6ed4d15cSMatthias Springer 
219fa639d3bSMatthias Springer struct NumberOfEntriesOpInterface
22079ff70fdSMatthias Springer     : public SparseBufferizableOpInterfaceExternalModel<
221fa639d3bSMatthias Springer           NumberOfEntriesOpInterface, sparse_tensor::NumberOfEntriesOp> {
bufferizesToMemoryReadmlir::sparse_tensor::__anonf7ee666a0111::NumberOfEntriesOpInterface222fa639d3bSMatthias Springer   bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
223fa639d3bSMatthias Springer                               const AnalysisState &state) const {
224fa639d3bSMatthias Springer     return true;
225fa639d3bSMatthias Springer   }
226fa639d3bSMatthias Springer 
bufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::NumberOfEntriesOpInterface227fa639d3bSMatthias Springer   bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
228fa639d3bSMatthias Springer                                const AnalysisState &state) const {
229fa639d3bSMatthias Springer     return false;
230fa639d3bSMatthias Springer   }
231fa639d3bSMatthias Springer 
getAliasingValuesmlir::sparse_tensor::__anonf7ee666a0111::NumberOfEntriesOpInterface232a02ad6c1SMatthias Springer   AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
233fa639d3bSMatthias Springer                                       const AnalysisState &state) const {
234fa639d3bSMatthias Springer     return {};
235fa639d3bSMatthias Springer   }
236fa639d3bSMatthias Springer };
237fa639d3bSMatthias Springer 
23884cd51bbSwren romano struct ToCoordinatesBufferOpInterface
23979ff70fdSMatthias Springer     : public SparseBufferizableOpInterfaceExternalModel<
24084cd51bbSwren romano           ToCoordinatesBufferOpInterface,
24184cd51bbSwren romano           sparse_tensor::ToCoordinatesBufferOp> {
bufferizesToMemoryReadmlir::sparse_tensor::__anonf7ee666a0111::ToCoordinatesBufferOpInterface242fa639d3bSMatthias Springer   bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
243fa639d3bSMatthias Springer                               const AnalysisState &state) const {
244fa639d3bSMatthias Springer     return true;
245fa639d3bSMatthias Springer   }
246fa639d3bSMatthias Springer 
bufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::ToCoordinatesBufferOpInterface247fa639d3bSMatthias Springer   bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
248fa639d3bSMatthias Springer                                const AnalysisState &state) const {
24984cd51bbSwren romano     // Potential writes into memory through the result of
25084cd51bbSwren romano     // `sparse_tensor.coordinates` are not considered.
251fa639d3bSMatthias Springer     return false;
252fa639d3bSMatthias Springer   }
253fa639d3bSMatthias Springer 
getAliasingValuesmlir::sparse_tensor::__anonf7ee666a0111::ToCoordinatesBufferOpInterface254a02ad6c1SMatthias Springer   AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
255fa639d3bSMatthias Springer                                       const AnalysisState &state) const {
256fa639d3bSMatthias Springer     return {};
257fa639d3bSMatthias Springer   }
258fa639d3bSMatthias Springer };
259fa639d3bSMatthias Springer 
26084cd51bbSwren romano struct ToCoordinatesOpInterface
26179ff70fdSMatthias Springer     : public SparseBufferizableOpInterfaceExternalModel<
26284cd51bbSwren romano           ToCoordinatesOpInterface, sparse_tensor::ToCoordinatesOp> {
bufferizesToMemoryReadmlir::sparse_tensor::__anonf7ee666a0111::ToCoordinatesOpInterface263fa639d3bSMatthias Springer   bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
264fa639d3bSMatthias Springer                               const AnalysisState &state) const {
265fa639d3bSMatthias Springer     return true;
266fa639d3bSMatthias Springer   }
267fa639d3bSMatthias Springer 
bufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::ToCoordinatesOpInterface268fa639d3bSMatthias Springer   bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
269fa639d3bSMatthias Springer                                const AnalysisState &state) const {
27084cd51bbSwren romano     // Potential writes into memory through the result of
27184cd51bbSwren romano     // `sparse_tensor.coordinates` are not considered.
272fa639d3bSMatthias Springer     return false;
273fa639d3bSMatthias Springer   }
274fa639d3bSMatthias Springer 
getAliasingValuesmlir::sparse_tensor::__anonf7ee666a0111::ToCoordinatesOpInterface275a02ad6c1SMatthias Springer   AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
276fa639d3bSMatthias Springer                                       const AnalysisState &state) const {
277fa639d3bSMatthias Springer     return {};
278fa639d3bSMatthias Springer   }
279fa639d3bSMatthias Springer };
280fa639d3bSMatthias Springer 
28184cd51bbSwren romano struct ToPositionsOpInterface
28279ff70fdSMatthias Springer     : public SparseBufferizableOpInterfaceExternalModel<
28384cd51bbSwren romano           ToPositionsOpInterface, sparse_tensor::ToPositionsOp> {
bufferizesToMemoryReadmlir::sparse_tensor::__anonf7ee666a0111::ToPositionsOpInterface284fa639d3bSMatthias Springer   bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
285fa639d3bSMatthias Springer                               const AnalysisState &state) const {
286fa639d3bSMatthias Springer     return true;
287fa639d3bSMatthias Springer   }
288fa639d3bSMatthias Springer 
bufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::ToPositionsOpInterface289fa639d3bSMatthias Springer   bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
290fa639d3bSMatthias Springer                                const AnalysisState &state) const {
29184cd51bbSwren romano     // Potential writes into memory through the result of
29284cd51bbSwren romano     // `sparse_tensor.positions` are not considered.
293fa639d3bSMatthias Springer     return false;
294fa639d3bSMatthias Springer   }
295fa639d3bSMatthias Springer 
getAliasingValuesmlir::sparse_tensor::__anonf7ee666a0111::ToPositionsOpInterface296a02ad6c1SMatthias Springer   AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
297fa639d3bSMatthias Springer                                       const AnalysisState &state) const {
298fa639d3bSMatthias Springer     return {};
299fa639d3bSMatthias Springer   }
300fa639d3bSMatthias Springer };
301fa639d3bSMatthias Springer 
302fa639d3bSMatthias Springer struct ToValuesOpInterface
30379ff70fdSMatthias Springer     : public SparseBufferizableOpInterfaceExternalModel<
30479ff70fdSMatthias Springer           ToValuesOpInterface, sparse_tensor::ToValuesOp> {
bufferizesToMemoryReadmlir::sparse_tensor::__anonf7ee666a0111::ToValuesOpInterface305fa639d3bSMatthias Springer   bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
306fa639d3bSMatthias Springer                               const AnalysisState &state) const {
307fa639d3bSMatthias Springer     return true;
308fa639d3bSMatthias Springer   }
309fa639d3bSMatthias Springer 
bufferizesToMemoryWritemlir::sparse_tensor::__anonf7ee666a0111::ToValuesOpInterface310fa639d3bSMatthias Springer   bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
311fa639d3bSMatthias Springer                                const AnalysisState &state) const {
312fa639d3bSMatthias Springer     // Potential writes into memory through the result of sparse_tensor.values
313fa639d3bSMatthias Springer     // are not considered.
314fa639d3bSMatthias Springer     return false;
315fa639d3bSMatthias Springer   }
316fa639d3bSMatthias Springer 
getAliasingValuesmlir::sparse_tensor::__anonf7ee666a0111::ToValuesOpInterface317a02ad6c1SMatthias Springer   AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
318fa639d3bSMatthias Springer                                       const AnalysisState &state) const {
319fa639d3bSMatthias Springer     return {};
320fa639d3bSMatthias Springer   }
321fa639d3bSMatthias Springer };
322fa639d3bSMatthias Springer 
3233798678bSMatthias Springer } // namespace
3243798678bSMatthias Springer } // namespace sparse_tensor
3253798678bSMatthias Springer } // namespace mlir
3263798678bSMatthias Springer 
registerBufferizableOpInterfaceExternalModels(DialectRegistry & registry)3273798678bSMatthias Springer void mlir::sparse_tensor::registerBufferizableOpInterfaceExternalModels(
3283798678bSMatthias Springer     DialectRegistry &registry) {
329fa639d3bSMatthias Springer   registry.addExtension(+[](MLIRContext *ctx,
330fa639d3bSMatthias Springer                             sparse_tensor::SparseTensorDialect *dialect) {
331fa639d3bSMatthias Springer     sparse_tensor::ConcatenateOp::attachInterface<ConcatenateOpInterface>(*ctx);
3323798678bSMatthias Springer     sparse_tensor::ConvertOp::attachInterface<ConvertOpInterface>(*ctx);
3333798678bSMatthias Springer     sparse_tensor::LoadOp::attachInterface<LoadOpInterface>(*ctx);
3343798678bSMatthias Springer     sparse_tensor::NewOp::attachInterface<NewOpInterface>(*ctx);
335fa639d3bSMatthias Springer     sparse_tensor::NumberOfEntriesOp::attachInterface<
336fa639d3bSMatthias Springer         NumberOfEntriesOpInterface>(*ctx);
3376ca47eb4SPeiming Liu     sparse_tensor::AssembleOp::attachInterface<AssembleOpInterface>(*ctx);
3386ca47eb4SPeiming Liu     sparse_tensor::DisassembleOp::attachInterface<DisassembleOpInterface>(*ctx);
339*6ed4d15cSMatthias Springer     sparse_tensor::ForeachOp::attachInterface<ForeachOpInterface>(*ctx);
34084cd51bbSwren romano     sparse_tensor::ToCoordinatesBufferOp::attachInterface<
34184cd51bbSwren romano         ToCoordinatesBufferOpInterface>(*ctx);
34284cd51bbSwren romano     sparse_tensor::ToCoordinatesOp::attachInterface<ToCoordinatesOpInterface>(
34384cd51bbSwren romano         *ctx);
34484cd51bbSwren romano     sparse_tensor::ToPositionsOp::attachInterface<ToPositionsOpInterface>(*ctx);
345fa639d3bSMatthias Springer     sparse_tensor::ToValuesOp::attachInterface<ToValuesOpInterface>(*ctx);
3463798678bSMatthias Springer   });
3473798678bSMatthias Springer }
348