[llvm-commits] CVS: llvm/lib/Analysis/DataStructure/DataStructure.cpp

Chris Lattner lattner at cs.uiuc.edu
Sat Feb 7 18:24:02 PST 2004


Changes in directory llvm/lib/Analysis/DataStructure:

DataStructure.cpp updated: 1.150 -> 1.151

---
Log message:

Change to use node_iterators instead of direct access to Nodes


---
Diffs of the changes:  (+43 -34)

Index: llvm/lib/Analysis/DataStructure/DataStructure.cpp
diff -u llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.150 llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.151
--- llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.150	Sat Feb  7 17:58:05 2004
+++ llvm/lib/Analysis/DataStructure/DataStructure.cpp	Sat Feb  7 18:23:16 2004
@@ -1101,31 +1101,36 @@
   assert(OldNodeMap.empty() && "Returned OldNodeMap should be empty!");
   assert(&G != this && "Cannot clone graph into itself!");
 
-  unsigned FN = Nodes.size();           // First new node...
-
-  // Duplicate all of the nodes, populating the node map...
-  Nodes.reserve(FN+G.Nodes.size());
+  // Remember the last node that existed before, or node_end() if there are no
+  // nodes.
+  node_iterator FN = node_end();
+  if (FN != node_begin()) --FN;
 
   // Remove alloca or mod/ref bits as specified...
   unsigned BitsToClear = ((CloneFlags & StripAllocaBit)? DSNode::AllocaNode : 0)
     | ((CloneFlags & StripModRefBits)? (DSNode::Modified | DSNode::Read) : 0)
     | ((CloneFlags & StripIncompleteBit)? DSNode::Incomplete : 0);
   BitsToClear |= DSNode::DEAD;  // Clear dead flag...
-  for (unsigned i = 0, e = G.Nodes.size(); i != e; ++i) {
-    DSNode *Old = G.Nodes[i];
-    if (!Old->isForwarding()) {
-      DSNode *New = new DSNode(*Old, this);
+  for (node_iterator I = G.node_begin(), E = G.node_end(); I != E; ++I)
+    if (!(*I)->isForwarding()) {
+      DSNode *New = new DSNode(**I, this);
       New->maskNodeTypes(~BitsToClear);
-      OldNodeMap[Old] = New;
+      OldNodeMap[*I] = New;
     }
-  }
+
 #ifndef NDEBUG
   Timer::addPeakMemoryMeasurement();
 #endif
 
+  // Move FN to the first newly added node.
+  if (FN != node_end())
+    ++FN;
+  else
+    FN = node_begin();
+
   // Rewrite the links in the new nodes to point into the current graph now.
-  for (unsigned i = FN, e = Nodes.size(); i != e; ++i)
-    Nodes[i]->remapLinks(OldNodeMap);
+  for (; FN != node_end(); ++FN)
+    (*FN)->remapLinks(OldNodeMap);
 
   // Copy the scalar map... merging all of the global nodes...
   for (DSScalarMap::const_iterator I = G.ScalarMap.begin(),
@@ -1227,9 +1232,10 @@
     // If the user requested it, add the nodes that we need to clone to the
     // RootNodes set.
     if (!EnableDSNodeGlobalRootsHack)
-      for (unsigned i = 0, e = Graph.Nodes.size(); i != e; ++i)
-        if (!Graph.Nodes[i]->getGlobals().empty())
-          RC.getClonedNH(Graph.Nodes[i]);
+      for (node_iterator NI = Graph.node_begin(), E = Graph.node_end();
+           NI != E; ++NI)
+        if (!(*NI)->getGlobals().empty())
+          RC.getClonedNH(*NI);
                                                  
   } else {
     DSNodeHandle RetVal = getReturnNodeFor(F);
@@ -1335,9 +1341,9 @@
 
   // Mark all global nodes as incomplete...
   if ((Flags & DSGraph::IgnoreGlobals) == 0)
-    for (unsigned i = 0, e = Nodes.size(); i != e; ++i)
-      if (Nodes[i]->isGlobalNode() && Nodes[i]->getNumLinks())
-        markIncompleteNode(Nodes[i]);
+    for (node_iterator NI = node_begin(), E = node_end(); NI != E; ++NI)
+      if ((*NI)->isGlobalNode() && (*NI)->getNumLinks())
+        markIncompleteNode(*NI);
 }
 
 static inline void killIfUselessEdge(DSNodeHandle &Edge) {
@@ -1466,8 +1472,8 @@
   // Loop over all of the nodes in the graph, calling getNode on each field.
   // This will cause all nodes to update their forwarding edges, causing
   // forwarded nodes to be delete-able.
-  for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
-    DSNode *N = Nodes[i];
+  for (node_iterator NI = node_begin(), E = node_end(); NI != E; ++NI) {
+    DSNode *N = *NI;
     for (unsigned l = 0, e = N->getNumLinks(); l != e; ++l)
       N->getLink(l*N->getPointerSize()).getNode();
   }
@@ -1489,13 +1495,15 @@
 #endif
   bool isGlobalsGraph = !GlobalsGraph;
 
-  for (unsigned i = 0; i != Nodes.size(); ++i) {
-    DSNode *Node = Nodes[i];
+  for (NodeListTy::iterator NI = Nodes.begin(), E = Nodes.end(); NI != E; ) {
+    DSNode *Node = *NI;
 
     // Do not remove *any* global nodes in the globals graph.
     // This is a special case because such nodes may not have I, M, R flags set.
-    if (Node->isGlobalNode() && isGlobalsGraph)
+    if (Node->isGlobalNode() && isGlobalsGraph) {
+      ++NI;
       continue;
+    }
 
     if (Node->isComplete() && !Node->isModified() && !Node->isRead()) {
       // This is a useless node if it has no mod/ref info (checked above),
@@ -1525,9 +1533,10 @@
 
     if (Node->getNodeFlags() == 0 && Node->hasNoReferrers()) {
       // This node is dead!
-      delete Node;                        // Free memory...
-      Nodes[i--] = Nodes.back();
-      Nodes.pop_back();                   // Remove from node list...
+      delete Node;                        // Free node memory.
+      NI = Nodes.erase(NI);               // Remove from node list.
+    } else {
+      ++NI;
     }
   }
 }
@@ -1756,16 +1765,16 @@
   //
   std::vector<DSNode*> DeadNodes;
   DeadNodes.reserve(Nodes.size());
-  for (unsigned i = 0; i != Nodes.size(); ++i)
-    if (!Alive.count(Nodes[i])) {
+  for (NodeListTy::iterator NI = Nodes.begin(), E = Nodes.end(); NI != E;)
+    if (!Alive.count(*NI)) {
       ++NumDNE;
-      DSNode *N = Nodes[i];
-      Nodes[i--] = Nodes.back();            // move node to end of vector
-      Nodes.pop_back();                     // Erase node from alive list.
+      DSNode *N = *NI;
+      NI = Nodes.erase(NI);          // Erase node from list.
       DeadNodes.push_back(N);
       N->dropAllReferences();
     } else {
-      assert(Nodes[i]->getForwardNode() == 0 && "Alive forwarded node?");
+      assert((*NI)->getForwardNode() == 0 && "Alive forwarded node?");
+      ++NI;
     }
 
   // Remove all unreachable globals from the ScalarMap.
@@ -1785,8 +1794,8 @@
 }
 
 void DSGraph::AssertGraphOK() const {
-  for (unsigned i = 0, e = Nodes.size(); i != e; ++i)
-    Nodes[i]->assertOK();
+  for (node_iterator NI = node_begin(), E = node_end(); NI != E; ++NI)
+    (*NI)->assertOK();
 
   for (ScalarMapTy::const_iterator I = ScalarMap.begin(),
          E = ScalarMap.end(); I != E; ++I) {





More information about the llvm-commits mailing list