diff --git a/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp b/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp index ca3631d53bda9..ec9ed87723e1c 100644 --- a/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp +++ b/mlir/lib/Interfaces/Utils/InferIntRangeCommon.cpp @@ -444,10 +444,10 @@ mlir::intrange::inferRemU(ArrayRef argRanges) { unsigned width = rhsMin.getBitWidth(); APInt umin = APInt::getZero(width); - APInt umax = APInt::getMaxValue(width); + // Remainder can't be larger than either of its arguments. + APInt umax = llvm::APIntOps::umin((rhsMax - 1), lhs.umax()); if (!rhsMin.isZero()) { - umax = rhsMax - 1; // Special case: sweeping out a contiguous range in N/[modulus] if (rhsMin == rhsMax) { const APInt &lhsMin = lhs.umin(), &lhsMax = lhs.umax(); diff --git a/mlir/test/Dialect/Arith/int-range-interface.mlir b/mlir/test/Dialect/Arith/int-range-interface.mlir index 48fdb1cdced4d..4b04229e5db52 100644 --- a/mlir/test/Dialect/Arith/int-range-interface.mlir +++ b/mlir/test/Dialect/Arith/int-range-interface.mlir @@ -266,6 +266,19 @@ func.func @remui_base(%arg0 : index, %arg1 : index ) -> i1 { func.return %3 : i1 } +// CHECK-LABEL: func @remui_base_maybe_zero +// CHECK: %[[true:.*]] = arith.constant true +// CHECK: return %[[true]] +func.func @remui_base_maybe_zero(%arg0 : index, %arg1 : index ) -> i1 { + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + + %0 = arith.minui %arg1, %c4 : index + %1 = arith.remui %arg0, %0 : index + %2 = arith.cmpi ult, %1, %c5 : index + func.return %2 : i1 +} + // CHECK-LABEL: func @remsi_base // CHECK: %[[ret:.*]] = arith.cmpi sge // CHECK: return %[[ret]]