Teach legalize to deal with DYNAMIC_STACKALLOC (aka a dynamic llvm alloca)
authorChris Lattner <sabre@nondot.org>
Sun, 9 Jan 2005 19:03:49 +0000 (19:03 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 9 Jan 2005 19:03:49 +0000 (19:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19415 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index 19e70f59279c29e96276177c19067fa478d245d2..a81dbee2406c3625682addf1524f74a46644a519 100644 (file)
@@ -229,7 +229,7 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
     if (I != LegalizedNodes.end()) return I->second;
   }
 
-  SDOperand Tmp1, Tmp2;
+  SDOperand Tmp1, Tmp2, Tmp3;
 
   SDOperand Result = Op;
   SDNode *Node = Op.Val;
@@ -307,6 +307,21 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
       Result = DAG.getNode(Node->getOpcode(), MVT::Other, Tmp1,
                            Node->getOperand(1));
     break;
+  case ISD::DYNAMIC_STACKALLOC:
+    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
+    Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the size.
+    Tmp3 = LegalizeOp(Node->getOperand(2));  // Legalize the alignment.
+    if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
+        Tmp3 != Node->getOperand(2))
+      Result = DAG.getNode(ISD::DYNAMIC_STACKALLOC, Node->getValueType(0),
+                           Tmp1, Tmp2, Tmp3);
+
+    // Since this op produces two values, make sure to remember that we
+    // legalized both of them.
+    AddLegalizedOperand(SDOperand(Node, 0), Result);
+    AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
+    return Result.getValue(Op.ResNo);
+
   case ISD::CALL:
     Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
     Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the callee.