From 41d03bc540c7240554fc8945a02fb1d03a78b626 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 17 Nov 2014 19:26:40 +0000 Subject: [PATCH] Revert commits r222146 and r222137. They were producing the wrong result if NumBits == BitsInWord. The old mask produced -1, the new mask 0. This should fix the 32 bit bots. llvm-svn: 222166 --- llvm/include/llvm/Bitcode/BitstreamReader.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/Bitcode/BitstreamReader.h b/llvm/include/llvm/Bitcode/BitstreamReader.h index d6f085c..ecf8235 100644 --- a/llvm/include/llvm/Bitcode/BitstreamReader.h +++ b/llvm/include/llvm/Bitcode/BitstreamReader.h @@ -338,14 +338,16 @@ public: } word_t Read(unsigned NumBits) { - assert(NumBits && NumBits <= sizeof(word_t) * 8 && + static const unsigned BitsInWord = sizeof(word_t) * 8; + + assert(NumBits && NumBits <= BitsInWord && "Cannot return zero or more than BitsInWord bits!"); static const unsigned Mask = sizeof(word_t) > 4 ? 0x3f : 0x1f; // If the field is fully contained by CurWord, return it quickly. if (BitsInCurWord >= NumBits) { - word_t R = CurWord & ((word_t(1) << (NumBits & Mask)) - 1); + word_t R = CurWord & (~word_t(0) >> (BitsInWord - NumBits)); // Use a mask to avoid undefined behavior. CurWord >>= (NumBits & Mask); @@ -363,7 +365,7 @@ public: if (BitsLeft > BitsInCurWord) return 0; - word_t R2 = CurWord & ((word_t(1) << (BitsLeft & Mask)) - 1); + word_t R2 = CurWord & (~word_t(0) >> (BitsInWord - BitsLeft)); // Use a mask to avoid undefined behavior. CurWord >>= (BitsLeft & Mask); -- 2.7.4