From a91ef879e8d5f12d4106ca2ae90c760c12bb8b4b Mon Sep 17 00:00:00 2001 From: Teresa Johnson Date: Tue, 29 Jul 2025 07:37:38 -0700 Subject: [PATCH] [MemProf] Use DenseMap for call map (NFC) There is no reason to use std::map for the call maps maintained for function clones during function clone assignment, as we don't iterate over them and don't need deterministic ordering, so use the more efficient DenseMap. --- .../IPO/MemProfContextDisambiguation.cpp | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp b/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp index 63aaa18c6b43e..95865a88a00a9 100644 --- a/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp +++ b/llvm/lib/Transforms/IPO/MemProfContextDisambiguation.cpp @@ -732,7 +732,7 @@ class CallsiteContextGraph { /// of the functions tracked calls to their new versions in the CallMap. /// Assigns new clones to clone number CloneNo. FuncInfo cloneFunctionForCallsite( - FuncInfo &Func, CallInfo &Call, std::map &CallMap, + FuncInfo &Func, CallInfo &Call, DenseMap &CallMap, std::vector &CallsWithMetadataInFunc, unsigned CloneNo) { return static_cast(this)->cloneFunctionForCallsite( Func, Call, CallMap, CallsWithMetadataInFunc, CloneNo); @@ -899,7 +899,7 @@ class ModuleCallsiteContextGraph CallsiteContextGraph::FuncInfo cloneFunctionForCallsite(FuncInfo &Func, CallInfo &Call, - std::map &CallMap, + DenseMap &CallMap, std::vector &CallsWithMetadataInFunc, unsigned CloneNo); std::string getLabel(const Function *Func, const Instruction *Call, @@ -991,7 +991,7 @@ class IndexCallsiteContextGraph CallsiteContextGraph::FuncInfo cloneFunctionForCallsite(FuncInfo &Func, CallInfo &Call, - std::map &CallMap, + DenseMap &CallMap, std::vector &CallsWithMetadataInFunc, unsigned CloneNo); std::string getLabel(const FunctionSummary *Func, const IndexCall &Call, @@ -4062,7 +4062,7 @@ static void updateSubprogramLinkageName(Function *NewFunc, StringRef Name) { CallsiteContextGraph::FuncInfo ModuleCallsiteContextGraph::cloneFunctionForCallsite( - FuncInfo &Func, CallInfo &Call, std::map &CallMap, + FuncInfo &Func, CallInfo &Call, DenseMap &CallMap, std::vector &CallsWithMetadataInFunc, unsigned CloneNo) { // Use existing LLVM facilities for cloning and obtaining Call in clone ValueToValueMapTy VMap; @@ -4085,7 +4085,7 @@ ModuleCallsiteContextGraph::cloneFunctionForCallsite( CallsiteContextGraph::FuncInfo IndexCallsiteContextGraph::cloneFunctionForCallsite( - FuncInfo &Func, CallInfo &Call, std::map &CallMap, + FuncInfo &Func, CallInfo &Call, DenseMap &CallMap, std::vector &CallsWithMetadataInFunc, unsigned CloneNo) { // Check how many clones we have of Call (and therefore function). // The next clone number is the current size of versions array. @@ -4506,7 +4506,7 @@ bool CallsiteContextGraph::assignFunctions() { FuncInfo FuncClone; // Remappings of each call of interest (from original uncloned call to the // corresponding cloned call in this function clone). - std::map CallMap; + DenseMap CallMap; }; // Walk all functions for which we saw calls with memprof metadata, and handle @@ -4542,7 +4542,7 @@ bool CallsiteContextGraph::assignFunctions() { FuncCloneToCurNodeCloneMap[FuncClone] = CallsiteClone; assert(FuncCloneInfos.size() > FuncClone.cloneNo()); - std::map &CallMap = + DenseMap &CallMap = FuncCloneInfos[FuncClone.cloneNo()].CallMap; CallInfo CallClone(Call); if (auto It = CallMap.find(Call); It != CallMap.end()) @@ -4594,7 +4594,8 @@ bool CallsiteContextGraph::assignFunctions() { })); // Initialize with empty call map, assign Clone to original function // and its callers, and skip to the next clone. - FuncCloneInfos.push_back({OrigFunc, {}}); + FuncCloneInfos.push_back( + {OrigFunc, DenseMap()}); AssignCallsiteCloneToFuncClone( OrigFunc, Call, Clone, AllocationCallToContextNodeMap.count(Call)); @@ -4627,7 +4628,7 @@ bool CallsiteContextGraph::assignFunctions() { // Clone function and save it along with the CallInfo map created // during cloning in the FuncCloneInfos. - std::map NewCallMap; + DenseMap NewCallMap; unsigned CloneNo = FuncCloneInfos.size(); assert(CloneNo > 0 && "Clone 0 is the original function, which " "should already exist in the map"); @@ -4734,7 +4735,7 @@ bool CallsiteContextGraph::assignFunctions() { // CallMap is set up as indexed by original Call at clone 0. CallInfo OrigCall(Callee->getOrigNode()->Call); OrigCall.setCloneNo(0); - std::map &CallMap = + DenseMap &CallMap = FuncCloneInfos[NewFuncClone.cloneNo()].CallMap; assert(CallMap.count(OrigCall)); CallInfo NewCall(CallMap[OrigCall]);