aboutsummaryrefslogtreecommitdiff
path: root/lib/Bytecode
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2006-01-19 07:02:16 +0000
committerReid Spencer <rspencer@reidspencer.com>2006-01-19 07:02:16 +0000
commite1e96c0820330de3d312ae2cde796cda5f07ba77 (patch)
tree30ed92b01b6013341d62e5986def2c09dd864240 /lib/Bytecode
parente559184d7025523d3ac520ada1726a7d19dd29f1 (diff)
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
Diffstat (limited to 'lib/Bytecode')
-rw-r--r--lib/Bytecode/Reader/Reader.cpp26
1 files changed, 19 insertions, 7 deletions
diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp
index 55e1606230..6c91a4ad6a 100644
--- a/lib/Bytecode/Reader/Reader.cpp
+++ b/lib/Bytecode/Reader/Reader.cpp
@@ -670,6 +670,7 @@ void BytecodeReader::ParseInstruction(std::vector<unsigned> &Oprnds,
getValue(iType, Oprnds[0]),
getValue(iType, Oprnds[1]));
+ bool isCall = false;
switch (Opcode) {
default:
if (Result == 0)
@@ -857,13 +858,9 @@ void BytecodeReader::ParseInstruction(std::vector<unsigned> &Oprnds,
}
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 @@ void BytecodeReader::ParseInstruction(std::vector<unsigned> &Oprnds,
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 @@ void BytecodeReader::ParseInstruction(std::vector<unsigned> &Oprnds,
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 @@ void BytecodeReader::ParseModuleGlobalInfo() {
// 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.