Fix the verification for overloaded intrinsic types. Check that they are
authorDan Gohman <gohman@apple.com>
Thu, 16 Aug 2007 22:06:45 +0000 (22:06 +0000)
committerDan Gohman <gohman@apple.com>
Thu, 16 Aug 2007 22:06:45 +0000 (22:06 +0000)
what they're supposed to be before using them.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41130 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Verifier.cpp

index 0c4ca642098e7926cc15ee3f01ab38b2440d8b12..ae27651ee5cb69d017c6733c28fbac6aaad1a46c 100644 (file)
@@ -1144,6 +1144,15 @@ void Verifier::VerifyIntrinsicPrototype(Intrinsic::ID ID,
         }
       }
     } else if (VT == MVT::iAny) {
+      if (!EltTy->isInteger()) {
+        if (ArgNo == 0)
+          CheckFailed("Intrinsic result type is not "
+                      "an integer type.", F);
+        else
+          CheckFailed("Intrinsic parameter #" + utostr(ArgNo-1) + " is not "
+                      "an integer type.", F);
+        break;
+      }
       unsigned GotBits = cast<IntegerType>(EltTy)->getBitWidth();
       Suffix += ".";
       if (EltTy != Ty)
@@ -1158,10 +1167,6 @@ void Verifier::VerifyIntrinsicPrototype(Intrinsic::ID ID,
           break;
       }
     } else if (VT == MVT::fAny) {
-      Suffix += ".";
-      if (EltTy != Ty)
-        Suffix += "v" + utostr(NumElts);
-      Suffix += MVT::getValueTypeString(MVT::getValueType(EltTy));
       if (!EltTy->isFloatingPoint()) {
         if (ArgNo == 0)
           CheckFailed("Intrinsic result type is not "
@@ -1171,10 +1176,18 @@ void Verifier::VerifyIntrinsicPrototype(Intrinsic::ID ID,
                       "a floating-point type.", F);
         break;
       }
+      Suffix += ".";
+      if (EltTy != Ty)
+        Suffix += "v" + utostr(NumElts);
+      Suffix += MVT::getValueTypeString(MVT::getValueType(EltTy));
     } else if (VT == MVT::iPTR) {
       if (!isa<PointerType>(Ty)) {
-        CheckFailed("Intrinsic parameter #" + utostr(ArgNo-1) + " is not a "
-                    "pointer and a pointer is required.", F);
+        if (ArgNo == 0)
+          CheckFailed("Intrinsic result type is not a "
+                      "pointer and a pointer is required.", F);
+        else
+          CheckFailed("Intrinsic parameter #" + utostr(ArgNo-1) + " is not a "
+                      "pointer and a pointer is required.", F);
         break;
       }
     } else if (MVT::isVector(VT)) {