mirror of
https://github.com/intel/llvm.git
synced 2026-01-21 03:21:40 +08:00
[ConstantRange] TestAddWithNo*WrapExhaustive: check that all overflow means empty set
As disscussed in https://reviews.llvm.org/D69918 / https://reviews.llvm.org/D67339 that is an implied postcondition, but it's not really fully tested.
This commit is contained in:
@@ -651,11 +651,13 @@ static void TestAddWithNoSignedWrapExhaustive(Fn1 RangeFn, Fn2 IntFn) {
|
||||
ConstantRange CR = RangeFn(CR1, CR2);
|
||||
APInt Min = APInt::getSignedMaxValue(Bits);
|
||||
APInt Max = APInt::getSignedMinValue(Bits);
|
||||
bool AllOverflow = true;
|
||||
ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
|
||||
ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
|
||||
bool IsOverflow = false;
|
||||
APInt N = IntFn(IsOverflow, N1, N2);
|
||||
if (!IsOverflow) {
|
||||
AllOverflow = false;
|
||||
if (N.slt(Min))
|
||||
Min = N;
|
||||
if (N.sgt(Max))
|
||||
@@ -664,6 +666,9 @@ static void TestAddWithNoSignedWrapExhaustive(Fn1 RangeFn, Fn2 IntFn) {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
EXPECT_EQ(CR.isEmptySet(), AllOverflow);
|
||||
|
||||
if (!CR1.isSignWrappedSet() && !CR2.isSignWrappedSet()) {
|
||||
if (Min.sgt(Max)) {
|
||||
EXPECT_TRUE(CR.isEmptySet());
|
||||
@@ -684,11 +689,13 @@ static void TestAddWithNoUnsignedWrapExhaustive(Fn1 RangeFn, Fn2 IntFn) {
|
||||
ConstantRange CR = RangeFn(CR1, CR2);
|
||||
APInt Min = APInt::getMaxValue(Bits);
|
||||
APInt Max = APInt::getMinValue(Bits);
|
||||
bool AllOverflow = true;
|
||||
ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
|
||||
ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
|
||||
bool IsOverflow = false;
|
||||
APInt N = IntFn(IsOverflow, N1, N2);
|
||||
if (!IsOverflow) {
|
||||
AllOverflow = false;
|
||||
if (N.ult(Min))
|
||||
Min = N;
|
||||
if (N.ugt(Max))
|
||||
@@ -698,6 +705,8 @@ static void TestAddWithNoUnsignedWrapExhaustive(Fn1 RangeFn, Fn2 IntFn) {
|
||||
});
|
||||
});
|
||||
|
||||
EXPECT_EQ(CR.isEmptySet(), AllOverflow);
|
||||
|
||||
if (!CR1.isWrappedSet() && !CR2.isWrappedSet()) {
|
||||
if (Min.ugt(Max)) {
|
||||
EXPECT_TRUE(CR.isEmptySet());
|
||||
@@ -722,12 +731,14 @@ static void TestAddWithNoSignedUnsignedWrapExhaustive(Fn1 RangeFn,
|
||||
APInt UMax = APInt::getMinValue(Bits);
|
||||
APInt SMin = APInt::getSignedMaxValue(Bits);
|
||||
APInt SMax = APInt::getSignedMinValue(Bits);
|
||||
bool AllOverflow = true;
|
||||
ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
|
||||
ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
|
||||
bool IsOverflow = false, IsSignedOverflow = false;
|
||||
APInt N = IntFnSigned(IsSignedOverflow, N1, N2);
|
||||
(void) IntFnUnsigned(IsOverflow, N1, N2);
|
||||
if (!IsSignedOverflow && !IsOverflow) {
|
||||
AllOverflow = false;
|
||||
if (N.slt(SMin))
|
||||
SMin = N;
|
||||
if (N.sgt(SMax))
|
||||
@@ -741,6 +752,8 @@ static void TestAddWithNoSignedUnsignedWrapExhaustive(Fn1 RangeFn,
|
||||
});
|
||||
});
|
||||
|
||||
EXPECT_EQ(CR.isEmptySet(), AllOverflow);
|
||||
|
||||
if (!CR1.isWrappedSet() && !CR2.isWrappedSet() &&
|
||||
!CR1.isSignWrappedSet() && !CR2.isSignWrappedSet()) {
|
||||
if (UMin.ugt(UMax) || SMin.sgt(SMax)) {
|
||||
|
||||
Reference in New Issue
Block a user