[Mlir-commits] [mlir] ed8c631 - [mlir][linalg][bufferize][NFC] Provide default implementation of getAliasingOpOperand
Matthias Springer
llvmlistbot at llvm.org
Fri Dec 3 05:36:34 PST 2021
Author: Matthias Springer
Date: 2021-12-03T22:36:22+09:00
New Revision: ed8c63115ed7bdb31812a7a02dc8480def0a1ea4
URL: https://github.com/llvm/llvm-project/commit/ed8c63115ed7bdb31812a7a02dc8480def0a1ea4
DIFF: https://github.com/llvm/llvm-project/commit/ed8c63115ed7bdb31812a7a02dc8480def0a1ea4.diff
LOG: [mlir][linalg][bufferize][NFC] Provide default implementation of getAliasingOpOperand
This simplifies op interface implementations.
Differential Revision: https://reviews.llvm.org/D115025
Added:
Modified:
mlir/include/mlir/Dialect/Linalg/ComprehensiveBufferize/BufferizableOpInterface.td
mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ArithInterfaceImpl.cpp
mlir/lib/Dialect/Linalg/ComprehensiveBufferize/BufferizationInterfaceImpl.cpp
mlir/lib/Dialect/Linalg/ComprehensiveBufferize/LinalgInterfaceImpl.cpp
mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp
mlir/lib/Dialect/Linalg/ComprehensiveBufferize/SCFInterfaceImpl.cpp
mlir/lib/Dialect/Linalg/ComprehensiveBufferize/TensorInterfaceImpl.cpp
mlir/lib/Dialect/Linalg/ComprehensiveBufferize/VectorInterfaceImpl.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/Linalg/ComprehensiveBufferize/BufferizableOpInterface.td b/mlir/include/mlir/Dialect/Linalg/ComprehensiveBufferize/BufferizableOpInterface.td
index 7d845da3ce53e..d792a768b1e9c 100644
--- a/mlir/include/mlir/Dialect/Linalg/ComprehensiveBufferize/BufferizableOpInterface.td
+++ b/mlir/include/mlir/Dialect/Linalg/ComprehensiveBufferize/BufferizableOpInterface.td
@@ -138,6 +138,10 @@ def BufferizableOpInterface : OpInterface<"BufferizableOpInterface"> {
bufferized in-place. This method will never be called on OpResults
that do not have a tensor type.
+ By default, this method is the inverse of `getAliasingOpResult`. Ops
+ with a region that yield values may want to override this method to
+ return the OpOperands that are yielded by the terminator.
+
Note: This method can return multiple OpOperands, indicating that the
given OpResult may at runtime alias with any of the OpOperands. This
is useful for branches and for ops such as `std.select`.
@@ -147,8 +151,18 @@ def BufferizableOpInterface : OpInterface<"BufferizableOpInterface"> {
/*args=*/(ins "OpResult":$opResult),
/*methodBody=*/"",
/*defaultImplementation=*/[{
- // Does not have to be implemented for ops without tensor OpResults.
- llvm_unreachable("getInplaceableOpResult not implemented");
+ assert(opResult.getType().isa<TensorType>() &&
+ "expected OpResult with tensor type");
+ SmallVector<OpOperand *> result;
+ auto bufferizableOp =
+ cast<BufferizableOpInterface>($_op.getOperation());
+ for (OpOperand &opOperand : $_op.getOperation()->getOpOperands()) {
+ if (!opOperand.get().getType().isa<TensorType>())
+ continue;
+ if (bufferizableOp.getAliasingOpResult(opOperand) == opResult)
+ result.push_back(&opOperand);
+ }
+ return result;
}]
>,
InterfaceMethod<
diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ArithInterfaceImpl.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ArithInterfaceImpl.cpp
index ec69832bcf0dd..8fb8f919c5ea6 100644
--- a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ArithInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ArithInterfaceImpl.cpp
@@ -23,11 +23,6 @@ namespace arith_ext {
struct ConstantOpInterface
: public BufferizableOpInterface::ExternalModel<ConstantOpInterface,
arith::ConstantOp> {
- SmallVector<OpOperand *> getAliasingOpOperand(Operation *op,
- OpResult opResult) const {
- return {};
- }
-
LogicalResult bufferize(Operation *op, OpBuilder &b,
BufferizationState &state) const {
auto constantOp = cast<arith::ConstantOp>(op);
diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/BufferizationInterfaceImpl.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/BufferizationInterfaceImpl.cpp
index c8a2649842402..6c0428752fbad 100644
--- a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/BufferizationInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/BufferizationInterfaceImpl.cpp
@@ -41,11 +41,6 @@ struct ToMemrefOpInterface
return true;
}
- SmallVector<OpOperand *> getAliasingOpOperand(Operation *op,
- OpResult opResult) const {
- return {};
- }
-
OpResult getAliasingOpResult(Operation *op, OpOperand &opOperand) const {
return OpResult();
}
@@ -69,11 +64,6 @@ struct ToMemrefOpInterface
struct ToTensorOpInterface
: public BufferizableOpInterface::ExternalModel<ToTensorOpInterface,
bufferization::ToTensorOp> {
- SmallVector<OpOperand *> getAliasingOpOperand(Operation *op,
- OpResult opResult) const {
- return {};
- }
-
LogicalResult bufferize(Operation *op, OpBuilder &b,
BufferizationState &state) const {
auto tensorLoadOp = cast<bufferization::ToTensorOp>(op);
diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/LinalgInterfaceImpl.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/LinalgInterfaceImpl.cpp
index b4a439ec5ad3a..5f62c97ff2651 100644
--- a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/LinalgInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/LinalgInterfaceImpl.cpp
@@ -145,11 +145,6 @@ struct LinalgOpInterface
struct InitTensorOpInterface
: public BufferizableOpInterface::ExternalModel<InitTensorOpInterface,
linalg::InitTensorOp> {
- SmallVector<OpOperand *> getAliasingOpOperand(Operation *op,
- OpResult opResult) const {
- return {};
- }
-
bool isMemoryWrite(Operation *op, OpResult opResult) const {
// InitTensorOps allocate but do not write.
return false;
@@ -191,15 +186,6 @@ struct TiledLoopOpInterface
return static_cast<bool>(bufferizableOp.getAliasingOpResult(opOperand));
}
- SmallVector<OpOperand *> getAliasingOpOperand(Operation *op,
- OpResult opResult) const {
- // TODO: TiledLoopOp helper method to avoid leaking impl details.
- auto tiledLoopOp = cast<linalg::TiledLoopOp>(op);
- return {&op->getOpOperand(tiledLoopOp.getNumControlOperands() +
- tiledLoopOp.getNumInputs() +
- opResult.getResultNumber())};
- }
-
OpResult getAliasingOpResult(Operation *op, OpOperand &opOperand) const {
auto tiledLoopOp = cast<linalg::TiledLoopOp>(op);
return tiledLoopOp.getTiedOpResult(opOperand);
diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp
index d24e7e8b121ce..94b14bc5622e0 100644
--- a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp
+++ b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp
@@ -447,12 +447,6 @@ struct CallOpInterface
return true;
}
- SmallVector<OpOperand *> getAliasingOpOperand(Operation *op,
- OpResult opResult) const {
- // TODO: Can we do better?
- return {};
- }
-
OpResult getAliasingOpResult(Operation *op, OpOperand &opOperand) const {
// CallOpInterface is special, it needs to wait for the callee to be
// bufferized and needs to inspect the BufferAliasInfo object. It can't
diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/SCFInterfaceImpl.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/SCFInterfaceImpl.cpp
index 2b2ccb3c4bb9a..8632c65ca7c66 100644
--- a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/SCFInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/SCFInterfaceImpl.cpp
@@ -167,12 +167,6 @@ struct ForOpInterface
return true;
}
- SmallVector<OpOperand *> getAliasingOpOperand(Operation *op,
- OpResult opResult) const {
- auto forOp = cast<scf::ForOp>(op);
- return {&forOp.getIterOpOperands()[opResult.getResultNumber()]};
- }
-
OpResult getAliasingOpResult(Operation *op, OpOperand &opOperand) const {
auto forOp = cast<scf::ForOp>(op);
if (!opOperand.get().getType().isa<RankedTensorType>())
diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/TensorInterfaceImpl.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/TensorInterfaceImpl.cpp
index efc292f402657..d944d81267dc8 100644
--- a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/TensorInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/TensorInterfaceImpl.cpp
@@ -48,11 +48,6 @@ struct CastOpInterface
return false;
}
- SmallVector<OpOperand *> getAliasingOpOperand(Operation *op,
- OpResult opResult) const {
- return {&op->getOpOperand(0)};
- }
-
OpResult getAliasingOpResult(Operation *op, OpOperand &opOperand) const {
return op->getResult(0);
}
@@ -137,11 +132,6 @@ struct ExtractSliceOpInterface
return false;
}
- SmallVector<OpOperand *> getAliasingOpOperand(Operation *op,
- OpResult opResult) const {
- return {&op->getOpOperand(0) /*source*/};
- }
-
OpResult getAliasingOpResult(Operation *op, OpOperand &opOperand) const {
return &opOperand == &op->getOpOperand(0) /*source*/
? op->getResult(0)
@@ -335,11 +325,6 @@ struct InsertSliceOpInterface
return &opOperand == &op->getOpOperand(1) /*dest*/;
}
- SmallVector<OpOperand *> getAliasingOpOperand(Operation *op,
- OpResult opResult) const {
- return {&op->getOpOperand(1) /*dest*/};
- }
-
OpResult getAliasingOpResult(Operation *op, OpOperand &opOperand) const {
return &opOperand == &op->getOpOperand(1) /*dest*/
? op->getResult(0)
diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/VectorInterfaceImpl.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/VectorInterfaceImpl.cpp
index a8736bd3ca1c2..d582b88f1eb0a 100644
--- a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/VectorInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/VectorInterfaceImpl.cpp
@@ -68,11 +68,6 @@ struct TransferWriteOpInterface
return true;
}
- SmallVector<OpOperand *> getAliasingOpOperand(Operation *op,
- OpResult opResult) const {
- return {&op->getOpOperand(1)};
- }
-
OpResult getAliasingOpResult(Operation *op, OpOperand &opOperand) const {
assert(opOperand.get().getType().isa<TensorType>() &&
"only tensor types expected");
More information about the Mlir-commits
mailing list