[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 ®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
More information about the Mlir-commits
mailing list