diff options
| author | Quinn Dawkins <quinn.dawkins@gmail.com> | 2024-10-02 00:20:44 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-02 00:20:44 -0400 |
| commit | 4e2efea5e8e55b26dd7ac90c6cd1ab7bf6775650 (patch) | |
| tree | 91a1742623f610c6fe01888c56f281af8045cb7d /mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp | |
| parent | 9cd5e5c270604a3fa7bf2d1878d9c318c8bd0e5d (diff) | |
[mlir][vector] Add all view-like ops to transfer flow opt (#110521)
`vector.transfer_*` folding and forwarding currently does not take into
account reshaping view-like memref ops (expand and collapse shape),
leading to potentially invalid store folding or value forwarding. This
patch adds tracking for those (and other) view-like ops. It is still
possible to design operations that alias memrefs without being a view
(e.g. memref in the iter_args of an `scf.for`), so these patterns may
still need revisiting in the future.
Diffstat (limited to 'mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp')
| -rw-r--r-- | mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp b/mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp index 4c93d3841bf8..e05c801121ff 100644 --- a/mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp +++ b/mlir/lib/Dialect/Vector/Transforms/VectorTransferOpTransforms.cpp @@ -105,8 +105,7 @@ void TransferOptimization::deadStoreOp(vector::TransferWriteOp write) { << "\n"); llvm::SmallVector<Operation *, 8> blockingAccesses; Operation *firstOverwriteCandidate = nullptr; - Value source = - memref::skipSubViewsAndCasts(cast<MemrefValue>(write.getSource())); + Value source = memref::skipViewLikeOps(cast<MemrefValue>(write.getSource())); llvm::SmallVector<Operation *, 32> users(source.getUsers().begin(), source.getUsers().end()); llvm::SmallDenseSet<Operation *, 32> processed; @@ -115,7 +114,7 @@ void TransferOptimization::deadStoreOp(vector::TransferWriteOp write) { // If the user has already been processed skip. if (!processed.insert(user).second) continue; - if (isa<memref::SubViewOp, memref::CastOp>(user)) { + if (isa<ViewLikeOpInterface>(user)) { users.append(user->getUsers().begin(), user->getUsers().end()); continue; } @@ -192,8 +191,7 @@ void TransferOptimization::storeToLoadForwarding(vector::TransferReadOp read) { << "\n"); SmallVector<Operation *, 8> blockingWrites; vector::TransferWriteOp lastwrite = nullptr; - Value source = - memref::skipSubViewsAndCasts(cast<MemrefValue>(read.getSource())); + Value source = memref::skipViewLikeOps(cast<MemrefValue>(read.getSource())); llvm::SmallVector<Operation *, 32> users(source.getUsers().begin(), source.getUsers().end()); llvm::SmallDenseSet<Operation *, 32> processed; @@ -202,7 +200,7 @@ void TransferOptimization::storeToLoadForwarding(vector::TransferReadOp read) { // If the user has already been processed skip. if (!processed.insert(user).second) continue; - if (isa<memref::SubViewOp, memref::CollapseShapeOp, memref::CastOp>(user)) { + if (isa<ViewLikeOpInterface>(user)) { users.append(user->getUsers().begin(), user->getUsers().end()); continue; } |
