From fc03d2d21f9f364b2d5ab41f42625a1c98eab351 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Mon, 24 Apr 2017 05:38:26 +0000 Subject: [PATCH] [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. llvm-svn: 301159 --- llvm/lib/Support/APInt.cpp | 4 +++- llvm/unittests/ADT/APIntTest.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp index 3f552db..e056f8b 100644 --- a/llvm/lib/Support/APInt.cpp +++ b/llvm/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/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp index 1e20ebb..e0a53a5 100644 --- a/llvm/unittests/ADT/APIntTest.cpp +++ b/llvm/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)); -- 2.7.4