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 new file mode 100644 index 0000000000000..7392b9d2ec712 --- /dev/null +++ b/mlir/test/Interfaces/InferIntRangeInterface/infer-int-range-test-ops-invalid.mlir @@ -0,0 +1,12 @@ +// RUN: mlir-opt -split-input-file -verify-diagnostics %s + +// Verify that test.with_bounds with mismatched attribute width (e.g., i64 +// 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@+1 {{'test.with_bounds' op 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 +} diff --git a/mlir/test/lib/Dialect/Test/TestOpDefs.cpp b/mlir/test/lib/Dialect/Test/TestOpDefs.cpp index c243bd79a44a8..5bf9dc4ade773 100644 --- a/mlir/test/lib/Dialect/Test/TestOpDefs.cpp +++ b/mlir/test/lib/Dialect/Test/TestOpDefs.cpp @@ -876,6 +876,20 @@ LogicalResult TestVerifiersOp::verifyRegions() { // TestWithBoundsOp //===----------------------------------------------------------------------===// +LogicalResult TestWithBoundsOp::verify() { + Type type = getElementTypeOrSelf(getResult().getType()); + unsigned expectedWidth = 0; + if (type.isIndex()) + expectedWidth = IndexType::kInternalStorageBitWidth; + else if (auto intTy = llvm::dyn_cast(type)) + expectedWidth = intTy.getWidth(); + if (expectedWidth != 0 && getUmin().getBitWidth() != expectedWidth) + return emitOpError("bound attribute width (") + << getUmin().getBitWidth() << ") does not match result type width (" + << expectedWidth << ")"; + return success(); +} + void TestWithBoundsOp::inferResultRanges(ArrayRef argRanges, SetIntRangeFn setResultRanges) { setResultRanges(getResult(), {getUmin(), getUmax(), getSmin(), getSmax()}); diff --git a/mlir/test/lib/Dialect/Test/TestOps.td b/mlir/test/lib/Dialect/Test/TestOps.td index fe02536a1df5b..9e0b39c61d492 100644 --- a/mlir/test/lib/Dialect/Test/TestOps.td +++ b/mlir/test/lib/Dialect/Test/TestOps.td @@ -3173,6 +3173,7 @@ def InferIntRangeType : AnyTypeOf<[AnyInteger, Index, VectorOfNonZeroRankOf<[Any def TestWithBoundsOp : TEST_Op<"with_bounds", [DeclareOpInterfaceMethods, NoMemoryEffect]> { + let hasVerifier = 1; let description = [{ Creates a value with specified [min, max] range for integer range analysis.