'i8 full-range' sign extended to i16 should equal [-128, 128) not [-128, 127).
authorNick Lewycky <nicholas@mxc.ca>
Mon, 13 Jul 2009 04:17:23 +0000 (04:17 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Mon, 13 Jul 2009 04:17:23 +0000 (04:17 +0000)
Found by Daniel Dunbar and KLEE.

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

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

index d7a57bb134c6bd40ea83eefc5d51da78c2cf5312..ca25491f6233b182757b920250a9a42538c8663b 100644 (file)
@@ -505,7 +505,7 @@ ConstantRange ConstantRange::signExtend(uint32_t DstTySize) const {
   assert(SrcTySize < DstTySize && "Not a value extension");
   if (isFullSet()) {
     return ConstantRange(APInt::getHighBitsSet(DstTySize,DstTySize-SrcTySize+1),
-                         APInt::getLowBitsSet(DstTySize, SrcTySize-1));
+                         APInt::getLowBitsSet(DstTySize, SrcTySize-1) + 1);
   }
 
   APInt L = Lower; L.sext(DstTySize);
index 2b073d8203979ab6303eabcfeb93969baa64a2f0..f929425e5475a9da6fde449cbb63f229f22d30b4 100644 (file)
@@ -175,7 +175,7 @@ TEST_F(ConstantRangeTest, SExt) {
   ConstantRange SSome = Some.signExtend(20);
   ConstantRange SWrap = Wrap.signExtend(20);
   EXPECT_EQ(SFull, ConstantRange(APInt(20, INT16_MIN, true),
-                                 APInt(20, INT16_MAX, true)));
+                                 APInt(20, INT16_MAX + 1, true)));
   EXPECT_TRUE(SEmpty.isEmptySet());
   EXPECT_EQ(SOne, ConstantRange(APInt(One.getLower()).sext(20),
                                 APInt(One.getUpper()).sext(20)));