Simplify the dead node elimination stuff
authorChris Lattner <sabre@nondot.org>
Wed, 25 Feb 2004 23:08:00 +0000 (23:08 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 25 Feb 2004 23:08:00 +0000 (23:08 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11848 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/DataStructure.cpp

index 5ea414e208cf5afd83746fd214cad8717163038c..3339d6152f007d472ca6a5a7553a5db0ff80ede1 100644 (file)
@@ -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.