Index: unittests/IR/ConstantRangeTest.cpp =================================================================== --- unittests/IR/ConstantRangeTest.cpp +++ unittests/IR/ConstantRangeTest.cpp @@ -51,17 +51,12 @@ template static void ForeachNumInConstantRange(const ConstantRange &CR, Fn TestFn) { - if (CR.isFullSet()) { - for (APInt N = APInt::getNullValue(CR.getBitWidth());;) { + if (!CR.isEmptySet()) + for (APInt N = CR.getLower();;) { TestFn(N); - if (N == APInt::getAllOnesValue(CR.getBitWidth())) + if (++N == CR.getUpper()) break; - ++N; } - return; - } - for (APInt N = CR.getLower(); N != CR.getUpper(); ++N) - TestFn(N); } ConstantRange ConstantRangeTest::Full(16, true); @@ -1465,31 +1460,27 @@ unsigned Bits = 4; EnumerateTwoConstantRanges(Bits, [=](const ConstantRange &CR1, const ConstantRange &CR2) { - unsigned Size1 = CR1.isFullSet() - ? 1u << CR1.getBitWidth() - : (CR1.getUpper() - CR1.getLower()).getZExtValue(); - unsigned Size2 = CR2.isFullSet() - ? 1u << CR2.getBitWidth() - : (CR2.getUpper() - CR2.getLower()).getZExtValue(); - // Loop over all N1 in CR1 and N2 in CR2 and check whether any of the // operations have overflow / have no overflow. These loops are based // on Size1/Size2 to properly handle empty/full ranges. bool RangeHasOverflow = false; bool RangeHasNoOverflow = false; - APInt N1 = CR1.getLower(); - for (unsigned I1 = 0; I1 < Size1; ++I1, ++N1) { - APInt N2 = CR2.getLower(); - for (unsigned I2 = 0; I2 < Size2; ++I2, ++N2) { - assert(CR1.contains(N1)); - assert(CR2.contains(N2)); + if (!CR1.isEmptySet() && !CR2.isEmptySet()) + for (APInt N1 = CR1.getLower();;) { + for (APInt N2 = CR2.getLower();;) { + assert(CR1.contains(N1)); + assert(CR2.contains(N2)); - if (OverflowFn(N1, N2)) - RangeHasOverflow = true; - else - RangeHasNoOverflow = true; + if (OverflowFn(N1, N2)) + RangeHasOverflow = true; + else + RangeHasNoOverflow = true; + if (++N2 == CR2.getUpper()) + break; + } + if (++N1 == CR1.getUpper()) + break; } - } ConstantRange::OverflowResult OR = MayOverflowFn(CR1, CR2); switch (OR) {