24 namespace sparse_tensor {
27 template <
typename ConcreteModel,
typename ConcreteOp>
28 struct SparseBufferizableOpInterfaceExternalModel
29 :
public BufferizableOpInterface::ExternalModel<ConcreteModel, ConcreteOp> {
30 LogicalResult bufferize(Operation *op, RewriterBase &rewriter,
34 "sparse_tensor ops must be bufferized with the sparsifier");
38 struct ConcatenateOpInterface
39 : SparseBufferizableOpInterfaceExternalModel<ConcatenateOpInterface,
40 sparse_tensor::ConcatenateOp> {
41 bool bufferizesToAllocation(Operation *op, Value value)
const {
return true; }
43 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
48 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
58 bool isWritable(Operation *op, Value value,
64 struct ConvertOpInterface :
public SparseBufferizableOpInterfaceExternalModel<
65 ConvertOpInterface, sparse_tensor::ConvertOp> {
66 bool bufferizesToAllocation(Operation *op, Value value)
const {
72 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
77 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
87 bool isWritable(Operation *op, Value value,
93 struct LoadOpInterface
94 :
public SparseBufferizableOpInterfaceExternalModel<LoadOpInterface,
95 sparse_tensor::LoadOp> {
96 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
101 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
112 struct NewOpInterface
113 :
public SparseBufferizableOpInterfaceExternalModel<NewOpInterface,
114 sparse_tensor::NewOp> {
115 bool resultBufferizesToMemoryWrite(Operation *op, OpResult opResult,
121 bool bufferizesToAllocation(Operation *op, Value value)
const {
return true; }
124 struct AssembleOpInterface
125 :
public SparseBufferizableOpInterfaceExternalModel<
126 AssembleOpInterface, sparse_tensor::AssembleOp> {
127 bool bufferizesToAllocation(Operation *op, Value value)
const {
132 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
137 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
144 assert(op->getNumResults() == 1);
156 struct DisassembleOpInterface
157 :
public SparseBufferizableOpInterfaceExternalModel<
158 DisassembleOpInterface, sparse_tensor::DisassembleOp> {
159 bool bufferizesToAllocation(Operation *op, Value value)
const {
164 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
167 return opOperand.getOperandNumber() == 0;
170 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
173 assert(2 * (op->getNumOperands() - 1) == op->getNumResults());
174 return opOperand.getOperandNumber() > 0;
179 assert(2 * (op->getNumOperands() - 1) == op->getNumResults());
181 if (opOperand.getOperandNumber() == 0)
184 return {{op->getResult(opOperand.getOperandNumber() - 1),
189 struct ForeachOpInterface :
public SparseBufferizableOpInterfaceExternalModel<
190 ForeachOpInterface, sparse_tensor::ForeachOp> {
191 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
196 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
206 LogicalResult verifyAnalysis(Operation *op,
210 for (OpResult result : op->getResults()) {
211 if (isa<TensorType>(result.getType()))
212 return op->emitOpError(
"tensor results are not supported yet");
218 struct NumberOfEntriesOpInterface
219 :
public SparseBufferizableOpInterfaceExternalModel<
220 NumberOfEntriesOpInterface, sparse_tensor::NumberOfEntriesOp> {
221 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
226 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
237 struct ToCoordinatesBufferOpInterface
238 :
public SparseBufferizableOpInterfaceExternalModel<
239 ToCoordinatesBufferOpInterface,
240 sparse_tensor::ToCoordinatesBufferOp> {
241 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
246 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
259 struct ToCoordinatesOpInterface
260 :
public SparseBufferizableOpInterfaceExternalModel<
261 ToCoordinatesOpInterface, sparse_tensor::ToCoordinatesOp> {
262 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
267 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
280 struct ToPositionsOpInterface
281 :
public SparseBufferizableOpInterfaceExternalModel<
282 ToPositionsOpInterface, sparse_tensor::ToPositionsOp> {
283 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
288 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
301 struct ToValuesOpInterface
302 :
public SparseBufferizableOpInterfaceExternalModel<
303 ToValuesOpInterface, sparse_tensor::ToValuesOp> {
304 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
309 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
329 sparse_tensor::SparseTensorDialect *dialect) {
330 sparse_tensor::ConcatenateOp::attachInterface<ConcatenateOpInterface>(*ctx);
331 sparse_tensor::ConvertOp::attachInterface<ConvertOpInterface>(*ctx);
332 sparse_tensor::LoadOp::attachInterface<LoadOpInterface>(*ctx);
333 sparse_tensor::NewOp::attachInterface<NewOpInterface>(*ctx);
334 sparse_tensor::NumberOfEntriesOp::attachInterface<
335 NumberOfEntriesOpInterface>(*ctx);
336 sparse_tensor::AssembleOp::attachInterface<AssembleOpInterface>(*ctx);
337 sparse_tensor::DisassembleOp::attachInterface<DisassembleOpInterface>(*ctx);
338 sparse_tensor::ForeachOp::attachInterface<ForeachOpInterface>(*ctx);
339 sparse_tensor::ToCoordinatesBufferOp::attachInterface<
340 ToCoordinatesBufferOpInterface>(*ctx);
341 sparse_tensor::ToCoordinatesOp::attachInterface<ToCoordinatesOpInterface>(
343 sparse_tensor::ToPositionsOp::attachInterface<ToPositionsOpInterface>(*ctx);
344 sparse_tensor::ToValuesOp::attachInterface<ToValuesOpInterface>(*ctx);
static llvm::ManagedStatic< PassManagerOptions > options
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
bool addExtension(TypeID extensionID, std::unique_ptr< DialectExtensionBase > extension)
Add the given extension to the registry.
MLIRContext is the top-level object for a collection of MLIR operations.
AnalysisState provides a variety of helper functions for dealing with tensor values.
BufferizationState provides information about the state of the IR during the bufferization process.
BufferRelation
Specifies a fine-grain relationship between buffers to enable more analysis.
void registerBufferizableOpInterfaceExternalModels(DialectRegistry ®istry)
Include the generated interface declarations.
Options for BufferizableOpInterface-based bufferization.