// All non-negative.
if (SMin.isNonNegative())
- return *this;
+ return ConstantRange(SMin, SMax + 1);
// All negative.
if (SMax.isNegative())
return ConstantRange(-SMax, -SMin + 1);
// Range crosses zero.
- return ConstantRange(APInt::getZero(getBitWidth()),
- APIntOps::umax(-SMin, SMax) + 1);
+ return ConstantRange::getNonEmpty(APInt::getZero(getBitWidth()),
+ APIntOps::umax(-SMin, SMax) + 1);
}
ConstantRange::OverflowResult ConstantRange::unsignedAddMayOverflow(
; CHECK-LABEL: @pr59887(
; CHECK-NEXT: [[ABS:%.*]] = call i1 @llvm.abs.i1(i1 [[X:%.*]], i1 false)
; CHECK-NEXT: [[RES:%.*]] = select i1 [[C:%.*]], i1 [[ABS]], i1 false
-; CHECK-NEXT: ret i1 false
+; CHECK-NEXT: ret i1 [[RES]]
;
%abs = call i1 @llvm.abs.i1(i1 %x, i1 false)
%res = select i1 %c, i1 %abs, i1 false
static void TestUnaryOpExhaustive(UnaryRangeFn RangeFn, UnaryIntFn IntFn,
PreferFn PreferenceFn = PreferSmallest) {
- unsigned Bits = 4;
- EnumerateConstantRanges(Bits, [&](const ConstantRange &CR) {
- SmallBitVector Elems(1 << Bits);
- ForeachNumInConstantRange(CR, [&](const APInt &N) {
- if (std::optional<APInt> ResultN = IntFn(N))
- Elems.set(ResultN->getZExtValue());
+ for (unsigned Bits : {1, 4}) {
+ EnumerateConstantRanges(Bits, [&](const ConstantRange &CR) {
+ SmallBitVector Elems(1 << Bits);
+ ForeachNumInConstantRange(CR, [&](const APInt &N) {
+ if (std::optional<APInt> ResultN = IntFn(N))
+ Elems.set(ResultN->getZExtValue());
+ });
+ TestRange(RangeFn(CR), Elems, PreferenceFn, {CR});
});
- TestRange(RangeFn(CR), Elems, PreferenceFn, {CR});
- });
+ }
}
using BinaryRangeFn = llvm::function_ref<ConstantRange(const ConstantRange &,