[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 &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 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 &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