[Mlir-commits] [mlir] [mlir][sparse_tensor] Implement bufferization interface for `foreach` (PR #85183)
Matthias Springer
llvmlistbot at llvm.org
Wed Mar 13 22:43:30 PDT 2024
https://github.com/matthias-springer created https://github.com/llvm/llvm-project/pull/85183
This commit fixes a memory leak in `sparse_codegen_foreach.mlir`. The bufferization inserted a copy for the operand of `sparse_tensor.foreach` because it conservatively assumed that the op writes to the operand.
>From 22d6b76630f147fa9d87a8e6f1d74fa91a7a7b65 Mon Sep 17 00:00:00 2001
From: Matthias Springer <springerm at google.com>
Date: Thu, 14 Mar 2024 05:40:11 +0000
Subject: [PATCH] [mlir][sparse_tensor] Implement bufferization interface for
`foreach`
This commit fixes a memory leak in `sparse_codegen_foreach.mlir`. The
bufferization inserted a copy for the operand of
`sparse_tensor.foreach` because it conservatively assumed that the op
writes to the operand.
---
.../BufferizableOpInterfaceImpl.cpp | 30 +++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/mlir/lib/Dialect/SparseTensor/Transforms/BufferizableOpInterfaceImpl.cpp b/mlir/lib/Dialect/SparseTensor/Transforms/BufferizableOpInterfaceImpl.cpp
index a942a721e218fe..7734d1d258453c 100644
--- a/mlir/lib/Dialect/SparseTensor/Transforms/BufferizableOpInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/SparseTensor/Transforms/BufferizableOpInterfaceImpl.cpp
@@ -187,6 +187,35 @@ struct DisassembleOpInterface
}
};
+struct ForeachOpInterface : public SparseBufferizableOpInterfaceExternalModel<
+ ForeachOpInterface, sparse_tensor::ForeachOp> {
+ bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
+ const AnalysisState &state) const {
+ return true;
+ }
+
+ bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
+ const AnalysisState &state) const {
+ return false;
+ }
+
+ AliasingValueList getAliasingValues(Operation *op, OpOperand &opOperand,
+ const AnalysisState &state) const {
+ return {};
+ }
+
+ LogicalResult verifyAnalysis(Operation *op,
+ const AnalysisState &state) const {
+ // A more complex analysis (similar to scf.for) is needed if the op returns
+ // a tensor. That tensor would have to be bufferized (not implemented yet).
+ for (OpResult result : op->getResults()) {
+ if (isa<TensorType>(result.getType()))
+ return op->emitOpError("tensor results are not supported yet");
+ }
+ return success();
+ }
+};
+
struct NumberOfEntriesOpInterface
: public SparseBufferizableOpInterfaceExternalModel<
NumberOfEntriesOpInterface, sparse_tensor::NumberOfEntriesOp> {
@@ -307,6 +336,7 @@ void mlir::sparse_tensor::registerBufferizableOpInterfaceExternalModels(
NumberOfEntriesOpInterface>(*ctx);
sparse_tensor::AssembleOp::attachInterface<AssembleOpInterface>(*ctx);
sparse_tensor::DisassembleOp::attachInterface<DisassembleOpInterface>(*ctx);
+ sparse_tensor::ForeachOp::attachInterface<ForeachOpInterface>(*ctx);
sparse_tensor::ToCoordinatesBufferOp::attachInterface<
ToCoordinatesBufferOpInterface>(*ctx);
sparse_tensor::ToCoordinatesOp::attachInterface<ToCoordinatesOpInterface>(
More information about the Mlir-commits
mailing list