mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-12 15:30:56 +00:00
Don't invoke undefined behavior in shifts in the functions getHighBitsSet
and getLowBitsSet. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35311 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8f969ee62c
commit
ca76fc2cd3
@ -357,12 +357,11 @@ public:
|
||||
/// @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 @@ public:
|
||||
/// @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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user