[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Nov 8 10:52:39 PST 2005



Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAG.cpp updated: 1.207 -> 1.208
---
Log message:

Clean up RemoveDeadNodes significantly, by eliminating the need for a temporary
set and eliminating the need to iterate whenever something is removed (which
can be really slow in some cases).  Thx to Jim for pointing out something silly
I was getting stuck on. :)


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

 SelectionDAG.cpp |   66 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 34 insertions(+), 32 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.207 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.208
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.207	Sat Oct 22 22:38:30 2005
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp	Tue Nov  8 12:52:27 2005
@@ -167,41 +167,47 @@
 /// chain but no other uses and no side effect.  If a node is passed in as an
 /// argument, it is used as the seed for node deletion.
 void SelectionDAG::RemoveDeadNodes(SDNode *N) {
-  std::set<SDNode*> AllNodeSet(AllNodes.begin(), AllNodes.end());
-
   // Create a dummy node (which is not added to allnodes), that adds a reference
   // to the root node, preventing it from being deleted.
   HandleSDNode Dummy(getRoot());
 
+  bool MadeChange = false;
+  
   // If we have a hint to start from, use it.
-  if (N) DeleteNodeIfDead(N, &AllNodeSet);
+  if (N && N->use_empty()) {
+    DestroyDeadNode(N);
+    MadeChange = true;
+  }
 
- Restart:
-  unsigned NumNodes = AllNodeSet.size();
-  for (std::set<SDNode*>::iterator I = AllNodeSet.begin(), E = AllNodeSet.end();
-       I != E; ++I) {
+  for (unsigned i = 0, e = AllNodes.size(); i != e; ++i) {
     // Try to delete this node.
-    DeleteNodeIfDead(*I, &AllNodeSet);
-
-    // If we actually deleted any nodes, do not use invalid iterators in
-    // AllNodeSet.
-    if (AllNodeSet.size() != NumNodes)
-      goto Restart;
+    SDNode *N = AllNodes[i];
+    if (N->use_empty() && N->getOpcode() != 65535) {
+      DestroyDeadNode(N);
+      MadeChange = true;
+    }
   }
-
-  // Restore AllNodes.
-  if (AllNodes.size() != NumNodes)
-    AllNodes.assign(AllNodeSet.begin(), AllNodeSet.end());
-
+  
+  // Walk the nodes list, removing the nodes we've marked as dead.
+  if (MadeChange) {
+    for (unsigned i = 0, e = AllNodes.size(); i != e; ++i)
+      if (AllNodes[i]->use_empty()) {
+        delete AllNodes[i];
+        AllNodes[i] = AllNodes.back();
+        AllNodes.pop_back();
+        --i; --e;
+      }
+  }
+  
   // If the root changed (e.g. it was a dead load, update the root).
   setRoot(Dummy.getValue());
 }
 
-
-void SelectionDAG::DeleteNodeIfDead(SDNode *N, void *NodeSet) {
-  if (!N->use_empty())
-    return;
-
+/// DestroyDeadNode - We know that N is dead.  Nuke it from the CSE maps for the
+/// graph.  If it is the last user of any of its operands, recursively process
+/// them the same way.
+/// 
+void SelectionDAG::DestroyDeadNode(SDNode *N) {
   // Okay, we really are going to delete this node.  First take this out of the
   // appropriate CSE map.
   RemoveNodeFromCSEMaps(N);
@@ -214,16 +220,12 @@
     O->removeUser(N);
     
     // Now that we removed this operand, see if there are no uses of it left.
-    DeleteNodeIfDead(O, NodeSet);
+    if (O->use_empty())
+      DestroyDeadNode(O);
   }
-  
-  // Remove the node from the nodes set and delete it.
-  std::set<SDNode*> &AllNodeSet = *(std::set<SDNode*>*)NodeSet;
-  AllNodeSet.erase(N);
-  
-  // Now that the node is gone, check to see if any of the operands of this node
-  // are dead now.
-  delete N;  
+
+  // Mark the node as dead.
+  N->MorphNodeTo(65535);
 }
 
 void SelectionDAG::DeleteNode(SDNode *N) {






More information about the llvm-commits mailing list