Properly lower DYNAMIC_STACKALLOC - bracket all black magic with

CALLSEQ_BEGIN & CALLSEQ_END.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52225 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anton Korobeynikov 2008-06-11 20:16:42 +00:00
parent 797d95188d
commit 096b461b2e

View File

@ -4803,17 +4803,19 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDOperand Op,
SelectionDAG &DAG) { SelectionDAG &DAG) {
assert(Subtarget->isTargetCygMing() && assert(Subtarget->isTargetCygMing() &&
"This should be used only on Cygwin/Mingw targets"); "This should be used only on Cygwin/Mingw targets");
// Get the inputs. // Get the inputs.
SDOperand Chain = Op.getOperand(0); SDOperand Chain = Op.getOperand(0);
SDOperand Size = Op.getOperand(1); SDOperand Size = Op.getOperand(1);
// FIXME: Ensure alignment here // FIXME: Ensure alignment here
SDOperand Flag; SDOperand Flag;
MVT IntPtr = getPointerTy(); MVT IntPtr = getPointerTy();
MVT SPTy = Subtarget->is64Bit() ? MVT::i64 : MVT::i32; MVT SPTy = Subtarget->is64Bit() ? MVT::i64 : MVT::i32;
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0));
Chain = DAG.getCopyToReg(Chain, X86::EAX, Size, Flag); Chain = DAG.getCopyToReg(Chain, X86::EAX, Size, Flag);
Flag = Chain.getValue(1); Flag = Chain.getValue(1);
@ -4821,12 +4823,18 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDOperand Op,
SDOperand Ops[] = { Chain, SDOperand Ops[] = { Chain,
DAG.getTargetExternalSymbol("_alloca", IntPtr), DAG.getTargetExternalSymbol("_alloca", IntPtr),
DAG.getRegister(X86::EAX, IntPtr), DAG.getRegister(X86::EAX, IntPtr),
DAG.getRegister(X86StackPtr, SPTy),
Flag }; Flag };
Chain = DAG.getNode(X86ISD::CALL, NodeTys, Ops, 4); Chain = DAG.getNode(X86ISD::CALL, NodeTys, Ops, 5);
Flag = Chain.getValue(1); Flag = Chain.getValue(1);
Chain = DAG.getCALLSEQ_END(Chain,
DAG.getIntPtrConstant(0),
DAG.getIntPtrConstant(0),
Flag);
Chain = DAG.getCopyFromReg(Chain, X86StackPtr, SPTy).getValue(1); Chain = DAG.getCopyFromReg(Chain, X86StackPtr, SPTy).getValue(1);
std::vector<MVT> Tys; std::vector<MVT> Tys;
Tys.push_back(SPTy); Tys.push_back(SPTy);
Tys.push_back(MVT::Other); Tys.push_back(MVT::Other);