OSDN Git Service

fix corner case in ConstantRange::intersectWith().
authorNuno Lopes <nunoplopes@sapo.pt>
Fri, 18 May 2012 00:14:36 +0000 (00:14 +0000)
committerNuno Lopes <nunoplopes@sapo.pt>
Fri, 18 May 2012 00:14:36 +0000 (00:14 +0000)
this fixes the missed optimization I was seeing in the CorrelatedValuePropagation pass

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157032 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/ConstantRange.cpp
unittests/Support/ConstantRangeTest.cpp

index 5206cf1..e7d8483 100644 (file)
@@ -288,7 +288,7 @@ ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const {
       if (CR.Upper.ult(Upper))
         return CR;
 
-      if (CR.Upper.ult(Lower))
+      if (CR.Upper.ule(Lower))
         return ConstantRange(CR.Lower, Upper);
 
       if (getSetSize().ult(CR.getSetSize()))
index 742bcb4..5fcdcfd 100644 (file)
@@ -232,6 +232,11 @@ TEST_F(ConstantRangeTest, IntersectWith) {
   ConstantRange LHS(APInt(16, 4), APInt(16, 2));
   ConstantRange RHS(APInt(16, 6), APInt(16, 5));
   EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
+
+  // previous bug: intersection of [min, 3) and [2, max) should be 2
+  LHS = ConstantRange(APInt(32, -2147483648), APInt(32, 3));
+  RHS = ConstantRange(APInt(32, 2), APInt(32, 2147483648));
+  EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2)));
 }
 
 TEST_F(ConstantRangeTest, UnionWith) {