Index: lib/Support/APInt.cpp =================================================================== --- lib/Support/APInt.cpp +++ lib/Support/APInt.cpp @@ -1245,7 +1245,9 @@ } APInt APInt::rotl(const APInt &rotateAmt) const { - return rotl((unsigned)rotateAmt.getLimitedValue(BitWidth)); + unsigned rotBitWidth = rotateAmt.getBitWidth(); + APInt rem(rotateAmt.urem(APInt(rotBitWidth, BitWidth))); + return rotl((unsigned)rem.getLimitedValue(BitWidth)); } APInt APInt::rotl(unsigned rotateAmt) const { @@ -1256,7 +1258,9 @@ } APInt APInt::rotr(const APInt &rotateAmt) const { - return rotr((unsigned)rotateAmt.getLimitedValue(BitWidth)); + unsigned rotBitWidth = rotateAmt.getBitWidth(); + APInt rem(rotateAmt.urem(APInt(rotBitWidth, BitWidth))); + return rotr((unsigned)rem.getLimitedValue(BitWidth)); } APInt APInt::rotr(unsigned rotateAmt) const { Index: unittests/ADT/APIntTest.cpp =================================================================== --- unittests/ADT/APIntTest.cpp +++ unittests/ADT/APIntTest.cpp @@ -978,6 +978,9 @@ EXPECT_EQ(APInt(8, 1), APInt(8, 16).rotl(4)); EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotl(8)); + EXPECT_EQ(APInt(32, 2), APInt(32, 1).rotl(33)); + EXPECT_EQ(APInt(32, 2), APInt(32, 1).rotl(APInt(33, 33))); + EXPECT_EQ(APInt(8, 16), APInt(8, 16).rotr(0)); EXPECT_EQ(APInt(8, 8), APInt(8, 16).rotr(1)); EXPECT_EQ(APInt(8, 4), APInt(8, 16).rotr(2)); @@ -990,6 +993,9 @@ EXPECT_EQ(APInt(8, 16), APInt(8, 1).rotr(4)); EXPECT_EQ(APInt(8, 1), APInt(8, 1).rotr(8)); + EXPECT_EQ(APInt(32, (1 << 31)), APInt(32, 1).rotr(33)); + EXPECT_EQ(APInt(32, (1 << 31)), APInt(32, 1).rotr(APInt(32, 33))); + APInt Big(256, "00004000800000000000000000003fff8000000000000000", 16); APInt Rot(256, "3fff80000000000000000000000000000000000040008000", 16); EXPECT_EQ(Rot, Big.rotr(144));