aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2007-03-25 21:58:42 +0000
committerReid Spencer <rspencer@reidspencer.com>2007-03-25 21:58:42 +0000
commitf6bef488eeab75b6c7746f9faa9731d45bb84aef (patch)
tree9e6ed6c2f6d7e3ceef7d1b0dac49353cdf2908b0
parent9031aca96bf83379f837e1e590dc19dd67a3fdcd (diff)
Compute getLowBitsSet correctly. Using the complement of a 64-bit value
and shifting down without regard for the bitwidth of the APInt can lead to incorrect initialization values. Instead, check for the word size case (to avoid undef results from shift) and then do (1 << loBitsSet) - 1 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35344 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/ADT/APInt.h9
1 files changed, 5 insertions, 4 deletions
diff --git a/include/llvm/ADT/APInt.h b/include/llvm/ADT/APInt.h
index b39cf78b98..25ea4a2bd5 100644
--- a/include/llvm/ADT/APInt.h
+++ b/include/llvm/ADT/APInt.h
@@ -374,11 +374,12 @@ public:
// Handle a degenerate case, to avoid shifting by word size
if (loBitsSet == 0)
return APInt(numBits, 0);
- uint32_t shiftAmt = numBits - loBitsSet;
+ if (loBitsSet == APINT_BITS_PER_WORD)
+ return APInt(numBits, -1ULL);
// For small values, return quickly
- if (numBits <= APINT_BITS_PER_WORD)
- return APInt(numBits, ~0ULL >> shiftAmt);
- return (~APInt(numBits, 0)).lshr(shiftAmt);
+ if (numBits < APINT_BITS_PER_WORD)
+ return APInt(numBits, (1ULL << loBitsSet) - 1);
+ return (~APInt(numBits, 0)).lshr(numBits - loBitsSet);
}
/// The hash value is computed as the sum of the words and the bit width.