[Mlir-commits] [mlir] [mlir][CSE] Add cleanup PostDominanceInfo logic to cse (PR #192628)

lonely eagle llvmlistbot at llvm.org
Fri Apr 17 03:58:08 PDT 2026


https://github.com/linuxlonelyeagle created https://github.com/llvm/llvm-project/pull/192628

This PR fixes an issue where the `CSE` pass deletes region operations and marks `PostDominanceInfo` as preserved, but the `CSE` pass does not perform any cleanup on `PostDominanceInfo` after deleting the ops.

>From f29f044b635401f074568a7e5ce9d354e9b89587 Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Fri, 17 Apr 2026 10:52:23 +0000
Subject: [PATCH] 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



More information about the Mlir-commits mailing list