diff --git a/llvm/include/llvm/Transforms/Utils/Cloning.h b/llvm/include/llvm/Transforms/Utils/Cloning.h index 463c5d48e9ee..22bdc99ac18d 100644 --- a/llvm/include/llvm/Transforms/Utils/Cloning.h +++ b/llvm/include/llvm/Transforms/Utils/Cloning.h @@ -176,14 +176,13 @@ public: /// get copied into the caller. SmallVector StaticAllocas; - /// DevirtualizedCalls - InlineFunction fills this in with callsites that were - /// inlined from the callee that went from being indirect calls to direct - /// calls due to inlining. This is only filled in if CG is non-null. - SmallVector DevirtualizedCalls; + /// InlinedCalls - InlineFunction fills this in with callsites that were + /// inlined from the callee. This is only filled in if CG is non-null. + SmallVector InlinedCalls; void reset() { StaticAllocas.clear(); - DevirtualizedCalls.clear(); + InlinedCalls.clear(); } }; diff --git a/llvm/lib/Transforms/IPO/Inliner.cpp b/llvm/lib/Transforms/IPO/Inliner.cpp index 4d4af727576f..b785bb0a9390 100644 --- a/llvm/lib/Transforms/IPO/Inliner.cpp +++ b/llvm/lib/Transforms/IPO/Inliner.cpp @@ -420,17 +420,17 @@ bool Inliner::runOnSCC(CallGraphSCC &SCC) { continue; ++NumInlined; - // If inlining this function devirtualized any call sites, throw them + // If inlining this function gave us any new call sites, throw them // onto our worklist to process. They are useful inline candidates. - if (!InlineInfo.DevirtualizedCalls.empty()) { + if (!InlineInfo.InlinedCalls.empty()) { // Create a new inline history entry for this, so that we remember // that these new callsites came about due to inlining Callee. int NewHistoryID = InlineHistory.size(); InlineHistory.push_back(std::make_pair(Callee, InlineHistoryID)); - for (unsigned i = 0, e = InlineInfo.DevirtualizedCalls.size(); + for (unsigned i = 0, e = InlineInfo.InlinedCalls.size(); i != e; ++i) { - Value *Ptr = InlineInfo.DevirtualizedCalls[i]; + Value *Ptr = InlineInfo.InlinedCalls[i]; CallSites.push_back(std::make_pair(CallSite(Ptr), NewHistoryID)); } } diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index c30f51444b43..91390bc7beca 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -201,7 +201,11 @@ static void UpdateCallGraphAfterInlining(CallSite CS, // add. Check for this case. Instruction *NewCall = dyn_cast(VMI->second); if (NewCall == 0) continue; - + + // Remember that this call site got inlined for the client of + // InlineFunction. + IFI.InlinedCalls.push_back(NewCall); + // It's possible that inlining the callsite will cause it to go from an // indirect to a direct call by resolving a function pointer. If this // happens, set the callee of the new call site to a more precise @@ -212,14 +216,10 @@ static void UpdateCallGraphAfterInlining(CallSite CS, // 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; } CallerNode->addCalledFunction(CallSite::get(NewCall), I->second); - IFI.DevirtualizedCalls.push_back(NewCall); } // Update the call graph by deleting the edge from Callee to Caller. We must