* Eliminate ArgDSNode's completely, now rely on scalar map
* Fold call nodes that are indistinguishable for each other.  This is a big
  win for external functions like sqrt, which would multiply dramatically
  before.
* Global nodes with no edges to or from them are now eliminated from the graph.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2257 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/DataStructure/EliminateNodes.cpp b/lib/Analysis/DataStructure/EliminateNodes.cpp
index 767f7fe..6b22f69 100644
--- a/lib/Analysis/DataStructure/EliminateNodes.cpp
+++ b/lib/Analysis/DataStructure/EliminateNodes.cpp
@@ -250,11 +250,6 @@
   // Recursively mark any shadow nodes pointed to by the newly live shadow
   // nodes as also alive.
   //
-  for (unsigned i = 0, e = ArgNodes.size(); i != e; ++i)
-    MarkReferredNodesReachable(ArgNodes[i],
-                               ShadowNodes, ReachableShadowNodes,
-                               AllocNodes, ReachableAllocNodes);
-  
   for (unsigned i = 0, e = GlobalNodes.size(); i != e; ++i)
     MarkReferredNodesReachable(GlobalNodes[i],
                                ShadowNodes, ReachableShadowNodes,
@@ -273,8 +268,10 @@
 
 bool FunctionDSGraph::RemoveUnreachableNodes() {
   bool Changed = false;
-
-  while (1) {
+  bool LocalChange = true;
+  
+  while (LocalChange) {
+    LocalChange = false;
     // Reachable*Nodes - Contains true if there is an edge from a reachable
     // node to the numbered node...
     //
@@ -296,7 +293,6 @@
     // a two part process, because we must drop all references before we delete
     // the shadow nodes [in case cycles exist].
     // 
-    bool LocalChange = false;
     for (unsigned i = 0; i != ShadowNodes.size(); ++i)
       if (!ReachableShadowNodes[i]) {
         // Track all unreachable nodes...
@@ -311,7 +307,7 @@
         ReachableShadowNodes.erase(ReachableShadowNodes.begin()+i);
         ShadowNodes.erase(ShadowNodes.begin()+i);   // Remove node entry
         --i;  // Don't skip the next node.
-        LocalChange = true;
+        LocalChange = Changed = true;
       }
 
     for (unsigned i = 0; i != AllocNodes.size(); ++i)
@@ -328,13 +324,22 @@
         ReachableAllocNodes.erase(ReachableAllocNodes.begin()+i);
         AllocNodes.erase(AllocNodes.begin()+i);   // Remove node entry
         --i;  // Don't skip the next node.
-        LocalChange = true;
+        LocalChange = Changed = true;
       }
-
-    if (!LocalChange) return Changed;      // No more dead nodes...
-
-    Changed = true;
   }
+
+  // Loop over the global nodes, removing nodes that have no edges into them.
+  //
+  for (std::vector<GlobalDSNode*>::iterator I = GlobalNodes.begin();
+       I != GlobalNodes.end(); )
+    if ((*I)->getReferrers().empty()) {       // No referrers...
+      delete *I;
+      I = GlobalNodes.erase(I);                     // Remove the node...
+      Changed = true;
+    } else {
+      ++I;
+    }
+  return Changed;
 }