Make legalize a bit more efficient, and canonicalize sub X, C -> add X, -C
authorChris Lattner <sabre@nondot.org>
Thu, 12 May 2005 00:17:04 +0000 (00:17 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 12 May 2005 00:17:04 +0000 (00:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21882 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 08e8d776fd431778611230e05fcac7ca6382821d..8c26c5821be919e96f7c66103c78467acc98c895 100644 (file)
@@ -323,8 +323,11 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
     Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
     // There is no need to legalize the size argument (Operand #1)
     if (Tmp1 != Node->getOperand(0))
-      Result = DAG.getNode(Node->getOpcode(), MVT::Other, Tmp1,
-                           Node->getOperand(1));
+      Node->setAdjCallChain(Tmp1);
+    // Note that we do not create new ADJCALLSTACK DOWN/UP nodes here.  These
+    // nodes are treated specially and are mutated in place.  This makes the dag
+    // legalization process more efficient and also makes libcall insertion
+    // easier.
     break;
   case ISD::DYNAMIC_STACKALLOC:
     Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
index 3c3de2d43700e47bf21919dea8b9523e61ec4f32..dbb933eda9e89897981cc9afdcd1cff533727a71 100644 (file)
@@ -916,7 +916,7 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
       break;
     case ISD::SUB:
       if (!C2) return N1;         // sub X, 0 -> X
-      break;
+      return getNode(ISD::ADD, VT, N1, getConstant(-C2, VT));
     case ISD::MUL:
       if (!C2) return N2;         // mul X, 0 -> 0
       if (N2C->isAllOnesValue()) // mul X, -1 -> 0-X
@@ -1194,13 +1194,13 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
 
   // Memoize this node if possible.
   SDNode *N;
-  if (Opcode != ISD::ADJCALLSTACKDOWN) {
+  if (Opcode != ISD::ADJCALLSTACKDOWN && Opcode != ISD::ADJCALLSTACKUP) {
     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);
+    N = new SDNode(Opcode, N1, N2);
   }
 
 
@@ -1213,11 +1213,12 @@ 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.
+// setAdjCallChain - This method changes the token chain of an
+// ADJCALLSTACKDOWN/UP node to be the specified operand.
 void SDNode::setAdjCallChain(SDOperand N) {
   assert(N.getValueType() == MVT::Other);
-  assert(getOpcode() == ISD::ADJCALLSTACKDOWN && "Cannot adjust this node!");
+  assert((getOpcode() == ISD::ADJCALLSTACKDOWN ||
+          getOpcode() == ISD::ADJCALLSTACKUP) && "Cannot adjust this node!");
 
   Operands[0].Val->removeUser(this);
   Operands[0] = N;