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 ®istry) {
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