diff options
author | Nicolas Vasilache <ntv@google.com> | 2020-06-05 06:35:46 -0400 |
---|---|---|
committer | Nicolas Vasilache <ntv@google.com> | 2020-06-05 06:50:24 -0400 |
commit | 6953cf65024395508c464dc78c90b158b3241a3a (patch) | |
tree | 6c6a9aefb9c1e5f48ec73653a243d9ec846fab11 /mlir/lib/Transforms/LoopInvariantCodeMotion.cpp | |
parent | 9bfdf1180744f3fe8fe716fa77eacec1c56f0755 (diff) | |
download | llvm-6953cf65024395508c464dc78c90b158b3241a3a.zip llvm-6953cf65024395508c464dc78c90b158b3241a3a.tar.gz llvm-6953cf65024395508c464dc78c90b158b3241a3a.tar.bz2 |
[mlir][Linalg] Add a hoistRedundantVectorTransfers helper function
This revision adds a helper function to hoist vector.transfer_read /
vector.transfer_write pairs out of immediately enclosing scf::ForOp
iteratively, if the following conditions are true:
1. The 2 ops access the same memref with the same indices.
2. All operands are invariant under the enclosing scf::ForOp.
3. No uses of the memref either dominate the transfer_read or are
dominated by the transfer_write (i.e. no aliasing between the write and
the read across the loop)
To improve hoisting opportunities, call the `moveLoopInvariantCode` helper
function on the candidate loop above which to hoist. Hoisting the transfers
results in scf::ForOp yielding the value that originally transited through
memory.
This revision additionally exposes `moveLoopInvariantCode` as a helper in
LoopUtils.h and updates SliceAnalysis to support return scf::For values and
allow hoisting across multiple scf::ForOps.
Differential Revision: https://reviews.llvm.org/D81199
Diffstat (limited to 'mlir/lib/Transforms/LoopInvariantCodeMotion.cpp')
-rw-r--r-- | mlir/lib/Transforms/LoopInvariantCodeMotion.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/mlir/lib/Transforms/LoopInvariantCodeMotion.cpp b/mlir/lib/Transforms/LoopInvariantCodeMotion.cpp index 5fee7d62..0a78cb4 100644 --- a/mlir/lib/Transforms/LoopInvariantCodeMotion.cpp +++ b/mlir/lib/Transforms/LoopInvariantCodeMotion.cpp @@ -17,6 +17,7 @@ #include "mlir/IR/Function.h" #include "mlir/Interfaces/LoopLikeInterface.h" #include "mlir/Interfaces/SideEffectInterfaces.h" +#include "mlir/Transforms/LoopUtils.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" @@ -73,7 +74,7 @@ static bool canBeHoisted(Operation *op, return true; } -static LogicalResult moveLoopInvariantCode(LoopLikeOpInterface looplike) { +LogicalResult mlir::moveLoopInvariantCode(LoopLikeOpInterface looplike) { auto &loopBody = looplike.getLoopBody(); // We use two collections here as we need to preserve the order for insertion |