[Mlir-commits] [mlir] [mlir][CSE] Add cleanup PostDominanceInfo logic to cse (PR #192628)
lonely eagle
llvmlistbot at llvm.org
Sat Apr 18 20:08:53 PDT 2026
https://github.com/linuxlonelyeagle updated https://github.com/llvm/llvm-project/pull/192628
>From e92dac4e25e9c4bc12fff6555f46d5e8c146fd86 Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Fri, 17 Apr 2026 10:52:23 +0000
Subject: [PATCH 1/2] add cleanup PostDominanceInfo logic to cse.
---
mlir/include/mlir/Transforms/CSE.h | 6 ++++--
.../lib/Dialect/Transform/IR/TransformOps.cpp | 8 +++++---
mlir/lib/Transforms/CSE.cpp | 20 ++++++++++++-------
mlir/test/Pass/pass-timing.mlir | 8 ++++++++
mlir/test/Pass/pipeline-parsing.mlir | 2 ++
5 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/mlir/include/mlir/Transforms/CSE.h b/mlir/include/mlir/Transforms/CSE.h
index 3d01ece078050..ca1c154930105 100644
--- a/mlir/include/mlir/Transforms/CSE.h
+++ b/mlir/include/mlir/Transforms/CSE.h
@@ -16,6 +16,7 @@
namespace mlir {
class DominanceInfo;
+class PostDominanceInfo;
class Operation;
class RewriterBase;
@@ -24,8 +25,9 @@ class RewriterBase;
///
/// `changed` indicates whether the IR was modified or not.
void eliminateCommonSubExpressions(RewriterBase &rewriter,
- DominanceInfo &domInfo, Operation *op,
- bool *changed = nullptr);
+ DominanceInfo &domInfo,
+ PostDominanceInfo &postDomInfo,
+ Operation *op, bool *changed = nullptr);
} // namespace mlir
diff --git a/mlir/lib/Dialect/Transform/IR/TransformOps.cpp b/mlir/lib/Dialect/Transform/IR/TransformOps.cpp
index b53c36a51038a..ec7a40d6d2379 100644
--- a/mlir/lib/Dialect/Transform/IR/TransformOps.cpp
+++ b/mlir/lib/Dialect/Transform/IR/TransformOps.cpp
@@ -300,7 +300,8 @@ transform::ApplyCommonSubexpressionEliminationOp::applyToOne(
return payloadCheck;
DominanceInfo domInfo;
- mlir::eliminateCommonSubExpressions(rewriter, domInfo, target);
+ PostDominanceInfo postDomInfo;
+ mlir::eliminateCommonSubExpressions(rewriter, domInfo, postDomInfo, target);
return DiagnosedSilenceableFailure::success();
}
@@ -451,8 +452,9 @@ DiagnosedSilenceableFailure transform::ApplyPatternsOp::applyToOne(
if (getApplyCse()) {
DominanceInfo domInfo;
- mlir::eliminateCommonSubExpressions(rewriter, domInfo, target,
- &cseChanged);
+ PostDominanceInfo postDomInfo;
+ mlir::eliminateCommonSubExpressions(rewriter, domInfo, postDomInfo,
+ target, &cseChanged);
}
} while (cseChanged && ++iteration < kNumMaxIterations);
diff --git a/mlir/lib/Transforms/CSE.cpp b/mlir/lib/Transforms/CSE.cpp
index c91084ba96bb3..e7d745d0585b3 100644
--- a/mlir/lib/Transforms/CSE.cpp
+++ b/mlir/lib/Transforms/CSE.cpp
@@ -59,8 +59,9 @@ namespace {
/// Simple common sub-expression elimination.
class CSEDriver {
public:
- CSEDriver(RewriterBase &rewriter, DominanceInfo *domInfo)
- : rewriter(rewriter), domInfo(domInfo) {}
+ CSEDriver(RewriterBase &rewriter, DominanceInfo *domInfo,
+ PostDominanceInfo *postDomInfo)
+ : rewriter(rewriter), domInfo(domInfo), postDomInfo(postDomInfo) {}
/// Simplify all operations within the given op.
void simplify(Operation *op, bool *changed = nullptr);
@@ -119,6 +120,7 @@ class CSEDriver {
/// Operations marked as dead and to be erased.
std::vector<Operation *> opsToErase;
DominanceInfo *domInfo = nullptr;
+ PostDominanceInfo *postDomInfo = nullptr;
MemEffectsCache memEffectsCache;
// Various statistics.
@@ -397,8 +399,10 @@ void CSEDriver::simplify(Operation *op, bool *changed) {
/// Erase any operations that were marked as dead during simplification, and
/// remove their associated dominator trees.
for (auto *op : opsToErase) {
- for (Region ®ion : op->getRegions())
+ for (Region ®ion : op->getRegions()) {
domInfo->invalidate(®ion);
+ postDomInfo->invalidate(®ion);
+ }
rewriter.eraseOp(op);
}
if (changed)
@@ -409,9 +413,10 @@ void CSEDriver::simplify(Operation *op, bool *changed) {
}
void mlir::eliminateCommonSubExpressions(RewriterBase &rewriter,
- DominanceInfo &domInfo, Operation *op,
- bool *changed) {
- CSEDriver driver(rewriter, &domInfo);
+ DominanceInfo &domInfo,
+ PostDominanceInfo &postDomInfo,
+ Operation *op, bool *changed) {
+ CSEDriver driver(rewriter, &domInfo, &postDomInfo);
driver.simplify(op, changed);
}
@@ -425,7 +430,8 @@ struct CSE : public impl::CSEPassBase<CSE> {
void CSE::runOnOperation() {
// Simplify the IR.
IRRewriter rewriter(&getContext());
- CSEDriver driver(rewriter, &getAnalysis<DominanceInfo>());
+ CSEDriver driver(rewriter, &getAnalysis<DominanceInfo>(),
+ &getAnalysis<PostDominanceInfo>());
bool changed = false;
driver.simplify(getOperation(), &changed);
diff --git a/mlir/test/Pass/pass-timing.mlir b/mlir/test/Pass/pass-timing.mlir
index a383d01c2dc62..e216a4ee15630 100644
--- a/mlir/test/Pass/pass-timing.mlir
+++ b/mlir/test/Pass/pass-timing.mlir
@@ -28,9 +28,11 @@
// PIPELINE-NEXT: Parser
// PIPELINE-NEXT: 'func.func' Pipeline
// PIPELINE-NEXT: CSE
+// PIPELINE-NEXT: (A) PostDominanceInfo
// PIPELINE-NEXT: (A) DominanceInfo
// PIPELINE-NEXT: Canonicalizer
// PIPELINE-NEXT: CSE
+// PIPELINE-NEXT: (A) PostDominanceInfo
// PIPELINE-NEXT: (A) DominanceInfo
// PIPELINE-NEXT: Output
// PIPELINE-NEXT: Rest
@@ -43,12 +45,16 @@
// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: "name": "'func.func' Pipeline", "passes": [
// PIPELINE-JSON-NEXT: "name": "CSEPass", "passes": [
+// PIPELINE-JSON-NEXT: "name": "(A) PostDominanceInfo", "passes": [
+// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: "name": "(A) DominanceInfo", "passes": [
// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: "name": "CanonicalizerPass", "passes": [
// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: "name": "CSEPass", "passes": [
+// PIPELINE-JSON-NEXT: "name": "(A) PostDominanceInfo", "passes": [
+// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: "name": "(A) DominanceInfo", "passes": [
// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: {}]},
@@ -72,9 +78,11 @@
// MT_PIPELINE-NEXT: Parser
// MT_PIPELINE-NEXT: 'func.func' Pipeline
// MT_PIPELINE-NEXT: CSE
+// MT_PIPELINE-NEXT: (A) PostDominanceInfo
// MT_PIPELINE-NEXT: (A) DominanceInfo
// MT_PIPELINE-NEXT: Canonicalizer
// MT_PIPELINE-NEXT: CSE
+// MT_PIPELINE-NEXT: (A) PostDominanceInfo
// MT_PIPELINE-NEXT: (A) DominanceInfo
// MT_PIPELINE-NEXT: Output
// MT_PIPELINE-NEXT: Rest
diff --git a/mlir/test/Pass/pipeline-parsing.mlir b/mlir/test/Pass/pipeline-parsing.mlir
index 7f368c6df2af5..a16d0fa98f8ed 100644
--- a/mlir/test/Pass/pipeline-parsing.mlir
+++ b/mlir/test/Pass/pipeline-parsing.mlir
@@ -39,6 +39,7 @@ module {
// CHECK-NEXT: 'func.func' Pipeline
// CHECK-NEXT: TestFunctionPass
// CHECK-NEXT: CSE
+// CHECK-NEXT: PostDominanceInfo
// CHECK-NEXT: DominanceInfo
// CHECK-NEXT: Canonicalizer
// CHECK-NEXT: 'builtin.module' Pipeline
@@ -74,4 +75,5 @@ module {
// GENERIC_MERGE_CHECK-NEXT: Canonicalizer
// GENERIC_MERGE_CHECK-NEXT: 'func.func' Pipeline
// GENERIC_MERGE_CHECK-NEXT: CSE
+// GENERIC_MERGE_CHECK-NEXT: (A) PostDominanceInfo
// GENERIC_MERGE_CHECK-NEXT: (A) DominanceInfo
>From 1078e99fe9edaf4275bf10e574149b027bb8f944 Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Sun, 19 Apr 2026 03:08:23 +0000
Subject: [PATCH 2/2] use getCachedAnalysis().
---
mlir/lib/Transforms/CSE.cpp | 10 +++++++---
mlir/test/Pass/pass-timing.mlir | 8 --------
mlir/test/Pass/pipeline-parsing.mlir | 2 --
3 files changed, 7 insertions(+), 13 deletions(-)
diff --git a/mlir/lib/Transforms/CSE.cpp b/mlir/lib/Transforms/CSE.cpp
index e7d745d0585b3..d49a8ec9f4d8d 100644
--- a/mlir/lib/Transforms/CSE.cpp
+++ b/mlir/lib/Transforms/CSE.cpp
@@ -401,7 +401,8 @@ void CSEDriver::simplify(Operation *op, bool *changed) {
for (auto *op : opsToErase) {
for (Region ®ion : op->getRegions()) {
domInfo->invalidate(®ion);
- postDomInfo->invalidate(®ion);
+ if (postDomInfo != nullptr)
+ postDomInfo->invalidate(®ion);
}
rewriter.eraseOp(op);
}
@@ -428,10 +429,13 @@ struct CSE : public impl::CSEPassBase<CSE> {
} // namespace
void CSE::runOnOperation() {
+ PostDominanceInfo *postDomInfo = nullptr;
+ if (auto dominate = getCachedAnalysis<PostDominanceInfo>())
+ postDomInfo = &dominate.value().get();
+
// Simplify the IR.
IRRewriter rewriter(&getContext());
- CSEDriver driver(rewriter, &getAnalysis<DominanceInfo>(),
- &getAnalysis<PostDominanceInfo>());
+ CSEDriver driver(rewriter, &getAnalysis<DominanceInfo>(), postDomInfo);
bool changed = false;
driver.simplify(getOperation(), &changed);
diff --git a/mlir/test/Pass/pass-timing.mlir b/mlir/test/Pass/pass-timing.mlir
index e216a4ee15630..a383d01c2dc62 100644
--- a/mlir/test/Pass/pass-timing.mlir
+++ b/mlir/test/Pass/pass-timing.mlir
@@ -28,11 +28,9 @@
// PIPELINE-NEXT: Parser
// PIPELINE-NEXT: 'func.func' Pipeline
// PIPELINE-NEXT: CSE
-// PIPELINE-NEXT: (A) PostDominanceInfo
// PIPELINE-NEXT: (A) DominanceInfo
// PIPELINE-NEXT: Canonicalizer
// PIPELINE-NEXT: CSE
-// PIPELINE-NEXT: (A) PostDominanceInfo
// PIPELINE-NEXT: (A) DominanceInfo
// PIPELINE-NEXT: Output
// PIPELINE-NEXT: Rest
@@ -45,16 +43,12 @@
// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: "name": "'func.func' Pipeline", "passes": [
// PIPELINE-JSON-NEXT: "name": "CSEPass", "passes": [
-// PIPELINE-JSON-NEXT: "name": "(A) PostDominanceInfo", "passes": [
-// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: "name": "(A) DominanceInfo", "passes": [
// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: "name": "CanonicalizerPass", "passes": [
// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: "name": "CSEPass", "passes": [
-// PIPELINE-JSON-NEXT: "name": "(A) PostDominanceInfo", "passes": [
-// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: "name": "(A) DominanceInfo", "passes": [
// PIPELINE-JSON-NEXT: {}]},
// PIPELINE-JSON-NEXT: {}]},
@@ -78,11 +72,9 @@
// MT_PIPELINE-NEXT: Parser
// MT_PIPELINE-NEXT: 'func.func' Pipeline
// MT_PIPELINE-NEXT: CSE
-// MT_PIPELINE-NEXT: (A) PostDominanceInfo
// MT_PIPELINE-NEXT: (A) DominanceInfo
// MT_PIPELINE-NEXT: Canonicalizer
// MT_PIPELINE-NEXT: CSE
-// MT_PIPELINE-NEXT: (A) PostDominanceInfo
// MT_PIPELINE-NEXT: (A) DominanceInfo
// MT_PIPELINE-NEXT: Output
// MT_PIPELINE-NEXT: Rest
diff --git a/mlir/test/Pass/pipeline-parsing.mlir b/mlir/test/Pass/pipeline-parsing.mlir
index a16d0fa98f8ed..7f368c6df2af5 100644
--- a/mlir/test/Pass/pipeline-parsing.mlir
+++ b/mlir/test/Pass/pipeline-parsing.mlir
@@ -39,7 +39,6 @@ module {
// CHECK-NEXT: 'func.func' Pipeline
// CHECK-NEXT: TestFunctionPass
// CHECK-NEXT: CSE
-// CHECK-NEXT: PostDominanceInfo
// CHECK-NEXT: DominanceInfo
// CHECK-NEXT: Canonicalizer
// CHECK-NEXT: 'builtin.module' Pipeline
@@ -75,5 +74,4 @@ module {
// GENERIC_MERGE_CHECK-NEXT: Canonicalizer
// GENERIC_MERGE_CHECK-NEXT: 'func.func' Pipeline
// GENERIC_MERGE_CHECK-NEXT: CSE
-// GENERIC_MERGE_CHECK-NEXT: (A) PostDominanceInfo
// GENERIC_MERGE_CHECK-NEXT: (A) DominanceInfo
More information about the Mlir-commits
mailing list