[llvm-branch-commits] [mlir] [mlir] Check greedy rewrite fingerprints and changed flag (PR #232576)
Hideto Ueno via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Oct 15 20:05:06 PDT 2026
https://github.com/uenoku created https://github.com/llvm/llvm-project/pull/232576
Under EXPENSIVE_CHECKS, compare operation fingerprints before and after
greedy rewriting. If the IR changes but the driver reports no change,
emit a fatal error.
For now EXPENSIVE_CHECKS is used. I considered using MLIR_ENABLE_EXPENSIVE_PATTERN_API_CHECKS
but I thought it's better to keep it to validate pattern APIs.
Assisted-by: gpt 6.1 sol
>From f93450bdef07b5b78f18931da10351aa2accc138 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] [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))
More information about the llvm-branch-commits
mailing list