forked from OSchip/llvm-project
move ReplaceNode out of line, rename scc_iterator::fini -> isAtEnd().
No functionality change. llvm-svn: 101562
This commit is contained in:
parent
fe051a525f
commit
5518b81a98
|
@ -141,8 +141,8 @@ public:
|
|||
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();
|
||||
}
|
||||
|
|
|
@ -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(); }
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
Loading…
Reference in New Issue