[Mlir-commits] [mlir] dbbdc7e - [mlir][bufferization] Use a cache when checking whether ops are in mutually exclusive regions (#123516)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Feb 13 15:09:24 PST 2025
Author: Christopher Bate
Date: 2025-02-13T16:09:21-07:00
New Revision: dbbdc7e69c6b4d92b6b67060b094350c0de0d387
URL: https://github.com/llvm/llvm-project/commit/dbbdc7e69c6b4d92b6b67060b094350c0de0d387
DIFF: https://github.com/llvm/llvm-project/commit/dbbdc7e69c6b4d92b6b67060b094350c0de0d387.diff
LOG: [mlir][bufferization] Use a cache when checking whether ops are in mutually exclusive regions (#123516)
When profiling one-shot-bufferization over large programs, I found that
the analysis would spend a large amount of time checking whether
two operations are "inside mutually exclusive regions". This change
adds a cache for that information, which can result in a noticeable
speedup depending on program structure.
Added:
Modified:
mlir/include/mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h
mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp
mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h b/mlir/include/mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h
index d1a102e2a6e4e..ea7af3018bda8 100644
--- a/mlir/include/mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h
+++ b/mlir/include/mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h
@@ -563,6 +563,11 @@ class AnalysisState {
virtual void resetCache();
+ /// Checks whether `op0` and `op1` are inside mutually exclusive regions.
+ /// The logic defers to `mlir::insideMutuallyExclusiveRegions`, but the
+ /// result is cached.
+ bool insideMutuallyExclusiveRegions(Operation *op0, Operation *op1);
+
protected:
AnalysisState(const BufferizationOptions &options, TypeID type);
@@ -576,6 +581,11 @@ class AnalysisState {
/// Cache containing closest ancestor repetitive Region.
DenseMap<std::variant<Operation *, Block *, Region *, Value>, Region *>
enclosingRepetitiveRegionCache;
+
+ /// Cache that specifies whether the two operations are in mutually exclusive
+ /// regions.
+ DenseMap<std::pair<Operation *, Operation *>, bool>
+ insideMutuallyExclusiveRegionsCache;
};
/// Create an AllocTensorOp for the given shaped value (memref or tensor).
diff --git a/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp b/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp
index 1eb27e44810b0..99ffa62c41a4d 100644
--- a/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp
+++ b/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp
@@ -107,7 +107,23 @@ Region *AnalysisState::getEnclosingRepetitiveRegion(
return region;
}
-void AnalysisState::resetCache() { enclosingRepetitiveRegionCache.clear(); }
+bool AnalysisState::insideMutuallyExclusiveRegions(Operation *op0,
+ Operation *op1) {
+ auto key = std::make_pair(op0, op1);
+ if (auto iter = insideMutuallyExclusiveRegionsCache.find(key);
+ iter != insideMutuallyExclusiveRegionsCache.end())
+ return iter->second;
+ bool result = ::mlir::insideMutuallyExclusiveRegions(op0, op1);
+ // Populate results for both orderings of the ops.
+ insideMutuallyExclusiveRegionsCache[key] = result;
+ insideMutuallyExclusiveRegionsCache[std::make_pair(op1, op0)] = result;
+ return result;
+}
+
+void AnalysisState::resetCache() {
+ enclosingRepetitiveRegionCache.clear();
+ insideMutuallyExclusiveRegionsCache.clear();
+}
Region *bufferization::getNextEnclosingRepetitiveRegion(
Region *region, const BufferizationOptions &options) {
diff --git a/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp b/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp
index fc1b221b4f036..1eaf999d11c08 100644
--- a/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp
+++ b/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp
@@ -705,7 +705,8 @@ hasReadAfterWriteInterference(const DenseSet<OpOperand *> &usesRead,
// Note: If ops are executed multiple times (e.g., because they are
// inside a loop), mutually exclusive regions may be executed
// multiple times.
- if (insideMutuallyExclusiveRegions(readingOp, conflictingWritingOp)) {
+ if (state.insideMutuallyExclusiveRegions(readingOp,
+ conflictingWritingOp)) {
LLVM_DEBUG(llvm::dbgs() << " no conflict: read and write are in "
"mutually exclusive regions\n");
continue;
More information about the Mlir-commits
mailing list