[Mlir-commits] [mlir] [mlir] Check greedy rewrite fingerprints and changed flag (PR #232576)
Hideto Ueno
llvmlistbot at llvm.org
Fri Oct 16 18:04:28 PDT 2026
https://github.com/uenoku updated https://github.com/llvm/llvm-project/pull/232576
>From ffba4f90ac14fe8a6066c03690bc9bb3b9a38927 Mon Sep 17 00:00:00 2001
From: Hideto Ueno <uenoku.tokotoko at gmail.com>
Date: Thu, 15 Oct 2026 17:24:26 -0700
Subject: [PATCH 1/2] [mlir] Check greedy rewrite fingerprints at entry points
---
.../Utils/GreedyPatternRewriteDriver.cpp | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp b/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp
index de800cb14af9c..1edb09d1738bb 100644
--- a/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp
+++ b/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp
@@ -954,10 +954,23 @@ mlir::applyPatternsGreedily(Region ®ion,
"greedy pattern rewriter input IR failed to verify");
#endif // MLIR_ENABLE_EXPENSIVE_PATTERN_API_CHECKS
+#ifdef EXPENSIVE_CHECKS
+ OperationFingerPrint before(config.getScope()->getParentOp());
+ bool rewriteChanged = false;
+ if (!changed)
+ changed = &rewriteChanged;
+#endif // EXPENSIVE_CHECKS
+
// Start the pattern driver.
RegionPatternRewriteDriver driver(region.getContext(), patterns, config,
region);
LogicalResult converged = std::move(driver).simplify(changed);
+#ifdef EXPENSIVE_CHECKS
+ if (!*changed &&
+ before != OperationFingerPrint(config.getScope()->getParentOp()))
+ llvm::report_fatal_error(
+ "greedy pattern rewriter changed IR but did not report a change");
+#endif // EXPENSIVE_CHECKS
if (failed(converged))
LDBG() << "The pattern rewrite did not converge after scanning "
<< config.getMaxIterations() << " times";
@@ -1084,12 +1097,27 @@ LogicalResult mlir::applyOpPatternsGreedily(
"greedy pattern rewriter input IR failed to verify");
#endif // MLIR_ENABLE_EXPENSIVE_PATTERN_API_CHECKS
+#ifdef EXPENSIVE_CHECKS
+ std::optional<OperationFingerPrint> before;
+ if (config.getScope())
+ before.emplace(config.getScope()->getParentOp());
+ bool rewriteChanged = false;
+ if (!changed)
+ changed = &rewriteChanged;
+#endif // EXPENSIVE_CHECKS
+
// Start the pattern driver.
llvm::SmallDenseSet<Operation *, 4> surviving;
MultiOpPatternRewriteDriver driver(ops.front()->getContext(), patterns,
config, ops,
allErased ? &surviving : nullptr);
LogicalResult converged = std::move(driver).simplify(ops, changed);
+#ifdef EXPENSIVE_CHECKS
+ if (!*changed && before &&
+ *before != OperationFingerPrint(config.getScope()->getParentOp()))
+ llvm::report_fatal_error(
+ "greedy pattern rewriter changed IR but did not report a change");
+#endif // EXPENSIVE_CHECKS
if (allErased)
*allErased = surviving.empty();
if (failed(converged))
>From 43ca61b7825fa09580dbce401e33f7fc07661c88 Mon Sep 17 00:00:00 2001
From: Hideto Ueno <uenoku.tokotoko at gmail.com>
Date: Fri, 16 Oct 2026 18:03:57 -0700
Subject: [PATCH 2/2] [mlir] Check greedy rewrite change flag against
fingerprints
---
.../Utils/GreedyPatternRewriteDriver.cpp | 29 ++++++++++---------
1 file changed, 15 insertions(+), 14 deletions(-)
diff --git a/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp b/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp
index 1edb09d1738bb..adc571061b7f7 100644
--- a/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp
+++ b/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp
@@ -956,21 +956,21 @@ mlir::applyPatternsGreedily(Region ®ion,
#ifdef EXPENSIVE_CHECKS
OperationFingerPrint before(config.getScope()->getParentOp());
- bool rewriteChanged = false;
- if (!changed)
- changed = &rewriteChanged;
#endif // EXPENSIVE_CHECKS
+ bool rewriteChanged = false;
// Start the pattern driver.
RegionPatternRewriteDriver driver(region.getContext(), patterns, config,
region);
- LogicalResult converged = std::move(driver).simplify(changed);
+ LogicalResult converged = std::move(driver).simplify(&rewriteChanged);
#ifdef EXPENSIVE_CHECKS
- if (!*changed &&
- before != OperationFingerPrint(config.getScope()->getParentOp()))
+ if (rewriteChanged !=
+ (before != OperationFingerPrint(config.getScope()->getParentOp())))
llvm::report_fatal_error(
- "greedy pattern rewriter changed IR but did not report a change");
+ "greedy pattern rewriter changed flag does not match the IR");
#endif // EXPENSIVE_CHECKS
+ if (changed)
+ *changed = rewriteChanged;
if (failed(converged))
LDBG() << "The pattern rewrite did not converge after scanning "
<< config.getMaxIterations() << " times";
@@ -1101,23 +1101,24 @@ LogicalResult mlir::applyOpPatternsGreedily(
std::optional<OperationFingerPrint> before;
if (config.getScope())
before.emplace(config.getScope()->getParentOp());
- bool rewriteChanged = false;
- if (!changed)
- changed = &rewriteChanged;
#endif // EXPENSIVE_CHECKS
+ bool rewriteChanged = false;
// Start the pattern driver.
llvm::SmallDenseSet<Operation *, 4> surviving;
MultiOpPatternRewriteDriver driver(ops.front()->getContext(), patterns,
config, ops,
allErased ? &surviving : nullptr);
- LogicalResult converged = std::move(driver).simplify(ops, changed);
+ LogicalResult converged = std::move(driver).simplify(ops, &rewriteChanged);
#ifdef EXPENSIVE_CHECKS
- if (!*changed && before &&
- *before != OperationFingerPrint(config.getScope()->getParentOp()))
+ if (before &&
+ rewriteChanged !=
+ (*before != OperationFingerPrint(config.getScope()->getParentOp())))
llvm::report_fatal_error(
- "greedy pattern rewriter changed IR but did not report a change");
+ "greedy pattern rewriter changed flag does not match the IR");
#endif // EXPENSIVE_CHECKS
+ if (changed)
+ *changed = rewriteChanged;
if (allErased)
*allErased = surviving.empty();
if (failed(converged))
More information about the Mlir-commits
mailing list