Rework the logic to not rely on undefined behaviour (1LL << 64). Also simplify.
authorNick Lewycky <nicholas@mxc.ca>
Fri, 3 Jun 2011 08:25:39 +0000 (08:25 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Fri, 3 Jun 2011 08:25:39 +0000 (08:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132537 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/Record.cpp

index c427b761d8d64bcf12018d8b1cc482fd6c130ead..8ac8cd9716e458940a92765d20fc1149dfccea13 100644 (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