mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-17 20:23:59 +00:00
Update call graph after inlining invoke.
Patch by Jay Foad. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68120 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -41,7 +41,8 @@ bool llvm::InlineFunction(InvokeInst *II, CallGraph *CG, const TargetData *TD) {
|
||||
/// block of the inlined code (the last block is the end of the function),
|
||||
/// and InlineCodeInfo is information about the code that got inlined.
|
||||
static void HandleInlinedInvoke(InvokeInst *II, BasicBlock *FirstNewBlock,
|
||||
ClonedCodeInfo &InlinedCodeInfo) {
|
||||
ClonedCodeInfo &InlinedCodeInfo,
|
||||
CallGraph *CG) {
|
||||
BasicBlock *InvokeDest = II->getUnwindDest();
|
||||
std::vector<Value*> InvokeDestPHIValues;
|
||||
|
||||
@ -93,6 +94,22 @@ static void HandleInlinedInvoke(InvokeInst *II, BasicBlock *FirstNewBlock,
|
||||
// Make sure that anything using the call now uses the invoke!
|
||||
CI->replaceAllUsesWith(II);
|
||||
|
||||
// Update the callgraph.
|
||||
if (CG) {
|
||||
// We should be able to do this:
|
||||
// (*CG)[Caller]->replaceCallSite(CI, II);
|
||||
// but that fails if the old call site isn't in the call graph,
|
||||
// which, because of LLVM bug 3601, it sometimes isn't.
|
||||
CallGraphNode *CGN = (*CG)[Caller];
|
||||
for (CallGraphNode::iterator NI = CGN->begin(), NE = CGN->end();
|
||||
NI != NE; ++NI) {
|
||||
if (NI->first == CI) {
|
||||
NI->first = II;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Delete the unconditional branch inserted by splitBasicBlock
|
||||
BB->getInstList().pop_back();
|
||||
Split->getInstList().pop_front(); // Delete the original call
|
||||
@ -433,7 +450,7 @@ bool llvm::InlineFunction(CallSite CS, CallGraph *CG, const TargetData *TD) {
|
||||
// any inlined 'unwind' instructions into branches to the invoke exception
|
||||
// destination, and call instructions into invoke instructions.
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(TheCall))
|
||||
HandleInlinedInvoke(II, FirstNewBlock, InlinedFunctionInfo);
|
||||
HandleInlinedInvoke(II, FirstNewBlock, InlinedFunctionInfo, CG);
|
||||
|
||||
// If we cloned in _exactly one_ basic block, and if that block ends in a
|
||||
// return instruction, we splice the body of the inlined callee directly into
|
||||
|
Reference in New Issue
Block a user