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 bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
116 const AnalysisState &state)
const {
121 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
122 const AnalysisState &state)
const {
127 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
128 const AnalysisState &state)
const {
133 bool resultBufferizesToMemoryWrite(Operation *op, OpResult opResult,
134 const AnalysisState &state)
const {
139 bool bufferizesToAllocation(Operation *op, Value value)
const {
return true; }
142struct AssembleOpInterface
143 :
public SparseBufferizableOpInterfaceExternalModel<
144 AssembleOpInterface, sparse_tensor::AssembleOp> {
145 bool bufferizesToAllocation(Operation *op, Value value)
const {
150 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
151 const AnalysisState &state)
const {
155 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
156 const AnalysisState &state)
const {
160 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
161 const AnalysisState &state)
const {
165 return {{op->
getOpResult(0), BufferRelation::Equivalent}};
168 BufferRelation bufferRelation(Operation *oo, OpResult opResult,
169 const AnalysisState &state)
const {
170 return BufferRelation::Unknown;
174struct DisassembleOpInterface
175 :
public SparseBufferizableOpInterfaceExternalModel<
176 DisassembleOpInterface, sparse_tensor::DisassembleOp> {
177 bool bufferizesToAllocation(Operation *op, Value value)
const {
182 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
183 const AnalysisState &state)
const {
188 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
189 const AnalysisState &state)
const {
195 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
196 const AnalysisState &state)
const {
203 BufferRelation::Equivalent}};
207struct ForeachOpInterface :
public SparseBufferizableOpInterfaceExternalModel<
208 ForeachOpInterface, sparse_tensor::ForeachOp> {
209 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
210 const AnalysisState &state)
const {
214 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
215 const AnalysisState &state)
const {
219 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
220 const AnalysisState &state)
const {
224 LogicalResult verifyAnalysis(Operation *op,
225 const AnalysisState &state)
const {
229 if (isa<TensorType>(
result.getType()))
230 return op->
emitOpError(
"tensor results are not supported yet");
236struct NumberOfEntriesOpInterface
237 :
public SparseBufferizableOpInterfaceExternalModel<
238 NumberOfEntriesOpInterface, sparse_tensor::NumberOfEntriesOp> {
239 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
240 const AnalysisState &state)
const {
244 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
245 const AnalysisState &state)
const {
249 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
250 const AnalysisState &state)
const {
255struct ToCoordinatesBufferOpInterface
256 :
public SparseBufferizableOpInterfaceExternalModel<
257 ToCoordinatesBufferOpInterface,
258 sparse_tensor::ToCoordinatesBufferOp> {
259 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
260 const AnalysisState &state)
const {
264 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
265 const AnalysisState &state)
const {
271 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
272 const AnalysisState &state)
const {
277struct ToCoordinatesOpInterface
278 :
public SparseBufferizableOpInterfaceExternalModel<
279 ToCoordinatesOpInterface, sparse_tensor::ToCoordinatesOp> {
280 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
281 const AnalysisState &state)
const {
285 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
286 const AnalysisState &state)
const {
292 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
293 const AnalysisState &state)
const {
298struct ToPositionsOpInterface
299 :
public SparseBufferizableOpInterfaceExternalModel<
300 ToPositionsOpInterface, sparse_tensor::ToPositionsOp> {
301 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
302 const AnalysisState &state)
const {
306 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
307 const AnalysisState &state)
const {
313 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
314 const AnalysisState &state)
const {
319struct ToValuesOpInterface
320 :
public SparseBufferizableOpInterfaceExternalModel<
321 ToValuesOpInterface, sparse_tensor::ToValuesOp> {
322 bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
323 const AnalysisState &state)
const {
327 bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
328 const AnalysisState &state)
const {
334 AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
335 const AnalysisState &state)
const {
347 sparse_tensor::SparseTensorDialect *dialect) {
348 sparse_tensor::ConcatenateOp::attachInterface<ConcatenateOpInterface>(*ctx);
349 sparse_tensor::ConvertOp::attachInterface<ConvertOpInterface>(*ctx);
350 sparse_tensor::LoadOp::attachInterface<LoadOpInterface>(*ctx);
351 sparse_tensor::NewOp::attachInterface<NewOpInterface>(*ctx);
352 sparse_tensor::NumberOfEntriesOp::attachInterface<
353 NumberOfEntriesOpInterface>(*ctx);
354 sparse_tensor::AssembleOp::attachInterface<AssembleOpInterface>(*ctx);
355 sparse_tensor::DisassembleOp::attachInterface<DisassembleOpInterface>(*ctx);
356 sparse_tensor::ForeachOp::attachInterface<ForeachOpInterface>(*ctx);
357 sparse_tensor::ToCoordinatesBufferOp::attachInterface<
358 ToCoordinatesBufferOpInterface>(*ctx);
359 sparse_tensor::ToCoordinatesOp::attachInterface<ToCoordinatesOpInterface>(
361 sparse_tensor::ToPositionsOp::attachInterface<ToPositionsOpInterface>(*ctx);
362 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.