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



More information about the llvm-branch-commits mailing list