1. Identify bytecode modules that have upgraded intrinsics by setting a
   boolean flag if we read a function prototype that needs upgrading.
2. Don't upgrade the CallInst instruction until after its been inserted
   into the basic block, and only if we know that we have seen an
   upgraded intrinsic function.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25448 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp
index 55e1606..6c91a4a 100644
--- a/lib/Bytecode/Reader/Reader.cpp
+++ b/lib/Bytecode/Reader/Reader.cpp
@@ -670,6 +670,7 @@
                                     getValue(iType, Oprnds[0]),
                                     getValue(iType, Oprnds[1]));
 
+  bool isCall = false;
   switch (Opcode) {
   default:
     if (Result == 0)
@@ -857,13 +858,9 @@
     }
 
     Result = new CallInst(F, Params);
-    if (CallInst* newCI = UpgradeIntrinsicCall(cast<CallInst>(Result))) {
-      Result->replaceAllUsesWith(newCI);
-      Result->eraseFromParent();
-      Result = newCI;
-    }
     if (isTailCall) cast<CallInst>(Result)->setTailCall();
     if (CallingConv) cast<CallInst>(Result)->setCallingConv(CallingConv);
+    isCall = true;
     break;
   }
   case 56:                     // Invoke with encoded CC
@@ -1034,6 +1031,15 @@
     break;
   }  // end switch(Opcode)
 
+  BB->getInstList().push_back(Result);
+
+  if (this->hasUpgradedIntrinsicFunctions && isCall)
+    if (Instruction* inst = UpgradeIntrinsicCall(cast<CallInst>(Result))) {
+      Result->replaceAllUsesWith(inst);
+      Result->eraseFromParent();
+      Result = inst;
+    }
+
   unsigned TypeSlot;
   if (Result->getType() == InstTy)
     TypeSlot = iType;
@@ -1041,7 +1047,6 @@
     TypeSlot = getTypeSlot(Result->getType());
 
   insertValue(Result, TypeSlot, FunctionValues);
-  BB->getInstList().push_back(Result);
 }
 
 /// Get a particular numbered basic block, which might be a forward reference.
@@ -2026,7 +2031,14 @@
     // Insert the place holder.
     Function *Func = new Function(FTy, GlobalValue::ExternalLinkage,
                                   "", TheModule);
-    UpgradeIntrinsicFunction(Func);
+
+    // Replace with upgraded intrinsic function, if applicable.
+    if (Function* upgrdF = UpgradeIntrinsicFunction(Func)) {
+      hasUpgradedIntrinsicFunctions = true;
+      Func->eraseFromParent();
+      Func = upgrdF;
+    }
+
     insertValue(Func, (FnSignature & (~0U >> 1)) >> 5, ModuleValues);
 
     // Flags are not used yet.