diff --git a/mlir/lib/Dialect/Arith/Transforms/UnsignedWhenEquivalent.cpp b/mlir/lib/Dialect/Arith/Transforms/UnsignedWhenEquivalent.cpp --- a/mlir/lib/Dialect/Arith/Transforms/UnsignedWhenEquivalent.cpp +++ b/mlir/lib/Dialect/Arith/Transforms/UnsignedWhenEquivalent.cpp @@ -34,7 +34,9 @@ if (!result || result->getValue().isUninitialized()) return failure(); const ConstantIntRanges &range = result->getValue().getValue(); - return success(range.smin().isNonNegative()); + // Make sure we do have the integer range analysis result. + return success(range.smin().getBitWidth() != 0 && + range.smin().isNonNegative()); } /// Succeeds if an op can be converted to its unsigned equivalent without diff --git a/mlir/test/Dialect/Arith/unsigned-when-equivalent.mlir b/mlir/test/Dialect/Arith/unsigned-when-equivalent.mlir --- a/mlir/test/Dialect/Arith/unsigned-when-equivalent.mlir +++ b/mlir/test/Dialect/Arith/unsigned-when-equivalent.mlir @@ -96,3 +96,12 @@ %1 = arith.floordivsi %0, %0 : i8 return } + +// Make sure not crash. +// CHECK-LABEL: @no_integer_or_index +func.func @no_integer_or_index() { + // CHECK: arith.cmpi + %cst_0 = arith.constant dense<[0]> : vector<1xi32> + %cmp = arith.cmpi slt, %cst_0, %cst_0 : vector<1xi32> + return +}