Do not memoize ADJCALLSTACKDOWN nodes, provide a method to hack on them.
authorChris Lattner <sabre@nondot.org>
Wed, 11 May 2005 18:57:39 +0000 (18:57 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 11 May 2005 18:57:39 +0000 (18:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21871 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index d0809db38cc5c5002e322a464fa2ab34e25e2ebe..3c3de2d43700e47bf21919dea8b9523e61ec4f32 100644 (file)
@@ -1192,9 +1192,17 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
 #endif
   }
 
-  SDNode *&N = BinaryOps[std::make_pair(Opcode, std::make_pair(N1, N2))];
-  if (N) return SDOperand(N, 0);
-  N = new SDNode(Opcode, N1, N2);
+  // Memoize this node if possible.
+  SDNode *N;
+  if (Opcode != ISD::ADJCALLSTACKDOWN) {
+    SDNode *&BON = BinaryOps[std::make_pair(Opcode, std::make_pair(N1, N2))];
+    if (BON) return SDOperand(BON, 0);
+
+    BON = N = new SDNode(Opcode, N1, N2);
+  } else {
+    N = new SDNode(ISD::ADJCALLSTACKDOWN, N1, N2);
+  }
+
 
   if (Opcode != ISD::READPORT && Opcode != ISD::READIO)
     N->setValueTypes(VT);
@@ -1205,6 +1213,19 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
   return SDOperand(N, 0);
 }
 
+// setAdjCallChain - This method changes the token chain of an ADJCALLSTACKDOWN
+// node to be the specified operand.
+void SDNode::setAdjCallChain(SDOperand N) {
+  assert(N.getValueType() == MVT::Other);
+  assert(getOpcode() == ISD::ADJCALLSTACKDOWN && "Cannot adjust this node!");
+
+  Operands[0].Val->removeUser(this);
+  Operands[0] = N;
+  N.Val->Uses.push_back(this);
+}
+
+
+
 SDOperand SelectionDAG::getLoad(MVT::ValueType VT,
                                 SDOperand Chain, SDOperand Ptr, 
                                 SDOperand SV) {