Reject integer literals that are out of range for their type.
authorChris Lattner <sabre@nondot.org>
Thu, 3 Nov 2005 05:46:11 +0000 (05:46 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 3 Nov 2005 05:46:11 +0000 (05:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24162 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/DAGISelEmitter.cpp

index 29206ce3b4cddb80be0065939dcec71fbc95a7ce..5cc1f273af3b3846afa3bc608058c3862f81e5c7 100644 (file)
@@ -482,10 +482,28 @@ static unsigned char getIntrinsicType(Record *R, bool NotRegisters,
 /// exception.
 bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
   if (isLeaf()) {
-    if (DefInit *DI = dynamic_cast<DefInit*>(getLeafValue()))
+    if (DefInit *DI = dynamic_cast<DefInit*>(getLeafValue())) {
       // If it's a regclass or something else known, include the type.
       return UpdateNodeType(getIntrinsicType(DI->getDef(), NotRegisters, TP),
                             TP);
+    } else if (IntInit *II = dynamic_cast<IntInit*>(getLeafValue())) {
+      // Int inits are always integers. :)
+      bool MadeChange = UpdateNodeType(MVT::isInt, TP);
+      
+      if (hasTypeSet()) {
+        unsigned Size = MVT::getSizeInBits(getType());
+        // Make sure that the value is representable for this type.
+        if (Size < 32) {
+          int Val = (II->getValue() << (32-Size)) >> (32-Size);
+          if (Val != II->getValue())
+            TP.error("Sign-extended integer value '" + itostr(II->getValue()) +
+                     "' is out of range for type 'MVT::" + 
+                     getEnumName(getType()) + "'!");
+        }
+      }
+      
+      return MadeChange;
+    }
     return false;
   }