From ed8c63115ed7bdb31812a7a02dc8480def0a1ea4 Mon Sep 17 00:00:00 2001 From: Matthias Springer Date: Fri, 3 Dec 2021 22:24:49 +0900 Subject: [PATCH] [mlir][linalg][bufferize][NFC] Provide default implementation of getAliasingOpOperand This simplifies op interface implementations. Differential Revision: https://reviews.llvm.org/D115025 --- .../ComprehensiveBufferize/BufferizableOpInterface.td | 18 ++++++++++++++++-- .../ComprehensiveBufferize/ArithInterfaceImpl.cpp | 5 ----- .../BufferizationInterfaceImpl.cpp | 10 ---------- .../ComprehensiveBufferize/LinalgInterfaceImpl.cpp | 14 -------------- .../ComprehensiveBufferize/ModuleBufferization.cpp | 6 ------ .../Linalg/ComprehensiveBufferize/SCFInterfaceImpl.cpp | 6 ------ .../ComprehensiveBufferize/TensorInterfaceImpl.cpp | 15 --------------- .../ComprehensiveBufferize/VectorInterfaceImpl.cpp | 5 ----- 8 files changed, 16 insertions(+), 63 deletions(-) diff --git a/mlir/include/mlir/Dialect/Linalg/ComprehensiveBufferize/BufferizableOpInterface.td b/mlir/include/mlir/Dialect/Linalg/ComprehensiveBufferize/BufferizableOpInterface.td index 7d845da..d792a76 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() && + "expected OpResult with tensor type"); + SmallVector result; + auto bufferizableOp = + cast($_op.getOperation()); + for (OpOperand &opOperand : $_op.getOperation()->getOpOperands()) { + if (!opOperand.get().getType().isa()) + 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 ec69832..8fb8f91 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 { - SmallVector getAliasingOpOperand(Operation *op, - OpResult opResult) const { - return {}; - } - LogicalResult bufferize(Operation *op, OpBuilder &b, BufferizationState &state) const { auto constantOp = cast(op); diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/BufferizationInterfaceImpl.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/BufferizationInterfaceImpl.cpp index c8a2649..6c04287 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 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 { - SmallVector getAliasingOpOperand(Operation *op, - OpResult opResult) const { - return {}; - } - LogicalResult bufferize(Operation *op, OpBuilder &b, BufferizationState &state) const { auto tensorLoadOp = cast(op); diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/LinalgInterfaceImpl.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/LinalgInterfaceImpl.cpp index b4a439e..5f62c97 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 { - SmallVector 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(bufferizableOp.getAliasingOpResult(opOperand)); } - SmallVector getAliasingOpOperand(Operation *op, - OpResult opResult) const { - // TODO: TiledLoopOp helper method to avoid leaking impl details. - auto tiledLoopOp = cast(op); - return {&op->getOpOperand(tiledLoopOp.getNumControlOperands() + - tiledLoopOp.getNumInputs() + - opResult.getResultNumber())}; - } - OpResult getAliasingOpResult(Operation *op, OpOperand &opOperand) const { auto tiledLoopOp = cast(op); return tiledLoopOp.getTiedOpResult(opOperand); diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp index d24e7e8..94b14bc 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 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 2b2ccb3..8632c65 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 getAliasingOpOperand(Operation *op, - OpResult opResult) const { - auto forOp = cast(op); - return {&forOp.getIterOpOperands()[opResult.getResultNumber()]}; - } - OpResult getAliasingOpResult(Operation *op, OpOperand &opOperand) const { auto forOp = cast(op); if (!opOperand.get().getType().isa()) diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/TensorInterfaceImpl.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/TensorInterfaceImpl.cpp index efc292f..d944d81 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 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 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 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 a8736bd..d582b88 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 getAliasingOpOperand(Operation *op, - OpResult opResult) const { - return {&op->getOpOperand(1)}; - } - OpResult getAliasingOpResult(Operation *op, OpOperand &opOperand) const { assert(opOperand.get().getType().isa() && "only tensor types expected"); -- 2.7.4