Use stripPointerCasts when checking for AllocaInsts for the stackprotector intrinsic.
[oota-llvm.git] / lib / VMCore / Verifier.cpp
index 86413ed6202caeb3695c461aaa396dd7f8334331..ffafc77c828129088e8b445b7fd92d1aa516ee0a 100644 (file)
@@ -1375,7 +1375,7 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
             &CI);
     break;
   case Intrinsic::stackprotector:
-    Assert1(isa<AllocaInst>(CI.getOperand(2)),
+    Assert1(isa<AllocaInst>(CI.getOperand(2)->stripPointerCasts()),
             "llvm.stackprotector parameter #2 must resolve to an alloca.",
             &CI);
     break;
@@ -1395,8 +1395,18 @@ bool Verifier::PerformTypeCheck(Intrinsic::ID ID, Function *F, const Type *Ty,
 
   if (VT < 0) {
     int Match = ~VT;
-    if (Match == 0) {
-      if (Ty != FTy->getReturnType()) {
+    const Type *RetTy = FTy->getReturnType();
+    const StructType *ST = dyn_cast<StructType>(RetTy);
+    unsigned NumRets = 1;
+
+    if (ST)
+      NumRets = ST->getNumElements();
+
+    if (Match <= static_cast<int>(NumRets - 1)) {
+      if (ST)
+        RetTy = ST->getElementType(Match);
+
+      if (Ty != RetTy) {
         CheckFailed("Intrinsic parameter #" + utostr(ArgNo - 1) + " does not "
                     "match return type.", F);
         return false;