diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2008-06-11 20:16:42 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2008-06-11 20:16:42 +0000 |
commit | 487aefdd3956176b046acdef8a8b9e2795285257 (patch) | |
tree | a32e8adba58f4c801dd17faae4f0e066eb20736b /lib | |
parent | d2aa7d11db1e985c13e3edb128cd9d3d09cd7b25 (diff) | |
download | external_llvm-487aefdd3956176b046acdef8a8b9e2795285257.zip external_llvm-487aefdd3956176b046acdef8a8b9e2795285257.tar.gz external_llvm-487aefdd3956176b046acdef8a8b9e2795285257.tar.bz2 |
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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 7421e3e..53f42b9 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -4803,17 +4803,19 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDOperand Op, SelectionDAG &DAG) { assert(Subtarget->isTargetCygMing() && "This should be used only on Cygwin/Mingw targets"); - + // Get the inputs. SDOperand Chain = Op.getOperand(0); SDOperand Size = Op.getOperand(1); // FIXME: Ensure alignment here SDOperand Flag; - + MVT IntPtr = getPointerTy(); MVT SPTy = Subtarget->is64Bit() ? MVT::i64 : MVT::i32; + Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0)); + Chain = DAG.getCopyToReg(Chain, X86::EAX, Size, Flag); Flag = Chain.getValue(1); @@ -4821,12 +4823,18 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDOperand Op, SDOperand Ops[] = { Chain, DAG.getTargetExternalSymbol("_alloca", IntPtr), DAG.getRegister(X86::EAX, IntPtr), + DAG.getRegister(X86StackPtr, SPTy), Flag }; - Chain = DAG.getNode(X86ISD::CALL, NodeTys, Ops, 4); + Chain = DAG.getNode(X86ISD::CALL, NodeTys, Ops, 5); Flag = Chain.getValue(1); + Chain = DAG.getCALLSEQ_END(Chain, + DAG.getIntPtrConstant(0), + DAG.getIntPtrConstant(0), + Flag); + Chain = DAG.getCopyFromReg(Chain, X86StackPtr, SPTy).getValue(1); - + std::vector<MVT> Tys; Tys.push_back(SPTy); Tys.push_back(MVT::Other); |