[Mlir-commits] [mlir] [MLIR] Change name and description of `mlir-print-assume-verified` to be more explicit. (PR #184812)

Arjun Bhamra llvmlistbot at llvm.org
Thu Mar 5 08:37:37 PST 2026


https://github.com/abhamra updated https://github.com/llvm/llvm-project/pull/184812

>From 31ec5081db13604144f63b9cd1f249a3ca75bd35 Mon Sep 17 00:00:00 2001
From: Arjun Bhamra <arjun.bhamra25 at gmail.com>
Date: Tue, 3 Mar 2026 14:50:58 -0500
Subject: [PATCH 1/8] notes in inferintrangeinterfaceimpls.cpp,
 inferintrangecommon.cpp

---
 mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp | 1 +
 mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp         | 1 +
 2 files changed, 2 insertions(+)

diff --git a/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp b/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
index 49f89e1bd17f3..e0f43aa420e71 100644
--- a/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
+++ b/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
@@ -243,6 +243,7 @@ void arith::ExtSIOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges,
 
 void arith::TruncIOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges,
                                         SetIntRangeFn setResultRange) {
+  // NOTE: ISSUE HERE, BE CAREFUL
   unsigned destWidth =
       ConstantIntRanges::getStorageBitwidth(getResult().getType());
   setResultRange(getResult(), truncRange(argRanges[0], destWidth));
diff --git a/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp b/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
index 21f07ddce4495..68441ff6c2d13 100644
--- a/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
+++ b/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
@@ -147,6 +147,7 @@ ConstantIntRanges mlir::intrange::truncRange(const ConstantIntRanges &range,
   // the range of the resulting value is not contiguous ind includes 0.
   // Ex. If you truncate [256, 258] from i16 to i8, you validly get [0, 2],
   // but you can't truncate [255, 257] similarly.
+  // NOTE: Issue ends here, in the trunc call when destwidth = 0
   bool hasUnsignedRollover =
       range.umin().lshr(destWidth) != range.umax().lshr(destWidth);
   APInt umin = hasUnsignedRollover ? APInt::getZero(destWidth)

>From 1dcba43d5943e6487dd99d6a30d30685d13fe070 Mon Sep 17 00:00:00 2001
From: Arjun Bhamra <arjun.bhamra25 at gmail.com>
Date: Tue, 3 Mar 2026 14:50:58 -0500
Subject: [PATCH 2/8] notes in inferintrangeinterfaceimpls.cpp,
 inferintrangecommon.cpp

---
 mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp | 1 +
 mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp         | 1 +
 2 files changed, 2 insertions(+)

diff --git a/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp b/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
index 49f89e1bd17f3..e0f43aa420e71 100644
--- a/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
+++ b/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
@@ -243,6 +243,7 @@ void arith::ExtSIOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges,
 
 void arith::TruncIOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges,
                                         SetIntRangeFn setResultRange) {
+  // NOTE: ISSUE HERE, BE CAREFUL
   unsigned destWidth =
       ConstantIntRanges::getStorageBitwidth(getResult().getType());
   setResultRange(getResult(), truncRange(argRanges[0], destWidth));
diff --git a/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp b/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
index 21f07ddce4495..68441ff6c2d13 100644
--- a/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
+++ b/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
@@ -147,6 +147,7 @@ ConstantIntRanges mlir::intrange::truncRange(const ConstantIntRanges &range,
   // the range of the resulting value is not contiguous ind includes 0.
   // Ex. If you truncate [256, 258] from i16 to i8, you validly get [0, 2],
   // but you can't truncate [255, 257] similarly.
+  // NOTE: Issue ends here, in the trunc call when destwidth = 0
   bool hasUnsignedRollover =
       range.umin().lshr(destWidth) != range.umax().lshr(destWidth);
   APInt umin = hasUnsignedRollover ? APInt::getZero(destWidth)

>From d21d4db676621582b100ae306bdf9b4475f7e0d1 Mon Sep 17 00:00:00 2001
From: Arjun Bhamra <arjun.bhamra25 at gmail.com>
Date: Thu, 5 Mar 2026 00:23:46 -0500
Subject: [PATCH 3/8] added guards for empty region in
 getAsmBlockArgumentNames, regression test

---
 mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp      |  6 +++++
 .../IR/test-visitors-assume-verified.mlir     | 23 +++++++++++++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 mlir/test/IR/test-visitors-assume-verified.mlir

diff --git a/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp b/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp
index bfc03cc7436df..9b68a540c52e6 100644
--- a/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp
+++ b/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp
@@ -1102,6 +1102,8 @@ static void buildGenericRegion(
 
 void GenericOp::getAsmBlockArgumentNames(Region &region,
                                          OpAsmSetValueNameFn setNameFn) {
+  if (region.empty())
+    return;
   for (Value v : getRegionInputArgs())
     setNameFn(v, "in");
   for (Value v : getRegionOutputArgs())
@@ -1481,6 +1483,8 @@ static ParseResult parseDstStyleOp(
 
 void MapOp::getAsmBlockArgumentNames(Region &region,
                                      OpAsmSetValueNameFn setNameFn) {
+  if (region.empty())
+    return;
   for (Value v : getRegionInputArgs())
     setNameFn(v, "in");
   for (Value v : getRegionOutputArgs())
@@ -1738,6 +1742,8 @@ Speculation::Speculatability MapOp::getSpeculatability() {
 
 void ReduceOp::getAsmBlockArgumentNames(Region &region,
                                         OpAsmSetValueNameFn setNameFn) {
+  if (region.empty())
+    return;
   for (Value v : getRegionInputArgs())
     setNameFn(v, "in");
   for (Value v : getRegionOutputArgs())
diff --git a/mlir/test/IR/test-visitors-assume-verified.mlir b/mlir/test/IR/test-visitors-assume-verified.mlir
new file mode 100644
index 0000000000000..8178be1187b16
--- /dev/null
+++ b/mlir/test/IR/test-visitors-assume-verified.mlir
@@ -0,0 +1,23 @@
+// RUN: mlir-opt -test-ir-visitors --mlir-print-assume-verified %s | FileCheck %s
+
+// Regression test: linalg ops implementing getAsmBlockArgumentNames via
+// getRegionInputArgs() used to crash during block erasure in no-skip walks
+// when combined with --mlir-print-assume-verified, because AsmState
+// construction would call getAsmBlockArgumentNames on ops whose regions
+// had already been emptied.
+
+func.func @test_no_skip_block_erasure_linalg_map(%arg0: tensor<4xf32>, %arg1: tensor<4xf32>) -> tensor<4xf32> {
+  %0 = tensor.empty() : tensor<4xf32>
+  %1 = linalg.map ins(%arg0, %arg1 : tensor<4xf32>, tensor<4xf32>)
+                  outs(%0 : tensor<4xf32>)
+    (%in0: f32, %in1: f32, %out: f32) {
+      %2 = arith.addf %in0, %in1 : f32
+      linalg.yield %2 : f32
+    }
+  return %1 : tensor<4xf32>
+}
+
+// CHECK-LABEL: Block post-order erasures (no skip)
+// CHECK:       Erasing block ^bb0 from region 0 from operation 'linalg.map'
+// CHECK:       Erasing block ^bb0 from region 0 from operation 'func.func'
+// CHECK:       Erasing block ^bb0 from region 0 from operation 'builtin.module'

>From 9c42b56c789552193701be4d5274b721c1925c51 Mon Sep 17 00:00:00 2001
From: Arjun Bhamra <arjun.bhamra25 at gmail.com>
Date: Thu, 5 Mar 2026 00:57:18 -0500
Subject: [PATCH 4/8] residual comments removed

---
 mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp | 1 -
 mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp         | 1 -
 2 files changed, 2 deletions(-)

diff --git a/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp b/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
index e0f43aa420e71..49f89e1bd17f3 100644
--- a/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
+++ b/mlir/lib/Dialect/Arith/IR/InferIntRangeInterfaceImpls.cpp
@@ -243,7 +243,6 @@ void arith::ExtSIOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges,
 
 void arith::TruncIOp::inferResultRanges(ArrayRef<ConstantIntRanges> argRanges,
                                         SetIntRangeFn setResultRange) {
-  // NOTE: ISSUE HERE, BE CAREFUL
   unsigned destWidth =
       ConstantIntRanges::getStorageBitwidth(getResult().getType());
   setResultRange(getResult(), truncRange(argRanges[0], destWidth));
diff --git a/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp b/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
index 68441ff6c2d13..21f07ddce4495 100644
--- a/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
+++ b/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp
@@ -147,7 +147,6 @@ ConstantIntRanges mlir::intrange::truncRange(const ConstantIntRanges &range,
   // the range of the resulting value is not contiguous ind includes 0.
   // Ex. If you truncate [256, 258] from i16 to i8, you validly get [0, 2],
   // but you can't truncate [255, 257] similarly.
-  // NOTE: Issue ends here, in the trunc call when destwidth = 0
   bool hasUnsignedRollover =
       range.umin().lshr(destWidth) != range.umax().lshr(destWidth);
   APInt umin = hasUnsignedRollover ? APInt::getZero(destWidth)

>From abecf076bc1db60a7f52fd285cad45f7770693b7 Mon Sep 17 00:00:00 2001
From: Arjun Bhamra <arjun.bhamra25 at gmail.com>
Date: Thu, 5 Mar 2026 10:37:52 -0500
Subject: [PATCH 5/8] fix pass name, change desc slightly

---
 mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp      |  6 -----
 mlir/lib/IR/AsmPrinter.cpp                    |  5 ++--
 .../IR/test-visitors-assume-verified.mlir     | 23 -------------------
 mlir/test/lib/IR/TestVisitors.cpp             |  1 -
 4 files changed, 3 insertions(+), 32 deletions(-)
 delete mode 100644 mlir/test/IR/test-visitors-assume-verified.mlir

diff --git a/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp b/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp
index 9b68a540c52e6..bfc03cc7436df 100644
--- a/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp
+++ b/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp
@@ -1102,8 +1102,6 @@ static void buildGenericRegion(
 
 void GenericOp::getAsmBlockArgumentNames(Region &region,
                                          OpAsmSetValueNameFn setNameFn) {
-  if (region.empty())
-    return;
   for (Value v : getRegionInputArgs())
     setNameFn(v, "in");
   for (Value v : getRegionOutputArgs())
@@ -1483,8 +1481,6 @@ static ParseResult parseDstStyleOp(
 
 void MapOp::getAsmBlockArgumentNames(Region &region,
                                      OpAsmSetValueNameFn setNameFn) {
-  if (region.empty())
-    return;
   for (Value v : getRegionInputArgs())
     setNameFn(v, "in");
   for (Value v : getRegionOutputArgs())
@@ -1742,8 +1738,6 @@ Speculation::Speculatability MapOp::getSpeculatability() {
 
 void ReduceOp::getAsmBlockArgumentNames(Region &region,
                                         OpAsmSetValueNameFn setNameFn) {
-  if (region.empty())
-    return;
   for (Value v : getRegionInputArgs())
     setNameFn(v, "in");
   for (Value v : getRegionOutputArgs())
diff --git a/mlir/lib/IR/AsmPrinter.cpp b/mlir/lib/IR/AsmPrinter.cpp
index b3242f838fc1d..8d195932daa90 100644
--- a/mlir/lib/IR/AsmPrinter.cpp
+++ b/mlir/lib/IR/AsmPrinter.cpp
@@ -175,8 +175,9 @@ struct AsmPrinterOptions {
       llvm::cl::desc("Print the generic op form"), llvm::cl::Hidden};
 
   llvm::cl::opt<bool> assumeVerifiedOpt{
-      "mlir-print-assume-verified", llvm::cl::init(false),
-      llvm::cl::desc("Skip op verification when using custom printers"),
+      "mlir-unsafe-print-assume-verified", llvm::cl::init(false),
+      llvm::cl::desc(
+          "Skip op verification when using custom printers; crashes expected."),
       llvm::cl::Hidden};
 
   llvm::cl::opt<bool> printLocalScopeOpt{
diff --git a/mlir/test/IR/test-visitors-assume-verified.mlir b/mlir/test/IR/test-visitors-assume-verified.mlir
deleted file mode 100644
index 8178be1187b16..0000000000000
--- a/mlir/test/IR/test-visitors-assume-verified.mlir
+++ /dev/null
@@ -1,23 +0,0 @@
-// RUN: mlir-opt -test-ir-visitors --mlir-print-assume-verified %s | FileCheck %s
-
-// Regression test: linalg ops implementing getAsmBlockArgumentNames via
-// getRegionInputArgs() used to crash during block erasure in no-skip walks
-// when combined with --mlir-print-assume-verified, because AsmState
-// construction would call getAsmBlockArgumentNames on ops whose regions
-// had already been emptied.
-
-func.func @test_no_skip_block_erasure_linalg_map(%arg0: tensor<4xf32>, %arg1: tensor<4xf32>) -> tensor<4xf32> {
-  %0 = tensor.empty() : tensor<4xf32>
-  %1 = linalg.map ins(%arg0, %arg1 : tensor<4xf32>, tensor<4xf32>)
-                  outs(%0 : tensor<4xf32>)
-    (%in0: f32, %in1: f32, %out: f32) {
-      %2 = arith.addf %in0, %in1 : f32
-      linalg.yield %2 : f32
-    }
-  return %1 : tensor<4xf32>
-}
-
-// CHECK-LABEL: Block post-order erasures (no skip)
-// CHECK:       Erasing block ^bb0 from region 0 from operation 'linalg.map'
-// CHECK:       Erasing block ^bb0 from region 0 from operation 'func.func'
-// CHECK:       Erasing block ^bb0 from region 0 from operation 'builtin.module'
diff --git a/mlir/test/lib/IR/TestVisitors.cpp b/mlir/test/lib/IR/TestVisitors.cpp
index dec5140d170fc..e1580e0644c44 100644
--- a/mlir/test/lib/IR/TestVisitors.cpp
+++ b/mlir/test/lib/IR/TestVisitors.cpp
@@ -141,7 +141,6 @@ static void testSkipErasureCallbacks(Operation *op) {
     printBlock(block);
     llvm::outs() << ", still has uses\n";
     return WalkResult::advance();
-   
   };
 
   llvm::outs() << "Op pre-order erasures (skip)"

>From 8a863f557652c6be9fc3adfdfbf377e24767c410 Mon Sep 17 00:00:00 2001
From: Arjun Bhamra <arjun.bhamra25 at gmail.com>
Date: Thu, 5 Mar 2026 10:41:29 -0500
Subject: [PATCH 6/8] undo random indent

---
 mlir/test/lib/IR/TestVisitors.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/mlir/test/lib/IR/TestVisitors.cpp b/mlir/test/lib/IR/TestVisitors.cpp
index e1580e0644c44..dced5c5e83378 100644
--- a/mlir/test/lib/IR/TestVisitors.cpp
+++ b/mlir/test/lib/IR/TestVisitors.cpp
@@ -141,6 +141,7 @@ static void testSkipErasureCallbacks(Operation *op) {
     printBlock(block);
     llvm::outs() << ", still has uses\n";
     return WalkResult::advance();
+
   };
 
   llvm::outs() << "Op pre-order erasures (skip)"

>From 7b617c0cbbe358fb3ab0a720254ca1a7e2ddddaa Mon Sep 17 00:00:00 2001
From: Arjun Bhamra <arjun.bhamra25 at gmail.com>
Date: Thu, 5 Mar 2026 10:43:31 -0500
Subject: [PATCH 7/8] same thing

---
 mlir/test/lib/IR/TestVisitors.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mlir/test/lib/IR/TestVisitors.cpp b/mlir/test/lib/IR/TestVisitors.cpp
index dced5c5e83378..dec5140d170fc 100644
--- a/mlir/test/lib/IR/TestVisitors.cpp
+++ b/mlir/test/lib/IR/TestVisitors.cpp
@@ -141,7 +141,7 @@ static void testSkipErasureCallbacks(Operation *op) {
     printBlock(block);
     llvm::outs() << ", still has uses\n";
     return WalkResult::advance();
-
+   
   };
 
   llvm::outs() << "Op pre-order erasures (skip)"

>From 1596ed6351daac6a0829548e455ecb4f63920e9f Mon Sep 17 00:00:00 2001
From: Arjun Bhamra <arjun.bhamra25 at gmail.com>
Date: Thu, 5 Mar 2026 11:17:54 -0500
Subject: [PATCH 8/8] fixed tests to use updated name

---
 mlir/test/IR/print-ir-invalid.mlir                 | 2 +-
 mlir/test/Pass/invalid-ir-print-after-failure.mlir | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/mlir/test/IR/print-ir-invalid.mlir b/mlir/test/IR/print-ir-invalid.mlir
index 46b34e5f8b63e..9c7d44c18cf8c 100644
--- a/mlir/test/IR/print-ir-invalid.mlir
+++ b/mlir/test/IR/print-ir-invalid.mlir
@@ -1,5 +1,5 @@
 // # RUN: mlir-opt -test-print-invalid %s | FileCheck %s
-// # RUN: mlir-opt -test-print-invalid %s --mlir-print-assume-verified  | FileCheck %s --check-prefix=ASSUME-VERIFIED
+// # RUN: mlir-opt -test-print-invalid %s --mlir-unsafe-print-assume-verified  | FileCheck %s --check-prefix=ASSUME-VERIFIED
 
 // The pass creates some ops and prints them to stdout, the input is just an
 // empty module.
diff --git a/mlir/test/Pass/invalid-ir-print-after-failure.mlir b/mlir/test/Pass/invalid-ir-print-after-failure.mlir
index 6910abe20be92..b26f7f1cea193 100644
--- a/mlir/test/Pass/invalid-ir-print-after-failure.mlir
+++ b/mlir/test/Pass/invalid-ir-print-after-failure.mlir
@@ -3,8 +3,8 @@
 // RUN: not mlir-opt %s -pass-pipeline='builtin.module(func.func(test-pass-create-invalid-ir{emit-invalid-ir=false signal-pass-failure=true}))' -mlir-print-ir-after-failure 2>&1  | FileCheck %s --check-prefix=CHECK-CUSTOM
 // RUN: mlir-opt %s -pass-pipeline='builtin.module(func.func(test-pass-create-invalid-ir{emit-invalid-ir=false signal-pass-failure=false}))' -mlir-print-ir-after-failure 2>&1  | FileCheck %s --check-prefix=CHECK-CUSTOM
 
-// Check that `-mlir-print-assume-verified` will print custom even when the IR is invalid.
-// RUN: not mlir-opt %s -pass-pipeline='builtin.module(func.func(test-pass-create-invalid-ir{emit-invalid-ir=true signal-pass-failure=true}))' -mlir-print-ir-after-failure 2>&1 -mlir-print-assume-verified | FileCheck %s --check-prefix=CHECK-CUSTOM
+// Check that `-mlir-unsafe-print-assume-verified` will print custom even when the IR is invalid.
+// RUN: not mlir-opt %s -pass-pipeline='builtin.module(func.func(test-pass-create-invalid-ir{emit-invalid-ir=true signal-pass-failure=true}))' -mlir-print-ir-after-failure 2>&1 -mlir-unsafe-print-assume-verified | FileCheck %s --check-prefix=CHECK-CUSTOM
 // RUN: not mlir-opt %s -pass-pipeline='builtin.module(func.func(test-pass-create-invalid-ir{emit-invalid-ir=true signal-pass-failure=false}))' -mlir-print-ir-after-failure 2>&1 -mlir-print-assume-verified | FileCheck %s --check-prefix=CHECK-CUSTOM
 
 // Test whether we print generically or not on pass failure, depending on whether there is invalid IR or not.



More information about the Mlir-commits mailing list