From b5ddcb9f1e41b142f89110fc9be78b3c6997f090 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Thu, 7 Nov 2019 01:16:01 +0300 Subject: [PATCH] [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. --- llvm/unittests/IR/ConstantRangeTest.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/llvm/unittests/IR/ConstantRangeTest.cpp b/llvm/unittests/IR/ConstantRangeTest.cpp index 742c5fa..eb79711 100644 --- a/llvm/unittests/IR/ConstantRangeTest.cpp +++ b/llvm/unittests/IR/ConstantRangeTest.cpp @@ -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)) { -- 2.7.4