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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23634 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 61fa319..d861e15 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -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),