Rework the logic to not rely on undefined behaviour (1LL << 64). Also simplify.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132537 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nick Lewycky 2011-06-03 08:25:39 +00:00
parent 444f297a78
commit b2afe8759d

View File

@ -68,14 +68,9 @@ Init *BitsRecTy::convertValue(BitInit *UI) {
/// canFitInBitfield - Return true if the number of bits is large enough to hold
/// the integer value.
static bool canFitInBitfield(int64_t Value, unsigned NumBits) {
if (Value >= 0) {
if (Value & ~((1LL << NumBits) - 1))
return false;
} else if ((Value >> NumBits) != -1 || (Value & (1LL << (NumBits-1))) == 0) {
return false;
}
return true;
// For example, with NumBits == 4, we permit Values from [-7 .. 15].
return (NumBits >= sizeof(Value) * 8) ||
(Value >> NumBits == 0) || (Value >> (NumBits-1) == -1);
}
/// convertValue from Int initializer to bits type: Split the integer up into the