Browse Source

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

Nick Lewycky 16 years ago
parent
commit
cf9e07dea8
2 changed files with 3 additions and 0 deletions
  1. 2 0
      lib/Support/ConstantRange.cpp
  2. 1 0
      unittests/Support/ConstantRangeTest.cpp

+ 2 - 0
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();

+ 1 - 0
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);