[Mlir-commits] [mlir] [mlir][CSE] Add cleanup PostDominanceInfo logic to cse (PR #192628)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Apr 17 03:58:41 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir
Author: lonely eagle (linuxlonelyeagle)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/192628.diff
5 Files Affected:
- (modified) mlir/include/mlir/Transforms/CSE.h (+4-2)
- (modified) mlir/lib/Dialect/Transform/IR/TransformOps.cpp (+5-3)
- (modified) mlir/lib/Transforms/CSE.cpp (+13-7)
- (modified) mlir/test/Pass/pass-timing.mlir (+8)
- (modified) mlir/test/Pass/pipeline-parsing.mlir (+2)
``````````diff
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
``````````
</details>
https://github.com/llvm/llvm-project/pull/192628
More information about the Mlir-commits
mailing list