[Mlir-commits] [mlir] e753bc8 - [mlir][Affine] Move/expose hasNoInterveningEffect
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Sep 29 09:10:46 PDT 2022
Author: Maksim Levental
Date: 2022-09-29T11:10:17-05:00
New Revision: e753bc87458eb950e2a51200bb4dcc16cc775d82
URL: https://github.com/llvm/llvm-project/commit/e753bc87458eb950e2a51200bb4dcc16cc775d82
DIFF: https://github.com/llvm/llvm-project/commit/e753bc87458eb950e2a51200bb4dcc16cc775d82.diff
LOG: [mlir][Affine] Move/expose hasNoInterveningEffect
Expose [[ https://github.com/llvm/llvm-project/blob/main/mlir/lib/Dialect/Affine/Utils/Utils.cpp#L661 | Dialect/Affine/Utils/Utils.cpp#hasNoInterveningEffect ]] for downstream use (particular use case is a lazy implementation of [[ https://github.com/llvm/llvm-project/blob/main/mlir/lib/Dialect/Affine/Utils/Utils.cpp#L845 | forwardStoreToLoad ]] in CIRCT). This exposes hasNoInterveningEffect and instantiates for the necessary types.
Reviewed By: bondhugula
Differential Revision: https://reviews.llvm.org/D134374
Added:
Modified:
mlir/include/mlir/Dialect/Affine/Utils.h
mlir/lib/Dialect/Affine/Utils/Utils.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/Affine/Utils.h b/mlir/include/mlir/Dialect/Affine/Utils.h
index 006c61ced2125..4381d1f2cf736 100644
--- a/mlir/include/mlir/Dialect/Affine/Utils.h
+++ b/mlir/include/mlir/Dialect/Affine/Utils.h
@@ -319,6 +319,15 @@ FailureOr<SmallVector<Value>> delinearizeIndex(OpBuilder &b, Location loc,
Value linearIndex,
ArrayRef<Value> basis);
+/// Ensure that all operations that could be executed after `start`
+/// (noninclusive) and prior to `memOp` (e.g. on a control flow/op path
+/// between the operations) do not have the potential memory effect
+/// `EffectType` on `memOp`. `memOp` is an operation that reads or writes to
+/// a memref. For example, if `EffectType` is MemoryEffects::Write, this method
+/// will check if there is no write to the memory between `start` and `memOp`
+/// that would change the read within `memOp`.
+template <typename EffectType, typename T>
+bool hasNoInterveningEffect(Operation *start, T memOp);
} // namespace mlir
#endif // MLIR_DIALECT_AFFINE_UTILS_H
diff --git a/mlir/lib/Dialect/Affine/Utils/Utils.cpp b/mlir/lib/Dialect/Affine/Utils/Utils.cpp
index 0161325b6c4e3..c26a6b0af430c 100644
--- a/mlir/lib/Dialect/Affine/Utils/Utils.cpp
+++ b/mlir/lib/Dialect/Affine/Utils/Utils.cpp
@@ -650,15 +650,8 @@ LogicalResult mlir::normalizeAffineFor(AffineForOp op) {
return success();
}
-/// Ensure that all operations that could be executed after `start`
-/// (noninclusive) and prior to `memOp` (e.g. on a control flow/op path
-/// between the operations) do not have the potential memory effect
-/// `EffectType` on `memOp`. `memOp` is an operation that reads or writes to
-/// a memref. For example, if `EffectType` is MemoryEffects::Write, this method
-/// will check if there is no write to the memory between `start` and `memOp`
-/// that would change the read within `memOp`.
template <typename EffectType, typename T>
-static bool hasNoInterveningEffect(Operation *start, T memOp) {
+bool mlir::hasNoInterveningEffect(Operation *start, T memOp) {
auto isLocallyAllocated = [](Value memref) {
auto *defOp = memref.getDefiningOp();
return defOp && hasSingleEffect<MemoryEffects::Allocate>(defOp, memref);
@@ -874,7 +867,7 @@ static LogicalResult forwardStoreToLoad(
// 3. Ensure there is no intermediate operation which could replace the
// value in memory.
- if (!hasNoInterveningEffect<MemoryEffects::Write>(storeOp, loadOp))
+ if (!mlir::hasNoInterveningEffect<MemoryEffects::Write>(storeOp, loadOp))
continue;
// We now have a candidate for forwarding.
@@ -901,6 +894,10 @@ static LogicalResult forwardStoreToLoad(
return success();
}
+template bool mlir::hasNoInterveningEffect<mlir::MemoryEffects::Read,
+ mlir::AffineReadOpInterface>(
+ mlir::Operation *, mlir::AffineReadOpInterface);
+
// This attempts to find stores which have no impact on the final result.
// A writing op writeA will be eliminated if there exists an op writeB if
// 1) writeA and writeB have mathematically equivalent affine access functions.
@@ -937,7 +934,7 @@ static void findUnusedStore(AffineWriteOpInterface writeA,
// There cannot be an operation which reads from memory between
// the two writes.
- if (!hasNoInterveningEffect<MemoryEffects::Read>(writeA, writeB))
+ if (!mlir::hasNoInterveningEffect<MemoryEffects::Read>(writeA, writeB))
continue;
opsToErase.push_back(writeA);
@@ -973,8 +970,8 @@ static void loadCSE(AffineReadOpInterface loadA,
continue;
// 3. There is no write between loadA and loadB.
- if (!hasNoInterveningEffect<MemoryEffects::Write>(loadB.getOperation(),
- loadA))
+ if (!mlir::hasNoInterveningEffect<MemoryEffects::Write>(
+ loadB.getOperation(), loadA))
continue;
// Check if two values have the same shape. This is needed for affine vector
More information about the Mlir-commits
mailing list