diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-01-09 19:03:49 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-01-09 19:03:49 +0000 |
| commit | ec26b48d61b92d803e1840c2addf49e0cb6a496a (patch) | |
| tree | 18a51fc72e2dbde8df3e71c33eaaf68db27a4bf3 /llvm/lib/CodeGen | |
| parent | 282781c79755b480504932c46e434954add57d51 (diff) | |
| download | bcm5719-llvm-ec26b48d61b92d803e1840c2addf49e0cb6a496a.tar.gz bcm5719-llvm-ec26b48d61b92d803e1840c2addf49e0cb6a496a.zip | |
Teach legalize to deal with DYNAMIC_STACKALLOC (aka a dynamic llvm alloca)
llvm-svn: 19415
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 19e70f59279..a81dbee2406 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -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. |

