diff --git a/mlir/lib/Dialect/SparseTensor/Transforms/BufferizableOpInterfaceImpl.cpp b/mlir/lib/Dialect/SparseTensor/Transforms/BufferizableOpInterfaceImpl.cpp --- a/mlir/lib/Dialect/SparseTensor/Transforms/BufferizableOpInterfaceImpl.cpp +++ b/mlir/lib/Dialect/SparseTensor/Transforms/BufferizableOpInterfaceImpl.cpp @@ -94,6 +94,45 @@ } }; +struct InsertOpInterface + : public BufferizableOpInterface::ExternalModel { + bool bufferizesToAllocation(Operation *op, OpResult opResult) const { + // Does bufferization handle realloc? + return false; + } + + bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand, + const AnalysisState &state) const { + return false; + } + + bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand, + const AnalysisState &state) const { + // Insert write to memory. + return true; + } + + SmallVector getAliasingOpResult(Operation *op, OpOperand &opOperand, + const AnalysisState &state) const { + // InsertOp returns an alais of its operand. + assert(op->getNumResults() == 1); + return op->getResults(); + } + + BufferRelation bufferRelation(Operation *oo, OpResult opResult, + const AnalysisState &state) const { + // InsertOp returns the same object (realloc should not invalidate + // aliases). + return BufferRelation::Equivalent; + } + + bool isWritable(Operation *op, Value value, + const AnalysisState &state) const { + return true; + } +}; + } // namespace } // namespace sparse_tensor } // namespace mlir @@ -105,5 +144,6 @@ sparse_tensor::ConvertOp::attachInterface(*ctx); sparse_tensor::LoadOp::attachInterface(*ctx); sparse_tensor::NewOp::attachInterface(*ctx); + sparse_tensor::InsertOp::attachInterface(*ctx); }); }