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

Chris Lattner lattner at cs.uiuc.edu
Tue Oct 4 23:35:40 PDT 2005



Changes in directory llvm/lib/CodeGen/SelectionDAG:

DAGCombiner.cpp updated: 1.16 -> 1.17
SelectionDAG.cpp updated: 1.194 -> 1.195
---
Log message:

Add a new HandleNode class, which is used to handle (haha) cases in the
dead node elim and dag combiner passes where the root is potentially updated.
This fixes a fixme in the dag combiner.


---
Diffs of the changes:  (+17 -11)

 DAGCombiner.cpp  |   17 ++++++++++++-----
 SelectionDAG.cpp |   11 +++++------
 2 files changed, 17 insertions(+), 11 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.16 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.17
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.16	Wed Oct  5 01:11:08 2005
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp	Wed Oct  5 01:35:28 2005
@@ -274,6 +274,11 @@
   // Add all the dag nodes to the worklist.
   WorkList.insert(WorkList.end(), DAG.allnodes_begin(), DAG.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, and tracking any
+  // changes of the root.
+  HandleSDNode Dummy(DAG.getRoot());
+  
   // while the worklist isn't empty, inspect the node on the end of it and
   // try and combine it.
   while (!WorkList.empty()) {
@@ -281,15 +286,14 @@
     WorkList.pop_back();
     
     // If N has no uses, it is dead.  Make sure to revisit all N's operands once
-    // N is deleted from the DAG, since they too may now be dead.
-    // FIXME: is there a better way to keep from deleting the dag root because
-    // we think it has no uses?  This works for now...
-    if (N->use_empty() && N != DAG.getRoot().Val) {
+    // N is deleted from the DAG, since they too may now be dead or may have a
+    // reduced number of uses, allowing other xforms.
+    if (N->use_empty() && N != &Dummy) {
       for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
         WorkList.push_back(N->getOperand(i).Val);
       
-      DAG.DeleteNode(N);
       removeFromWorkList(N);
+      DAG.DeleteNode(N);
       continue;
     }
     
@@ -319,6 +323,9 @@
       }
     }
   }
+  
+  // If the root changed (e.g. it was a dead load, update the root).
+  DAG.setRoot(Dummy.getValue());
 }
 
 SDOperand DAGCombiner::visit(SDNode *N) {


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.194 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.195
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.194	Wed Sep 28 17:28:18 2005
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp	Wed Oct  5 01:35:28 2005
@@ -176,7 +176,7 @@
 
   // Create a dummy node (which is not added to allnodes), that adds a reference
   // to the root node, preventing it from being deleted.
-  SDNode *DummyNode = new SDNode(ISD::EntryToken, getRoot());
+  HandleSDNode Dummy(getRoot());
 
   // If we have a hint to start from, use it.
   if (N) DeleteNodeIfDead(N, &AllNodeSet);
@@ -199,11 +199,7 @@
     AllNodes.assign(AllNodeSet.begin(), AllNodeSet.end());
 
   // If the root changed (e.g. it was a dead load, update the root).
-  setRoot(DummyNode->getOperand(0));
-
-  // Now that we are done with the dummy node, delete it.
-  DummyNode->getOperand(0).Val->removeUser(DummyNode);
-  delete DummyNode;
+  setRoot(Dummy.getValue());
 }
 
 
@@ -276,6 +272,7 @@
 void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
   bool Erased = false;
   switch (N->getOpcode()) {
+  case ISD::HANDLENODE: return;  // noop.
   case ISD::Constant:
     Erased = Constants.erase(std::make_pair(cast<ConstantSDNode>(N)->getValue(),
                                             N->getValueType(0)));
@@ -397,6 +394,8 @@
                                                      N->getValueType(0)))];
     if (L) return L;
     L = N;
+  } else if (N->getOpcode() == ISD::HANDLENODE) {
+    return 0;  // never add it.
   } else if (N->getNumOperands() == 1) {
     SDNode *&U = UnaryOps[std::make_pair(N->getOpcode(),
                                          std::make_pair(N->getOperand(0),






More information about the llvm-commits mailing list