[Mlir-commits] [mlir] [mlir] Fix crash on test.with_bounds op (PR #218489)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Aug 24 11:46:39 PDT 2026
https://github.com/tht2005 created https://github.com/llvm/llvm-project/pull/218489
The old verify function implementation only check
if umin and result have the same bit width, add
the check for umax, smin and smax too.
Fix https://github.com/llvm/llvm-project/issues/203855
>From 722336e46a8c0cafb8aad091f1e7758395d01a83 Mon Sep 17 00:00:00 2001
From: Nguyen Dinh Dang Duong <dangduong31205 at gmail.com>
Date: Tue, 25 Aug 2026 01:41:30 +0700
Subject: [PATCH] [mlir] Fix crash on test.with_bounds op
The old verify function implementation only check
if umin and result have the same bit width, add
the check for umax, smin and smax too.
---
.../infer-int-range-test-ops-invalid.mlir | 38 ++++++++++++++++++-
mlir/test/lib/Dialect/Test/TestOpDefs.cpp | 19 ++++++++--
2 files changed, 52 insertions(+), 5 deletions(-)
diff --git a/mlir/test/Interfaces/InferIntRangeInterface/infer-int-range-test-ops-invalid.mlir b/mlir/test/Interfaces/InferIntRangeInterface/infer-int-range-test-ops-invalid.mlir
index 7392b9d2ec712..8e358a8b7cec6 100644
--- a/mlir/test/Interfaces/InferIntRangeInterface/infer-int-range-test-ops-invalid.mlir
+++ b/mlir/test/Interfaces/InferIntRangeInterface/infer-int-range-test-ops-invalid.mlir
@@ -4,9 +4,45 @@
// bounds for an i8 result) is rejected as invalid IR.
// See: https://github.com/llvm/llvm-project/issues/120882
func.func @with_bounds_mismatched_width() -> i8 {
- // expected-error at +1 {{'test.with_bounds' op bound attribute width (64) does not match result type width (8)}}
+ // expected-error at +1 {{'test.with_bounds' op 'umin' bound attribute width (64) does not match result type width (8)}}
%0 = test.with_bounds { umin = 10 : i64, umax = 15 : i64,
smin = 10 : i64, smax = 15 : i64 } : i8
%1 = test.reflect_bounds %0 : i8
return %1 : i8
}
+
+// Verify that test.with_bounds with mismatched attribute width (e.g., i64
+// bounds for an i8 result) is rejected as invalid IR. The old implementation
+// only compare bid width of umin and result, need to check umax, smin and
+// smax too.
+// See: https://github.com/llvm/llvm-project/issues/203855
+func.func @mismatched_umax_bound_bitwidth() -> i32 {
+ // expected-error at +1 {{'test.with_bounds' op 'umax' bound attribute width (8) does not match result type width (32)}}
+ %0 = test.with_bounds {
+ umin = 0 : i32,
+ umax = 127 : i8,
+ smin = 0 : i8,
+ smax = 127 : i8
+ } : i32
+ return %0 : i32
+}
+func.func @mismatched_smin_bound_bitwidth() -> i32 {
+ // expected-error at +1 {{'test.with_bounds' op 'smin' bound attribute width (8) does not match result type width (32)}}
+ %0 = test.with_bounds {
+ umin = 0 : i32,
+ umax = 127 : i32,
+ smin = 0 : i8,
+ smax = 127 : i8
+ } : i32
+ return %0 : i32
+}
+func.func @mismatched_smax_bound_bitwidth() -> i32 {
+ // expected-error at +1 {{'test.with_bounds' op 'smax' bound attribute width (8) does not match result type width (32)}}
+ %0 = test.with_bounds {
+ umin = 0 : i32,
+ umax = 127 : i32,
+ smin = 0 : i32,
+ smax = 127 : i8
+ } : i32
+ return %0 : i32
+}
diff --git a/mlir/test/lib/Dialect/Test/TestOpDefs.cpp b/mlir/test/lib/Dialect/Test/TestOpDefs.cpp
index 2e8bce9199fd2..560c2f6bc751b 100644
--- a/mlir/test/lib/Dialect/Test/TestOpDefs.cpp
+++ b/mlir/test/lib/Dialect/Test/TestOpDefs.cpp
@@ -911,10 +911,21 @@ LogicalResult TestWithBoundsOp::verify() {
expectedWidth = IndexType::kInternalStorageBitWidth;
else if (auto intTy = llvm::dyn_cast<IntegerType>(type))
expectedWidth = intTy.getWidth();
- if (expectedWidth != 0 && getUmin().getBitWidth() != expectedWidth)
- return emitOpError("bound attribute width (")
- << getUmin().getBitWidth() << ") does not match result type width ("
- << expectedWidth << ")";
+ // wrapper to check bound width and return error message if needed
+ auto verifyBoundWidth = [&](StringRef name,
+ const APInt& bound) -> LogicalResult {
+ if (expectedWidth != 0 && bound.getBitWidth() != expectedWidth)
+ return emitOpError()
+ << "'" << name << "' bound attribute width ("
+ << bound.getBitWidth()
+ << ") does not match result type width (" << expectedWidth << ")";
+ return success();
+ };
+ if (failed(verifyBoundWidth("umin", getUmin())) ||
+ failed(verifyBoundWidth("umax", getUmax())) ||
+ failed(verifyBoundWidth("smin", getSmin())) ||
+ failed(verifyBoundWidth("smax", getSmax())))
+ return failure();
return success();
}
More information about the Mlir-commits
mailing list