diff options
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 38 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/cleanuppad-inalloca.ll | 5 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/dynamic-alloca-in-entry.ll | 5 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/inalloca-ctor.ll | 9 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/inalloca-invoke.ll | 8 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/inalloca-stdcall.ll | 10 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/inalloca.ll | 30 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/shrink-wrap-chkstk.ll | 2 |
8 files changed, 40 insertions, 67 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index e86c00bb36a..596f487681c 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -16378,8 +16378,9 @@ SDValue X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const { MachineFunction &MF = DAG.getMachineFunction(); - const Function *F = MF.getFunction(); bool SplitStack = MF.shouldSplitStack(); + bool Lower = (Subtarget.isOSWindows() && !Subtarget.isTargetMachO()) || + SplitStack; SDLoc dl(Op); // Get the inputs. @@ -16393,45 +16394,21 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op, // pointer when other instructions are using the stack. Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0, dl, true), dl); - const X86RegisterInfo *RegInfo = Subtarget.getRegisterInfo(); bool Is64Bit = Subtarget.is64Bit(); MVT SPTy = getPointerTy(DAG.getDataLayout()); - bool CheckStack = SplitStack; - if (!CheckStack && Subtarget.isOSWindows() && !Subtarget.isTargetMachO()) { - // The Windows ABI requires us to probe the stack for allocations beyond - // the probe size. - if (auto *SizeC = dyn_cast<ConstantSDNode>(Size)) { - // Try to elide the probe if we can prove that this dynamic allocation is - // smaller than the probe size. - unsigned StackProbeSize = 4096; - if (F->hasFnAttribute("stack-probe-size")) - F->getFnAttribute("stack-probe-size") - .getValueAsString() - .getAsInteger(0, StackProbeSize); - unsigned AlignedAlloc = SizeC->getZExtValue(); - // Round the dynamic alloca's size up to it's alignment. - if (Align) - AlignedAlloc = alignTo(AlignedAlloc, Align); - - // If the aligned allocation is smaller than the probe size, then we don't - // need to probe the stack. - CheckStack = AlignedAlloc >= StackProbeSize; - } else { - // We cannot tell how big this dynamic alloca will be, probe the stack. - CheckStack = true; - } - } - SDValue Result; - if (!CheckStack) { + if (!Lower) { const TargetLowering &TLI = DAG.getTargetLoweringInfo(); unsigned SPReg = TLI.getStackPointerRegisterToSaveRestore(); assert(SPReg && "Target cannot require DYNAMIC_STACKALLOC expansion and" " not tell us which reg is the stack pointer!"); + EVT VT = Node->getValueType(0); + SDValue Tmp3 = Node->getOperand(2); SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT); Chain = SP.getValue(1); + unsigned Align = cast<ConstantSDNode>(Tmp3)->getZExtValue(); const TargetFrameLowering &TFI = *Subtarget.getFrameLowering(); unsigned StackAlign = TFI.getStackAlignment(); Result = DAG.getNode(ISD::SUB, dl, VT, SP, Size); // Value @@ -16445,6 +16422,8 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op, if (Is64Bit) { // The 64 bit implementation of segmented stacks needs to clobber both r10 // r11. This makes it impossible to use it along with nested parameters. + const Function *F = MF.getFunction(); + for (Function::const_arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) if (I->hasNestAttr()) @@ -16467,6 +16446,7 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op, Chain = DAG.getNode(X86ISD::WIN_ALLOCA, dl, NodeTys, Chain, Flag); + const X86RegisterInfo *RegInfo = Subtarget.getRegisterInfo(); unsigned SPReg = RegInfo->getStackRegister(); SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, SPTy); Chain = SP.getValue(1); diff --git a/llvm/test/CodeGen/X86/cleanuppad-inalloca.ll b/llvm/test/CodeGen/X86/cleanuppad-inalloca.ll index bb00f14fdbb..2e34ada52e6 100644 --- a/llvm/test/CodeGen/X86/cleanuppad-inalloca.ll +++ b/llvm/test/CodeGen/X86/cleanuppad-inalloca.ll @@ -38,9 +38,8 @@ ehcleanup: ; preds = %entry ; CHECK: pushl %ebp ; CHECK: movl %esp, %ebp ; CHECK: subl ${{[0-9]+}}, %esp -; CHECK: movl %esp, %[[tmp_sp1:.*]] -; CHECK: leal -8(%[[tmp_sp1]]), %[[tmp_sp2:.*]] -; CHECK: %[[tmp_sp2]], %esp +; CHECK: movl $8, %eax +; CHECK: calll __chkstk ; CHECK: calll "??0A@@QAE@XZ" ; CHECK: calll "??0A@@QAE@XZ" ; CHECK: calll _takes_two diff --git a/llvm/test/CodeGen/X86/dynamic-alloca-in-entry.ll b/llvm/test/CodeGen/X86/dynamic-alloca-in-entry.ll index 5a342864415..7ed471c2f50 100644 --- a/llvm/test/CodeGen/X86/dynamic-alloca-in-entry.ll +++ b/llvm/test/CodeGen/X86/dynamic-alloca-in-entry.ll @@ -15,8 +15,5 @@ define void @bar() { ret void } ; CHECK-LABEL: _bar: -; CHECK: movl %esp, %ebp -; CHECK: movl %esp, %[[sp_tmp:.*]] -; CHECK: addl $-4, %[[sp_tmp]] -; CHECK: movl %[[sp_tmp]], %esp +; CHECK: calll __chkstk ; CHECK: retl diff --git a/llvm/test/CodeGen/X86/inalloca-ctor.ll b/llvm/test/CodeGen/X86/inalloca-ctor.ll index df9224f2b32..eba4e72f933 100644 --- a/llvm/test/CodeGen/X86/inalloca-ctor.ll +++ b/llvm/test/CodeGen/X86/inalloca-ctor.ll @@ -10,14 +10,13 @@ declare void @Foo_ctor(%Foo* %this) define void @g() { entry: -; CHECK: movl %esp, %ebp %args = alloca inalloca %frame %c = getelementptr %frame, %frame* %args, i32 0, i32 2 -; CHECK: movl %esp, %[[tmp_sp1:.*]] -; CHECK: leal -20(%[[tmp_sp1]]), %[[tmp_sp2:.*]] -; CHECK: movl %[[tmp_sp2]], %esp +; CHECK: movl $20, %eax +; CHECK: calll __chkstk +; CHECK: movl %esp, call void @Foo_ctor(%Foo* %c) -; CHECK: leal -8(%[[tmp_sp1]]), +; CHECK: leal 12(%{{.*}}), ; CHECK-NEXT: pushl ; CHECK-NEXT: calll _Foo_ctor ; CHECK: addl $4, %esp diff --git a/llvm/test/CodeGen/X86/inalloca-invoke.ll b/llvm/test/CodeGen/X86/inalloca-invoke.ll index 73b939b8318..9a184e563b1 100644 --- a/llvm/test/CodeGen/X86/inalloca-invoke.ll +++ b/llvm/test/CodeGen/X86/inalloca-invoke.ll @@ -12,7 +12,6 @@ declare void @plus(%Iter* sret, %Iter*, i32) declare void @reverse(%frame.reverse* inalloca align 4) define i32 @main() personality i32 (...)* @pers { -; CHECK: movl %esp, %ebp %temp.lvalue = alloca %Iter br label %blah @@ -22,10 +21,9 @@ blah: %beg = getelementptr %frame.reverse, %frame.reverse* %rev_args, i32 0, i32 0 %end = getelementptr %frame.reverse, %frame.reverse* %rev_args, i32 0, i32 1 -; CHECK: movl %esp, %[[end:.*]] -; CHECK: leal -24(%[[end]]), %[[beg:.*]] -; CHECK: movl %[[beg]], %esp -; CHECK: addl $-12, %[[end]] +; CHECK: calll __chkstk +; CHECK: movl %esp, %[[beg:[^ ]*]] +; CHECK: leal 12(%[[beg]]), %[[end:[^ ]*]] call void @begin(%Iter* sret %temp.lvalue) ; CHECK: calll _begin diff --git a/llvm/test/CodeGen/X86/inalloca-stdcall.ll b/llvm/test/CodeGen/X86/inalloca-stdcall.ll index ad2271bcff4..4f7e4092a99 100644 --- a/llvm/test/CodeGen/X86/inalloca-stdcall.ll +++ b/llvm/test/CodeGen/X86/inalloca-stdcall.ll @@ -7,16 +7,16 @@ declare x86_stdcallcc void @i(i32 %a) define void @g() { ; CHECK-LABEL: _g: -; CHECK: movl %esp, %ebp %b = alloca inalloca %Foo -; CHECK: movl %esp, %[[tmp_sp:.*]] -; CHECK: leal -8(%[[tmp_sp]]), %esp +; CHECK: movl $8, %eax +; CHECK: calll __chkstk %f1 = getelementptr %Foo, %Foo* %b, i32 0, i32 0 %f2 = getelementptr %Foo, %Foo* %b, i32 0, i32 1 store i32 13, i32* %f1 store i32 42, i32* %f2 -; CHECK: movl $13, -8(%[[tmp_sp]]) -; CHECK: movl $42, -4(%[[tmp_sp]]) +; CHECK: movl %esp, %eax +; CHECK: movl $13, (%eax) +; CHECK: movl $42, 4(%eax) call x86_stdcallcc void @f(%Foo* inalloca %b) ; CHECK: calll _f@8 ; CHECK-NOT: %esp diff --git a/llvm/test/CodeGen/X86/inalloca.ll b/llvm/test/CodeGen/X86/inalloca.ll index b4ee79fcb5b..e523c945a69 100644 --- a/llvm/test/CodeGen/X86/inalloca.ll +++ b/llvm/test/CodeGen/X86/inalloca.ll @@ -7,16 +7,16 @@ declare void @f(%Foo* inalloca %b) define void @a() { ; CHECK-LABEL: _a: entry: -; CHECK: movl %esp, %ebp %b = alloca inalloca %Foo -; CHECK: movl %esp, %[[tmp_sp:.*]] -; CHECK: leal -8(%[[tmp_sp]]), %esp +; CHECK: movl $8, %eax +; CHECK: calll __chkstk %f1 = getelementptr %Foo, %Foo* %b, i32 0, i32 0 %f2 = getelementptr %Foo, %Foo* %b, i32 0, i32 1 store i32 13, i32* %f1 store i32 42, i32* %f2 -; CHECK: movl $13, -8(%[[tmp_sp]]) -; CHECK: movl $42, -4(%[[tmp_sp]]) +; CHECK: movl %esp, %eax +; CHECK: movl $13, (%eax) +; CHECK: movl $42, 4(%eax) call void @f(%Foo* inalloca %b) ; CHECK: calll _f ret void @@ -27,16 +27,16 @@ declare void @inreg_with_inalloca(i32 inreg %a, %Foo* inalloca %b) define void @b() { ; CHECK-LABEL: _b: entry: -; CHECK: movl %esp, %ebp %b = alloca inalloca %Foo -; CHECK: movl %esp, %[[tmp_sp:.*]] -; CHECK: leal -8(%[[tmp_sp]]), %esp +; CHECK: movl $8, %eax +; CHECK: calll __chkstk %f1 = getelementptr %Foo, %Foo* %b, i32 0, i32 0 %f2 = getelementptr %Foo, %Foo* %b, i32 0, i32 1 store i32 13, i32* %f1 store i32 42, i32* %f2 -; CHECK: movl $13, -8(%[[tmp_sp]]) -; CHECK: movl $42, -4(%[[tmp_sp]]) +; CHECK: movl %esp, %eax +; CHECK: movl $13, (%eax) +; CHECK: movl $42, 4(%eax) call void @inreg_with_inalloca(i32 inreg 1, %Foo* inalloca %b) ; CHECK: movl $1, %eax ; CHECK: calll _inreg_with_inalloca @@ -48,16 +48,16 @@ declare x86_thiscallcc void @thiscall_with_inalloca(i8* %a, %Foo* inalloca %b) define void @c() { ; CHECK-LABEL: _c: entry: -; CHECK: movl %esp, %ebp %b = alloca inalloca %Foo -; CHECK: movl %esp, %[[tmp_sp:.*]] -; CHECK: leal -8(%[[tmp_sp]]), %esp +; CHECK: movl $8, %eax +; CHECK: calll __chkstk %f1 = getelementptr %Foo, %Foo* %b, i32 0, i32 0 %f2 = getelementptr %Foo, %Foo* %b, i32 0, i32 1 store i32 13, i32* %f1 store i32 42, i32* %f2 -; CHECK-DAG: movl $13, -8(%[[tmp_sp]]) -; CHECK-DAG: movl $42, -4(%[[tmp_sp]]) +; CHECK: movl %esp, %eax +; CHECK-DAG: movl $13, (%eax) +; CHECK-DAG: movl $42, 4(%eax) call x86_thiscallcc void @thiscall_with_inalloca(i8* null, %Foo* inalloca %b) ; CHECK-DAG: xorl %ecx, %ecx ; CHECK: calll _thiscall_with_inalloca diff --git a/llvm/test/CodeGen/X86/shrink-wrap-chkstk.ll b/llvm/test/CodeGen/X86/shrink-wrap-chkstk.ll index 42f47bbe008..aecae89aee5 100644 --- a/llvm/test/CodeGen/X86/shrink-wrap-chkstk.ll +++ b/llvm/test/CodeGen/X86/shrink-wrap-chkstk.ll @@ -9,7 +9,7 @@ target triple = "i686-pc-windows-msvc18.0.0" %struct.S = type { [12 x i8] } -define x86_thiscallcc void @call_inalloca(i1 %x) "stack-probe-size"="12" { +define x86_thiscallcc void @call_inalloca(i1 %x) { entry: %argmem = alloca inalloca <{ %struct.S }>, align 4 %argidx1 = getelementptr inbounds <{ %struct.S }>, <{ %struct.S }>* %argmem, i32 0, i32 0, i32 0, i32 0 |

