From: Craig Topper Date: Mon, 24 Apr 2017 05:38:26 +0000 (+0000) Subject: [APInt] Make behavior of ashr by BitWidth consistent between single and multi word. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6a61317c632e6dde307340bddba338832d47d997;p=llvm [APInt] Make behavior of ashr by BitWidth consistent between single and multi word. Previously single word would always return 0 regardless of the original sign. Multi word would return all 0s or all 1s based on the original sign. Now single word takes into account the sign as well. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301159 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Support/APInt.cpp b/lib/Support/APInt.cpp index 3f552db7963..e056f8ba853 100644 --- a/lib/Support/APInt.cpp +++ b/lib/Support/APInt.cpp @@ -1041,7 +1041,9 @@ APInt APInt::ashr(unsigned shiftAmt) const { // Handle single word shifts with built-in ashr if (isSingleWord()) { if (shiftAmt == BitWidth) - return APInt(BitWidth, 0); // undefined + // Undefined + return APInt(BitWidth, + SignExtend64(VAL, BitWidth) >> (APINT_BITS_PER_WORD - 1)); return APInt(BitWidth, SignExtend64(VAL, BitWidth) >> shiftAmt); } diff --git a/unittests/ADT/APIntTest.cpp b/unittests/ADT/APIntTest.cpp index 1e20ebb320c..e0a53a56455 100644 --- a/unittests/ADT/APIntTest.cpp +++ b/unittests/ADT/APIntTest.cpp @@ -288,7 +288,7 @@ TEST(APIntTest, i1) { EXPECT_EQ(zero, one.shl(1)); EXPECT_EQ(one, one.shl(0)); EXPECT_EQ(zero, one.lshr(1)); - EXPECT_EQ(zero, one.ashr(1)); + EXPECT_EQ(one, one.ashr(1)); // Rotates. EXPECT_EQ(one, one.rotl(0));