diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2009-07-13 02:49:08 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2009-07-13 02:49:08 +0000 |
commit | cf9e07dea8aad32c5e7e2631d135566b20e1763c (patch) | |
tree | b6236c5fb84c073c3faca05ca55d4a3d946687b4 | |
parent | deb052a3dd0227579f86d74b3c1d70384ea5c16b (diff) |
Fix a bug summing two full sets. The overflow checking doesn't handle sets as
large as the full set, only those one size smaller. Thanks to Daniel Dunbar
who found this bug using Klee!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75443 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Support/ConstantRange.cpp | 2 | ||||
-rw-r--r-- | unittests/Support/ConstantRangeTest.cpp | 1 |
2 files changed, 3 insertions, 0 deletions
diff --git a/lib/Support/ConstantRange.cpp b/lib/Support/ConstantRange.cpp index 04a1b68e07..8bab537795 100644 --- a/lib/Support/ConstantRange.cpp +++ b/lib/Support/ConstantRange.cpp @@ -533,6 +533,8 @@ ConstantRange ConstantRange::add(const ConstantRange &Other) const { if (isEmptySet() || Other.isEmptySet()) return ConstantRange(getBitWidth(), /*isFullSet=*/false); + if (isFullSet() || Other.isFullSet()) + return ConstantRange(getBitWidth(), /*isFullSet=*/true); APInt Spread_X = getSetSize(), Spread_Y = Other.getSetSize(); APInt NewLower = getLower() + Other.getLower(); diff --git a/unittests/Support/ConstantRangeTest.cpp b/unittests/Support/ConstantRangeTest.cpp index 891c209f11..cd91a9e103 100644 --- a/unittests/Support/ConstantRangeTest.cpp +++ b/unittests/Support/ConstantRangeTest.cpp @@ -239,6 +239,7 @@ TEST_F(ConstantRangeTest, SubtractAPInt) { TEST_F(ConstantRangeTest, Add) { EXPECT_TRUE(Full.add(APInt(16, 4)).isFullSet()); + EXPECT_EQ(Full.add(Full), Full); EXPECT_EQ(Full.add(Empty), Empty); EXPECT_EQ(Full.add(One), Full); EXPECT_EQ(Full.add(Some), Full); |