diff options
author | Chris Lattner <sabre@nondot.org> | 2004-02-25 23:08:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-02-25 23:08:00 +0000 |
commit | 6ce59b4a0336903ab3fc746891682fb8a2b6c2e9 (patch) | |
tree | 3e2e2dde8955fa8b6e5e783c61dd408b30705a7c /llvm/lib/Analysis/DataStructure/DataStructure.cpp | |
parent | 5e5e060618e25529cbeb1d5ef05c8669d4c0f7de (diff) | |
download | bcm5719-llvm-6ce59b4a0336903ab3fc746891682fb8a2b6c2e9.tar.gz bcm5719-llvm-6ce59b4a0336903ab3fc746891682fb8a2b6c2e9.zip |
Simplify the dead node elimination stuff
Make the incompleteness marker faster by looping directly over the globals
instead of over the scalars to find the globals
Fix a bug where we didn't mark a global incomplete if it didn't have any
outgoing edges. This wouldn't break any current clients but is still wrong.
llvm-svn: 11848
Diffstat (limited to 'llvm/lib/Analysis/DataStructure/DataStructure.cpp')
-rw-r--r-- | llvm/lib/Analysis/DataStructure/DataStructure.cpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/llvm/lib/Analysis/DataStructure/DataStructure.cpp b/llvm/lib/Analysis/DataStructure/DataStructure.cpp index 5ea414e208c..3339d6152f0 100644 --- a/llvm/lib/Analysis/DataStructure/DataStructure.cpp +++ b/llvm/lib/Analysis/DataStructure/DataStructure.cpp @@ -1351,9 +1351,9 @@ void DSGraph::markIncompleteNodes(unsigned Flags) { // Mark all global nodes as incomplete... if ((Flags & DSGraph::IgnoreGlobals) == 0) - for (node_iterator NI = node_begin(), E = node_end(); NI != E; ++NI) - if ((*NI)->isGlobalNode() && (*NI)->getNumLinks()) - markIncompleteNode(*NI); + for (DSScalarMap::global_iterator I = ScalarMap.global_begin(), + E = ScalarMap.global_end(); I != E; ++I) + markIncompleteNode(ScalarMap[*I].getNode()); } static inline void killIfUselessEdge(DSNodeHandle &Edge) { @@ -1773,16 +1773,18 @@ void DSGraph::removeDeadNodes(unsigned Flags) { // std::vector<DSNode*> DeadNodes; DeadNodes.reserve(Nodes.size()); - for (NodeListTy::iterator NI = Nodes.begin(), E = Nodes.end(); NI != E;) - if (!Alive.count(NI)) { - ++NumDNE; - DSNode *N = Nodes.remove(NI++); + for (NodeListTy::iterator NI = Nodes.begin(), E = Nodes.end(); NI != E;) { + DSNode *N = NI++; + assert(!N->isForwarding() && "Forwarded node in nodes list?"); + + if (!Alive.count(N)) { + Nodes.remove(N); + assert(!N->isForwarding() && "Cannot remove a forwarding node!"); DeadNodes.push_back(N); N->dropAllReferences(); - } else { - assert(NI->getForwardNode() == 0 && "Alive forwarded node?"); - ++NI; + ++NumDNE; } + } // Remove all unreachable globals from the ScalarMap. // If flag RemoveUnreachableGlobals is set, GlobalNodes has only dead nodes. |