26 namespace sparse_tensor {
29 template <
typename ConcreteModel,
typename ConcreteOp>
30 struct SparseBufferizableOpInterfaceExternalModel
31 :
public BufferizableOpInterface::ExternalModel<ConcreteModel, ConcreteOp> {
32 LogicalResult bufferize(Operation *op, RewriterBase &rewriter,
36 "sparse_tensor ops must be bufferized with the sparsifier");
40 struct ConcatenateOpInterface
41 : SparseBufferizableOpInterfaceExternalModel<ConcatenateOpInterface,
42 sparse_tensor::ConcatenateOp> {
43 bool bufferizesToAllocation(Operation *op, Value value)
const {
return true; }
45 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
50 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
60 bool isWritable(Operation *op, Value value,
66 struct ConvertOpInterface :
public SparseBufferizableOpInterfaceExternalModel<
67 ConvertOpInterface, sparse_tensor::ConvertOp> {
68 bool bufferizesToAllocation(Operation *op, Value value)
const {
74 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
79 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
89 bool isWritable(Operation *op, Value value,
95 struct LoadOpInterface
96 :
public SparseBufferizableOpInterfaceExternalModel<LoadOpInterface,
97 sparse_tensor::LoadOp> {
98 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
103 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
114 struct NewOpInterface
115 :
public SparseBufferizableOpInterfaceExternalModel<NewOpInterface,
116 sparse_tensor::NewOp> {
117 bool resultBufferizesToMemoryWrite(Operation *op, OpResult opResult,
123 bool bufferizesToAllocation(Operation *op, Value value)
const {
return true; }
126 struct AssembleOpInterface
127 :
public SparseBufferizableOpInterfaceExternalModel<
128 AssembleOpInterface, sparse_tensor::AssembleOp> {
129 bool bufferizesToAllocation(Operation *op, Value value)
const {
134 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
139 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
146 assert(op->getNumResults() == 1);
158 struct DisassembleOpInterface
159 :
public SparseBufferizableOpInterfaceExternalModel<
160 DisassembleOpInterface, sparse_tensor::DisassembleOp> {
161 bool bufferizesToAllocation(Operation *op, Value value)
const {
166 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
169 return opOperand.getOperandNumber() == 0;
172 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
175 assert(2 * (op->getNumOperands() - 1) == op->getNumResults());
176 return opOperand.getOperandNumber() > 0;
181 assert(2 * (op->getNumOperands() - 1) == op->getNumResults());
183 if (opOperand.getOperandNumber() == 0)
186 return {{op->getResult(opOperand.getOperandNumber() - 1),
191 struct ForeachOpInterface :
public SparseBufferizableOpInterfaceExternalModel<
192 ForeachOpInterface, sparse_tensor::ForeachOp> {
193 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
198 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
208 LogicalResult verifyAnalysis(Operation *op,
212 for (OpResult result : op->getResults()) {
213 if (isa<TensorType>(result.getType()))
214 return op->emitOpError(
"tensor results are not supported yet");
220 struct NumberOfEntriesOpInterface
221 :
public SparseBufferizableOpInterfaceExternalModel<
222 NumberOfEntriesOpInterface, sparse_tensor::NumberOfEntriesOp> {
223 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
228 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
239 struct ToCoordinatesBufferOpInterface
240 :
public SparseBufferizableOpInterfaceExternalModel<
241 ToCoordinatesBufferOpInterface,
242 sparse_tensor::ToCoordinatesBufferOp> {
243 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
248 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
261 struct ToCoordinatesOpInterface
262 :
public SparseBufferizableOpInterfaceExternalModel<
263 ToCoordinatesOpInterface, sparse_tensor::ToCoordinatesOp> {
264 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
269 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
282 struct ToPositionsOpInterface
283 :
public SparseBufferizableOpInterfaceExternalModel<
284 ToPositionsOpInterface, sparse_tensor::ToPositionsOp> {
285 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
290 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
303 struct ToValuesOpInterface
304 :
public SparseBufferizableOpInterfaceExternalModel<
305 ToValuesOpInterface, sparse_tensor::ToValuesOp> {
306 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
311 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
331 sparse_tensor::SparseTensorDialect *dialect) {
332 sparse_tensor::ConcatenateOp::attachInterface<ConcatenateOpInterface>(*ctx);
333 sparse_tensor::ConvertOp::attachInterface<ConvertOpInterface>(*ctx);
334 sparse_tensor::LoadOp::attachInterface<LoadOpInterface>(*ctx);
335 sparse_tensor::NewOp::attachInterface<NewOpInterface>(*ctx);
336 sparse_tensor::NumberOfEntriesOp::attachInterface<
337 NumberOfEntriesOpInterface>(*ctx);
338 sparse_tensor::AssembleOp::attachInterface<AssembleOpInterface>(*ctx);
339 sparse_tensor::DisassembleOp::attachInterface<DisassembleOpInterface>(*ctx);
340 sparse_tensor::ForeachOp::attachInterface<ForeachOpInterface>(*ctx);
341 sparse_tensor::ToCoordinatesBufferOp::attachInterface<
342 ToCoordinatesBufferOpInterface>(*ctx);
343 sparse_tensor::ToCoordinatesOp::attachInterface<ToCoordinatesOpInterface>(
345 sparse_tensor::ToPositionsOp::attachInterface<ToPositionsOpInterface>(*ctx);
346 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.