From 5518b81a98c475accdf7ad7248ff00a9fb138419 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 16 Apr 2010 22:59:24 +0000 Subject: [PATCH] move ReplaceNode out of line, rename scc_iterator::fini -> isAtEnd(). No functionality change. llvm-svn: 101562 --- llvm/include/llvm/ADT/SCCIterator.h | 8 ++++---- llvm/include/llvm/CallGraphSCCPass.h | 10 +--------- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp | 20 +++++++++++++++----- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/llvm/include/llvm/ADT/SCCIterator.h b/llvm/include/llvm/ADT/SCCIterator.h index d4f5e5ac7c3c..315940643d14 100644 --- a/llvm/include/llvm/ADT/SCCIterator.h +++ b/llvm/include/llvm/ADT/SCCIterator.h @@ -138,11 +138,11 @@ public: typedef scc_iterator _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/llvm/include/llvm/CallGraphSCCPass.h b/llvm/include/llvm/CallGraphSCCPass.h index 3cff8f2006aa..e11b9677c74a 100644 --- a/llvm/include/llvm/CallGraphSCCPass.h +++ b/llvm/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::const_iterator iterator; iterator begin() const { return Nodes.begin(); } diff --git a/llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp b/llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp index 774f0d4ddf43..f5d24f005f59 100644 --- a/llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp +++ b/llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp @@ -307,18 +307,17 @@ bool CGPassManager::runOnModule(Module &M) { CallGraph &CG = getAnalysis(); bool Changed = doInitialization(CG); - CallGraphSCC CurSCC(this); - // Walk the callgraph in bottom-up SCC order. - for (scc_iterator CGI = scc_begin(&CG), E = scc_end(&CG); - CGI != E;) { + scc_iterator 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 &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; + } +} //===----------------------------------------------------------------------===//