From 0b623baeb3677a87899214bc0f6767fa1c75e9d3 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Wed, 23 Apr 2014 04:00:17 +0000 Subject: [PATCH] [LCG] Switch the Callee sets to be DenseMaps pointing to the index into the Callee list. This is going to be quite important to prevent removal from going quadratic. No functionality changed at this point, this is one of the refactoring patches I've broken out of my initial work toward mutation updates of the call graph. llvm-svn: 206938 --- llvm/include/llvm/Analysis/LazyCallGraph.h | 9 +++++---- llvm/lib/Analysis/LazyCallGraph.cpp | 15 ++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/llvm/include/llvm/Analysis/LazyCallGraph.h b/llvm/include/llvm/Analysis/LazyCallGraph.h index 66d3d5058505..60f4955ae946 100644 --- a/llvm/include/llvm/Analysis/LazyCallGraph.h +++ b/llvm/include/llvm/Analysis/LazyCallGraph.h @@ -187,10 +187,10 @@ public: int LowLink; mutable NodeVectorT Callees; - SmallPtrSet CalleeSet; + DenseMap CalleeIndexMap; /// \brief Basic constructor implements the scanning of F into Callees and - /// CalleeSet. + /// CalleeIndexMap. Node(LazyCallGraph &G, Function &F); public: @@ -333,8 +333,9 @@ private: /// escape at the module scope. NodeVectorT EntryNodes; - /// \brief Set of the entry nodes to the graph. - SmallPtrSet EntryNodeSet; + /// \brief Map of the entry nodes in the graph to their indices in + /// \c EntryNodes. + DenseMap EntryIndexMap; /// \brief Allocator that holds all the call graph SCCs. SpecificBumpPtrAllocator SCCBPA; diff --git a/llvm/lib/Analysis/LazyCallGraph.cpp b/llvm/lib/Analysis/LazyCallGraph.cpp index 8ae1840fced5..201e644da9b7 100644 --- a/llvm/lib/Analysis/LazyCallGraph.cpp +++ b/llvm/lib/Analysis/LazyCallGraph.cpp @@ -23,7 +23,7 @@ using namespace llvm; static void findCallees( SmallVectorImpl &Worklist, SmallPtrSetImpl &Visited, SmallVectorImpl> &Callees, - SmallPtrSetImpl &CalleeSet) { + DenseMap &CalleeIndexMap) { while (!Worklist.empty()) { Constant *C = Worklist.pop_back_val(); @@ -38,7 +38,8 @@ static void findCallees( // alias. Then a test of the address of the weak function against the new // strong definition's address would be an effective way to determine the // safety of optimizing a direct call edge. - if (!F->isDeclaration() && CalleeSet.insert(F)) { + if (!F->isDeclaration() && + CalleeIndexMap.insert(std::make_pair(F, Callees.size())).second) { DEBUG(dbgs() << " Added callable function: " << F->getName() << "\n"); Callees.push_back(F); @@ -71,7 +72,7 @@ LazyCallGraph::Node::Node(LazyCallGraph &G, Function &F) // We've collected all the constant (and thus potentially function or // function containing) operands to all of the instructions in the function. // Process them (recursively) collecting every function found. - findCallees(Worklist, Visited, Callees, CalleeSet); + findCallees(Worklist, Visited, Callees, CalleeIndexMap); } LazyCallGraph::LazyCallGraph(Module &M) : NextDFSNumber(0) { @@ -79,7 +80,7 @@ LazyCallGraph::LazyCallGraph(Module &M) : NextDFSNumber(0) { << "\n"); for (Function &F : M) if (!F.isDeclaration() && !F.hasLocalLinkage()) - if (EntryNodeSet.insert(&F)) { + if (EntryIndexMap.insert(std::make_pair(&F, EntryNodes.size())).second) { DEBUG(dbgs() << " Adding '" << F.getName() << "' to entry set of the graph.\n"); EntryNodes.push_back(&F); @@ -95,7 +96,7 @@ LazyCallGraph::LazyCallGraph(Module &M) : NextDFSNumber(0) { DEBUG(dbgs() << " Adding functions referenced by global initializers to the " "entry set.\n"); - findCallees(Worklist, Visited, EntryNodes, EntryNodeSet); + findCallees(Worklist, Visited, EntryNodes, EntryIndexMap); for (auto &Entry : EntryNodes) if (Function *F = Entry.dyn_cast()) @@ -107,7 +108,7 @@ LazyCallGraph::LazyCallGraph(Module &M) : NextDFSNumber(0) { LazyCallGraph::LazyCallGraph(LazyCallGraph &&G) : BPA(std::move(G.BPA)), NodeMap(std::move(G.NodeMap)), EntryNodes(std::move(G.EntryNodes)), - EntryNodeSet(std::move(G.EntryNodeSet)), SCCBPA(std::move(G.SCCBPA)), + EntryIndexMap(std::move(G.EntryIndexMap)), SCCBPA(std::move(G.SCCBPA)), SCCMap(std::move(G.SCCMap)), LeafSCCs(std::move(G.LeafSCCs)), DFSStack(std::move(G.DFSStack)), SCCEntryNodes(std::move(G.SCCEntryNodes)), @@ -119,7 +120,7 @@ LazyCallGraph &LazyCallGraph::operator=(LazyCallGraph &&G) { BPA = std::move(G.BPA); NodeMap = std::move(G.NodeMap); EntryNodes = std::move(G.EntryNodes); - EntryNodeSet = std::move(G.EntryNodeSet); + EntryIndexMap = std::move(G.EntryIndexMap); SCCBPA = std::move(G.SCCBPA); SCCMap = std::move(G.SCCMap); LeafSCCs = std::move(G.LeafSCCs);