Add some methods for dag->dag isel.
authorChris Lattner <sabre@nondot.org>
Tue, 16 Aug 2005 18:17:10 +0000 (18:17 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 16 Aug 2005 18:17:10 +0000 (18:17 +0000)
Split RemoveNodeFromCSEMaps out of DeleteNodesIfDead to do it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22801 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index 3d13b21f2243da6b46d1c37e55f735cd926d0508..63e7435074c87f0c7d9ab012c2149759dc04feb6 100644 (file)
@@ -203,7 +203,7 @@ SDOperand SelectionDAGLegalize::ExpandLegalUINT_TO_FP(SDOperand Op0,
   return DAG.getNode(ISD::ADD, DestVT, Tmp1, FudgeInReg);
 }
 
-/// PromoteLegalUINT_TO_FP - This function is responsible for legalizing a
+/// PromoteLegalINT_TO_FP - This function is responsible for legalizing a
 /// *INT_TO_FP operation of the specified operand when the target requests that
 /// we promote it.  At this point, we know that the result and operand types are
 /// legal for the target, and that there is a legal UINT_TO_FP or SINT_TO_FP
index 993b3ec2aa21e4aaeb16a172dc9982aa38ad6459..e921c12295ec86c3597be18a82aaae3dd5e74a3f 100644 (file)
@@ -177,12 +177,40 @@ void SelectionDAG::RemoveDeadNodes(SDNode *N) {
   delete DummyNode;
 }
 
+
 void SelectionDAG::DeleteNodeIfDead(SDNode *N, void *NodeSet) {
   if (!N->use_empty())
     return;
 
   // Okay, we really are going to delete this node.  First take this out of the
   // appropriate CSE map.
+  RemoveNodeFromCSEMaps(N);
+  
+  // Next, brutally remove the operand list.  This is safe to do, as there are
+  // no cycles in the graph.
+  while (!N->Operands.empty()) {
+    SDNode *O = N->Operands.back().Val;
+    N->Operands.pop_back();
+    O->removeUser(N);
+    
+    // Now that we removed this operand, see if there are no uses of it left.
+    DeleteNodeIfDead(O, NodeSet);
+  }
+  
+  // 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;  
+}
+
+/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
+/// correspond to it.  This is useful when we're about to delete or repurpose
+/// the node.  We don't want future request for structurally identical nodes
+/// to return N anymore.
+void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
   switch (N->getOpcode()) {
   case ISD::Constant:
     Constants.erase(std::make_pair(cast<ConstantSDNode>(N)->getValue(),
@@ -253,24 +281,6 @@ void SelectionDAG::DeleteNodeIfDead(SDNode *N, void *NodeSet) {
     }
     break;
   }
-
-  // Next, brutally remove the operand list.
-  while (!N->Operands.empty()) {
-    SDNode *O = N->Operands.back().Val;
-    N->Operands.pop_back();
-    O->removeUser(N);
-
-    // Now that we removed this operand, see if there are no uses of it left.
-    DeleteNodeIfDead(O, NodeSet);
-  }
-
-  // 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;
 }
 
 
@@ -1679,6 +1689,36 @@ SDOperand SelectionDAG::getNode(unsigned Opcode,
   return SDOperand(N, 0);
 }
 
+
+/// SelectNodeTo - These are used for target selectors to *mutate* the
+/// specified node to have the specified return type, Target opcode, and
+/// operands.  Note that target opcodes are stored as
+/// ISD::BUILTIN_OP_END+TargetOpcode in the node opcode field.
+void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT,
+                                unsigned TargetOpc, SDOperand Op1) {
+  RemoveNodeFromCSEMaps(N);
+  N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
+  N->setValueTypes(VT);
+  N->setOperands(Op1);
+}
+void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT,
+                                unsigned TargetOpc, SDOperand Op1,
+                                SDOperand Op2) {
+  RemoveNodeFromCSEMaps(N);
+  N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
+  N->setValueTypes(VT);
+  N->setOperands(Op1, Op2);
+}
+void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT,
+                                unsigned TargetOpc, SDOperand Op1,
+                                SDOperand Op2, SDOperand Op3) {
+  RemoveNodeFromCSEMaps(N);
+  N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc);
+  N->setValueTypes(VT);
+  N->setOperands(Op1, Op2, Op3);
+}
+
+
 /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the
 /// indicated value.  This method ignores uses of other values defined by this
 /// operation.