[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 &region : op->getRegions())
+    for (Region &region : op->getRegions()) {
       domInfo->invalidate(&region);
+      postDomInfo->invalidate(&region);
+    }
     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 &region : op->getRegions()) {
       domInfo->invalidate(&region);
-      postDomInfo->invalidate(&region);
+      if (postDomInfo != nullptr)
+        postDomInfo->invalidate(&region);
     }
     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