[llvm-commits] CVS: llvm/include/llvm/ADT/APInt.h

Reid Spencer reid at x10sys.com
Sat Mar 24 16:36:11 PDT 2007



Changes in directory llvm/include/llvm/ADT:

APInt.h updated: 1.52 -> 1.53
---
Log message:

Don't invoke undefined behavior in shifts in the functions getHighBitsSet 
and getLowBitsSet.


---
Diffs of the changes:  (+6 -6)

 APInt.h |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)


Index: llvm/include/llvm/ADT/APInt.h
diff -u llvm/include/llvm/ADT/APInt.h:1.52 llvm/include/llvm/ADT/APInt.h:1.53
--- llvm/include/llvm/ADT/APInt.h:1.52	Sat Mar 24 18:27:48 2007
+++ llvm/include/llvm/ADT/APInt.h	Sat Mar 24 18:35:54 2007
@@ -357,12 +357,11 @@
   /// @brief Get a value with high bits set
   static APInt getHighBitsSet(uint32_t numBits, uint32_t hiBitsSet) {
     assert(hiBitsSet <= numBits && "Too many bits to set!");
-    uint32_t mvBits = numBits - hiBitsSet;
+    uint32_t shiftAmt = numBits - hiBitsSet;
     // For small values, return quickly
     if (numBits <= APINT_BITS_PER_WORD)
-      return APInt(numBits, ((1ULL << hiBitsSet) - 1) << mvBits);
-    APInt Result(numBits, 1);
-    return (APInt(numBits, 1).shl(hiBitsSet) - APInt(numBits, 1)).shl(mvBits);
+      return APInt(numBits, ~0ULL << shiftAmt);
+    return (~APInt(numBits, 0)).shl(shiftAmt);
   }
 
   /// Constructs an APInt value that has the bottom loBitsSet bits set.
@@ -371,10 +370,11 @@
   /// @brief Get a value with low bits set
   static APInt getLowBitsSet(uint32_t numBits, uint32_t loBitsSet) {
     assert(loBitsSet <= numBits && "Too many bits to set!");
+    uint32_t shiftAmt = numBits - loBitsSet;
     // For small values, return quickly
     if (numBits <= APINT_BITS_PER_WORD)
-      return APInt(numBits, (1ULL << loBitsSet) - 1ULL);
-    return APInt(numBits, 1).shl(loBitsSet) - APInt(numBits, 1);
+      return APInt(numBits, ~0ULL >> shiftAmt);
+    return (~APInt(numBits, 0)).lshr(shiftAmt);
   }
 
   /// The hash value is computed as the sum of the words and the bit width.






More information about the llvm-commits mailing list