[Mlir-commits] [mlir] ed34ee3 - [mlir] Assert region is within config scope in RegionPatternRewriteDriver (#193177)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Tue Apr 21 04:31:18 PDT 2026


Author: Mehdi Amini
Date: 2026-04-21T11:31:14Z
New Revision: ed34ee3a728d7df9db88a337d018ba9e405e23bc

URL: https://github.com/llvm/llvm-project/commit/ed34ee3a728d7df9db88a337d018ba9e405e23bc
DIFF: https://github.com/llvm/llvm-project/commit/ed34ee3a728d7df9db88a337d018ba9e405e23bc.diff

LOG: [mlir] Assert region is within config scope in RegionPatternRewriteDriver (#193177)

Assisted-by: Claude Code

Added: 
    

Modified: 
    mlir/include/mlir/Transforms/GreedyPatternRewriteDriver.h
    mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Transforms/GreedyPatternRewriteDriver.h b/mlir/include/mlir/Transforms/GreedyPatternRewriteDriver.h
index d56d7e58c35f9..5581e85675f09 100644
--- a/mlir/include/mlir/Transforms/GreedyPatternRewriteDriver.h
+++ b/mlir/include/mlir/Transforms/GreedyPatternRewriteDriver.h
@@ -92,7 +92,8 @@ class GreedyRewriteConfig {
   /// Only ops within the scope are added to the worklist. If no scope is
   /// specified, the closest enclosing region around the initial list of ops
   /// (or the specified region, depending on which greedy rewrite entry point
-  /// is used) is used as a scope.
+  /// is used) is used as a scope. Any region being simplified must be enclosed
+  /// by the scope (or equal to it).
   Region *getScope() const { return scope; }
   GreedyRewriteConfig &setScope(Region *scope) {
     this->scope = scope;
@@ -167,6 +168,8 @@ class GreedyRewriteConfig {
 /// A region scope can be set in the configuration parameter. By default, the
 /// scope is set to the specified region. Only in-scope ops are added to the
 /// worklist and only in-scope ops are allowed to be modified by the patterns.
+/// If a scope is set explicitly, it must enclose `region` (i.e., `region`
+/// must be nested within the scope, or equal to it).
 ///
 /// Returns "success" if the iterative process converged (i.e., fixpoint was
 /// reached) and no more patterns can be matched within the region. `changed`
@@ -191,7 +194,9 @@ applyPatternsGreedily(Region &region, const FrozenRewritePatternSet &patterns,
 /// specified op. A region scope can be set in the configuration parameter. By
 /// default, the scope is set to the region of the current greedy rewrite. Only
 /// in-scope ops are added to the worklist and only in-scope ops and the
-/// specified op itself are allowed to be modified by the patterns.
+/// specified op itself are allowed to be modified by the patterns. If a scope
+/// is set explicitly, it must enclose `op` (i.e., `op` must be nested within
+/// the scope).
 ///
 /// Note: The specified op may be modified, but it may not be removed by the
 /// patterns.

diff  --git a/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp b/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp
index 578e680535bed..ea7c28a07c21b 100644
--- a/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp
+++ b/mlir/lib/Transforms/Utils/GreedyPatternRewriteDriver.cpp
@@ -781,7 +781,8 @@ void GreedyPatternRewriteDriver::notifyMatchFailure(
 //===----------------------------------------------------------------------===//
 
 namespace {
-/// This driver simplfies all ops in a region.
+/// This driver simplfies all ops in a region. If a scope is set in the
+/// config, the provided region must be within that scope.
 class RegionPatternRewriteDriver : public GreedyPatternRewriteDriver {
 public:
   explicit RegionPatternRewriteDriver(MLIRContext *ctx,
@@ -807,6 +808,15 @@ RegionPatternRewriteDriver::RegionPatternRewriteDriver(
   if (config.getStrictness() != GreedyRewriteStrictness::AnyOp) {
     region.walk([&](Operation *op) { strictModeFilteredOps.insert(op); });
   }
+#ifndef NDEBUG
+  // Verify that the region is within the configured scope (if any).
+  if (Region *scope = config.getScope()) {
+    Region *r = ®ion;
+    while (r && r != scope)
+      r = r->getParentRegion();
+    assert(r && "provided region is not within the config scope");
+  }
+#endif
 }
 
 namespace {


        


More information about the Mlir-commits mailing list