[llvm] r222166 - Revert commits r222146 and r222137.

Rafael Espindola rafael.espindola at gmail.com
Mon Nov 17 11:26:40 PST 2014


Author: rafael
Date: Mon Nov 17 13:26:40 2014
New Revision: 222166

URL: http://llvm.org/viewvc/llvm-project?rev=222166&view=rev
Log:
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.

Modified:
    llvm/trunk/include/llvm/Bitcode/BitstreamReader.h

Modified: llvm/trunk/include/llvm/Bitcode/BitstreamReader.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/BitstreamReader.h?rev=222166&r1=222165&r2=222166&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Bitcode/BitstreamReader.h (original)
+++ llvm/trunk/include/llvm/Bitcode/BitstreamReader.h Mon Nov 17 13:26:40 2014
@@ -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);





More information about the llvm-commits mailing list