mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-01 15:17:25 +00:00
The inliner was choosing to not consider call sites
that appear in the SCC as a result of inlining as candidates for inlining. Change this so that it *does* consider call sites that change from being indirect to being direct as a result of inlining. This allows it to completely "devirtualize" the testcase. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102146 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -170,7 +170,8 @@ static void HandleInlinedInvoke(InvokeInst *II, BasicBlock *FirstNewBlock,
|
||||
static void UpdateCallGraphAfterInlining(CallSite CS,
|
||||
Function::iterator FirstNewBlock,
|
||||
DenseMap<const Value*, Value*> &ValueMap,
|
||||
CallGraph &CG) {
|
||||
InlineFunctionInfo &IFI) {
|
||||
CallGraph &CG = *IFI.CG;
|
||||
const Function *Caller = CS.getInstruction()->getParent()->getParent();
|
||||
const Function *Callee = CS.getCalledFunction();
|
||||
CallGraphNode *CalleeNode = CG[Callee];
|
||||
@@ -210,6 +211,10 @@ static void UpdateCallGraphAfterInlining(CallSite CS,
|
||||
if (Function *F = CallSite(NewCall).getCalledFunction()) {
|
||||
// Indirect call site resolved to direct call.
|
||||
CallerNode->addCalledFunction(CallSite::get(NewCall), CG[F]);
|
||||
|
||||
// Remember that this callsite got devirtualized for the client of
|
||||
// InlineFunction.
|
||||
IFI.DevirtualizedCalls.push_back(NewCall);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -362,7 +367,7 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI) {
|
||||
|
||||
// Update the callgraph if requested.
|
||||
if (IFI.CG)
|
||||
UpdateCallGraphAfterInlining(CS, FirstNewBlock, ValueMap, *IFI.CG);
|
||||
UpdateCallGraphAfterInlining(CS, FirstNewBlock, ValueMap, IFI);
|
||||
}
|
||||
|
||||
// If there are any alloca instructions in the block that used to be the entry
|
||||
|
||||
Reference in New Issue
Block a user