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. _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits