diff options
-rw-r--r-- | include/llvm/ADT/SCCIterator.h | 8 | ||||
-rw-r--r-- | include/llvm/CallGraphSCCPass.h | 10 | ||||
-rw-r--r-- | lib/Analysis/IPA/CallGraphSCCPass.cpp | 20 |
3 files changed, 20 insertions, 18 deletions
diff --git a/include/llvm/ADT/SCCIterator.h b/include/llvm/ADT/SCCIterator.h index d4f5e5ac7c..315940643d 100644 --- a/include/llvm/ADT/SCCIterator.h +++ b/include/llvm/ADT/SCCIterator.h @@ -138,11 +138,11 @@ public: typedef scc_iterator<GraphT, GT> _Self; // Provide static "constructors"... - static inline _Self begin(const GraphT& G) { return _Self(GT::getEntryNode(G)); } - static inline _Self end (const GraphT& G) { return _Self(); } + static inline _Self begin(const GraphT &G){return _Self(GT::getEntryNode(G));} + static inline _Self end (const GraphT &G) { return _Self(); } - // Direct loop termination test (I.fini() is more efficient than I == end()) - inline bool fini() const { + // Direct loop termination test: I.isAtEnd() is more efficient than I == end() + inline bool isAtEnd() const { assert(!CurrentSCC.empty() || VisitStack.empty()); return CurrentSCC.empty(); } diff --git a/include/llvm/CallGraphSCCPass.h b/include/llvm/CallGraphSCCPass.h index 3cff8f2006..e11b9677c7 100644 --- a/include/llvm/CallGraphSCCPass.h +++ b/include/llvm/CallGraphSCCPass.h @@ -93,15 +93,7 @@ public: /// ReplaceNode - This informs the SCC and the pass manager that the specified /// Old node has been deleted, and New is to be used in its place. - void ReplaceNode(CallGraphNode *Old, CallGraphNode *New) { - assert(Old != New && "Should not replace node with self"); - for (unsigned i = 0, e = Nodes.size(); i != e; ++i) - if (Nodes[i] == Old) { - Nodes[i] = New; - return; - } - assert(0 && "Node not in SCC"); - } + void ReplaceNode(CallGraphNode *Old, CallGraphNode *New); typedef std::vector<CallGraphNode*>::const_iterator iterator; iterator begin() const { return Nodes.begin(); } diff --git a/lib/Analysis/IPA/CallGraphSCCPass.cpp b/lib/Analysis/IPA/CallGraphSCCPass.cpp index 774f0d4ddf..f5d24f005f 100644 --- a/lib/Analysis/IPA/CallGraphSCCPass.cpp +++ b/lib/Analysis/IPA/CallGraphSCCPass.cpp @@ -307,18 +307,17 @@ bool CGPassManager::runOnModule(Module &M) { CallGraph &CG = getAnalysis<CallGraph>(); bool Changed = doInitialization(CG); - CallGraphSCC CurSCC(this); - // Walk the callgraph in bottom-up SCC order. - for (scc_iterator<CallGraph*> CGI = scc_begin(&CG), E = scc_end(&CG); - CGI != E;) { + scc_iterator<CallGraph*> CGI = scc_begin(&CG); + + CallGraphSCC CurSCC(&CGI); + while (!CGI.isAtEnd()) { // Copy the current SCC and increment past it so that the pass can hack // on the SCC if it wants to without invalidating our iterator. std::vector<CallGraphNode*> &NodeVec = *CGI; CurSCC.initialize(&NodeVec[0], &NodeVec[0]+NodeVec.size()); ++CGI; - // CallGraphUpToDate - Keep track of whether the callgraph is known to be // up-to-date or not. The CGSSC pass manager runs two types of passes: // CallGraphSCC Passes and other random function passes. Because other @@ -408,6 +407,17 @@ bool CGPassManager::doFinalization(CallGraph &CG) { // CallGraphSCC Implementation //===----------------------------------------------------------------------===// +/// ReplaceNode - This informs the SCC and the pass manager that the specified +/// Old node has been deleted, and New is to be used in its place. +void CallGraphSCC::ReplaceNode(CallGraphNode *Old, CallGraphNode *New) { + assert(Old != New && "Should not replace node with self"); + for (unsigned i = 0; ; ++i) { + assert(i != Nodes.size() && "Node not in SCC"); + if (Nodes[i] != Old) continue; + Nodes[i] = New; + break; + } +} //===----------------------------------------------------------------------===// |