diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp b/contrib/llvm-project/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp index f835fb26fcb8..70a3f3067d9d 100644 --- a/contrib/llvm-project/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp +++ b/contrib/llvm-project/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp @@ -104,11 +104,13 @@ static cl::opt<std::string> MemProfImportSummary( cl::desc("Import summary to use for testing the ThinLTO backend via opt"), cl::Hidden); +namespace llvm { // Indicate we are linking with an allocator that supports hot/cold operator // new interfaces. cl::opt<bool> SupportsHotColdNew( "supports-hot-cold-new", cl::init(false), cl::Hidden, cl::desc("Linking with hot/cold operator new interfaces")); +} // namespace llvm namespace { /// CRTP base for graphs built from either IR or ThinLTO summary index. @@ -791,11 +793,10 @@ CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::ContextNode:: template <typename DerivedCCG, typename FuncTy, typename CallTy> void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::ContextNode:: eraseCalleeEdge(const ContextEdge *Edge) { - auto EI = - std::find_if(CalleeEdges.begin(), CalleeEdges.end(), - [Edge](const std::shared_ptr<ContextEdge> &CalleeEdge) { - return CalleeEdge.get() == Edge; - }); + auto EI = llvm::find_if( + CalleeEdges, [Edge](const std::shared_ptr<ContextEdge> &CalleeEdge) { + return CalleeEdge.get() == Edge; + }); assert(EI != CalleeEdges.end()); CalleeEdges.erase(EI); } @@ -803,11 +804,10 @@ void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::ContextNode:: template <typename DerivedCCG, typename FuncTy, typename CallTy> void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::ContextNode:: eraseCallerEdge(const ContextEdge *Edge) { - auto EI = - std::find_if(CallerEdges.begin(), CallerEdges.end(), - [Edge](const std::shared_ptr<ContextEdge> &CallerEdge) { - return CallerEdge.get() == Edge; - }); + auto EI = llvm::find_if( + CallerEdges, [Edge](const std::shared_ptr<ContextEdge> &CallerEdge) { + return CallerEdge.get() == Edge; + }); assert(EI != CallerEdges.end()); CallerEdges.erase(EI); } @@ -2093,8 +2093,7 @@ void CallsiteContextGraph<DerivedCCG, FuncTy, CallTy>::identifyClones( for (auto &Edge : CallerEdges) { // Skip any that have been removed by an earlier recursive call. if (Edge->Callee == nullptr && Edge->Caller == nullptr) { - assert(!std::count(Node->CallerEdges.begin(), Node->CallerEdges.end(), - Edge)); + assert(!llvm::count(Node->CallerEdges, Edge)); continue; } // Ignore any caller we previously visited via another edge. @@ -2985,6 +2984,21 @@ bool MemProfContextDisambiguation::applyImport(Module &M) { if (!mayHaveMemprofSummary(CB)) continue; + auto *CalledValue = CB->getCalledOperand(); + auto *CalledFunction = CB->getCalledFunction(); + if (CalledValue && !CalledFunction) { + CalledValue = CalledValue->stripPointerCasts(); + // Stripping pointer casts can reveal a called function. + CalledFunction = dyn_cast<Function>(CalledValue); + } + // Check if this is an alias to a function. If so, get the + // called aliasee for the checks below. + if (auto *GA = dyn_cast<GlobalAlias>(CalledValue)) { + assert(!CalledFunction && + "Expected null called function in callsite for alias"); + CalledFunction = dyn_cast<Function>(GA->getAliaseeObject()); + } + CallStack<MDNode, MDNode::op_iterator> CallsiteContext( I.getMetadata(LLVMContext::MD_callsite)); auto *MemProfMD = I.getMetadata(LLVMContext::MD_memprof); @@ -3116,13 +3130,13 @@ bool MemProfContextDisambiguation::applyImport(Module &M) { CloneFuncIfNeeded(/*NumClones=*/StackNode.Clones.size()); // Should have skipped indirect calls via mayHaveMemprofSummary. - assert(CB->getCalledFunction()); - assert(!IsMemProfClone(*CB->getCalledFunction())); + assert(CalledFunction); + assert(!IsMemProfClone(*CalledFunction)); // Update the calls per the summary info. // Save orig name since it gets updated in the first iteration // below. - auto CalleeOrigName = CB->getCalledFunction()->getName(); + auto CalleeOrigName = CalledFunction->getName(); for (unsigned J = 0; J < StackNode.Clones.size(); J++) { // Do nothing if this version calls the original version of its // callee. @@ -3130,7 +3144,7 @@ bool MemProfContextDisambiguation::applyImport(Module &M) { continue; auto NewF = M.getOrInsertFunction( getMemProfFuncName(CalleeOrigName, StackNode.Clones[J]), - CB->getCalledFunction()->getFunctionType()); + CalledFunction->getFunctionType()); CallBase *CBClone; // Copy 0 is the original function. if (!J) |
