[Mlir-commits] [mlir] [mlir] Check greedy rewrite fingerprints and changed flag (PR #232576)

Hideto Ueno llvmlistbot at llvm.org
Fri Oct 16 18:06:00 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 &region,
         "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 f79fa27e4ad8cf7e8048f40f0a7d2c8fec0c0196 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
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Compare the driver’s local changed result against whether the enclosing operation fingerprint changed. Keep the result separate from the optional output parameter so the check validates this invocation even when the caller reuses the output variable.
---
 .../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 &region,
 
 #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