27template <
typename ConcreteModel,
typename ConcreteOp>
28struct SparseBufferizableOpInterfaceExternalModel
29 :
public BufferizableOpInterface::ExternalModel<ConcreteModel, ConcreteOp> {
30 LogicalResult bufferize(Operation *op, RewriterBase &rewriter,
31 const BufferizationOptions &
options,
32 BufferizationState &state)
const {
34 "sparse_tensor ops must be bufferized with the sparsifier");
38struct 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,
44 const AnalysisState &state)
const {
48 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
49 const AnalysisState &state)
const {
53 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
54 const AnalysisState &state)
const {
58 bool isWritable(Operation *op, Value value,
59 const AnalysisState &state)
const {
64struct ConvertOpInterface :
public SparseBufferizableOpInterfaceExternalModel<
65 ConvertOpInterface, sparse_tensor::ConvertOp> {
66 bool bufferizesToAllocation(Operation *op, Value value)
const {
72 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
73 const AnalysisState &state)
const {
77 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
78 const AnalysisState &state)
const {
82 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
83 const AnalysisState &state)
const {
87 bool isWritable(Operation *op, Value value,
88 const AnalysisState &state)
const {
94 :
public SparseBufferizableOpInterfaceExternalModel<LoadOpInterface,
95 sparse_tensor::LoadOp> {
96 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
97 const AnalysisState &state)
const {
101 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
102 const AnalysisState &state)
const {
106 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
107 const AnalysisState &state)
const {
108 return {{op->
getOpResult(0), BufferRelation::Equivalent}};
113 :
public SparseBufferizableOpInterfaceExternalModel<NewOpInterface,
114 sparse_tensor::NewOp> {
115 bool resultBufferizesToMemoryWrite(Operation *op, OpResult opResult,
116 const AnalysisState &state)
const {
121 bool bufferizesToAllocation(Operation *op, Value value)
const {
return true; }
124struct AssembleOpInterface
125 :
public SparseBufferizableOpInterfaceExternalModel<
126 AssembleOpInterface, sparse_tensor::AssembleOp> {
127 bool bufferizesToAllocation(Operation *op, Value value)
const {
132 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
133 const AnalysisState &state)
const {
137 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
138 const AnalysisState &state)
const {
142 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
143 const AnalysisState &state)
const {
147 return {{op->
getOpResult(0), BufferRelation::Equivalent}};
150 BufferRelation bufferRelation(Operation *oo, OpResult opResult,
151 const AnalysisState &state)
const {
152 return BufferRelation::Unknown;
156struct DisassembleOpInterface
157 :
public SparseBufferizableOpInterfaceExternalModel<
158 DisassembleOpInterface, sparse_tensor::DisassembleOp> {
159 bool bufferizesToAllocation(Operation *op, Value value)
const {
164 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
165 const AnalysisState &state)
const {
170 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
171 const AnalysisState &state)
const {
177 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
178 const AnalysisState &state)
const {
185 BufferRelation::Equivalent}};
189struct ForeachOpInterface :
public SparseBufferizableOpInterfaceExternalModel<
190 ForeachOpInterface, sparse_tensor::ForeachOp> {
191 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
192 const AnalysisState &state)
const {
196 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
197 const AnalysisState &state)
const {
201 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
202 const AnalysisState &state)
const {
206 LogicalResult verifyAnalysis(Operation *op,
207 const AnalysisState &state)
const {
211 if (isa<TensorType>(
result.getType()))
212 return op->
emitOpError(
"tensor results are not supported yet");
218struct NumberOfEntriesOpInterface
219 :
public SparseBufferizableOpInterfaceExternalModel<
220 NumberOfEntriesOpInterface, sparse_tensor::NumberOfEntriesOp> {
221 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
222 const AnalysisState &state)
const {
226 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
227 const AnalysisState &state)
const {
231 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
232 const AnalysisState &state)
const {
237struct ToCoordinatesBufferOpInterface
238 :
public SparseBufferizableOpInterfaceExternalModel<
239 ToCoordinatesBufferOpInterface,
240 sparse_tensor::ToCoordinatesBufferOp> {
241 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
242 const AnalysisState &state)
const {
246 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
247 const AnalysisState &state)
const {
253 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
254 const AnalysisState &state)
const {
259struct ToCoordinatesOpInterface
260 :
public SparseBufferizableOpInterfaceExternalModel<
261 ToCoordinatesOpInterface, sparse_tensor::ToCoordinatesOp> {
262 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
263 const AnalysisState &state)
const {
267 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
268 const AnalysisState &state)
const {
274 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
275 const AnalysisState &state)
const {
280struct ToPositionsOpInterface
281 :
public SparseBufferizableOpInterfaceExternalModel<
282 ToPositionsOpInterface, sparse_tensor::ToPositionsOp> {
283 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
284 const AnalysisState &state)
const {
288 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
289 const AnalysisState &state)
const {
295 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
296 const AnalysisState &state)
const {
301struct ToValuesOpInterface
302 :
public SparseBufferizableOpInterfaceExternalModel<
303 ToValuesOpInterface, sparse_tensor::ToValuesOp> {
304 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
305 const AnalysisState &state)
const {
309 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
310 const AnalysisState &state)
const {
316 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
317 const AnalysisState &state)
const {
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.
unsigned getOperandNumber()
Return which operand this is in the OpOperand list of the Operation.
OpResult getOpResult(unsigned idx)
OpResult getResult(unsigned idx)
Get the 'idx'th result of this operation.
unsigned getNumOperands()
InFlightDiagnostic emitError(const Twine &message={})
Emit an error about fatal conditions with this operation, reporting up to any diagnostic handlers tha...
result_range getResults()
InFlightDiagnostic emitOpError(const Twine &message={})
Emit an error with the op name prefixed, like "'dim' op " which is convenient for verifiers.
unsigned getNumResults()
Return the number of results held by this operation.
void registerBufferizableOpInterfaceExternalModels(DialectRegistry ®istry)
Include the generated interface declarations.