Skip to content

Commit dc15204

Browse files
staticfloatvchuravy
authored andcommitted
[X86] Don't clobber EBX in stackprobes
On X86, the stackprobe emission code chooses the R11D register, which is illegal on i686. This ends up wrapping around to EBX, which does not get properly callee-saved within the stack probing prologue, clobbering the register for the callers. We fix this by explicitly using EAX as the stack probe register.
1 parent 60e0418 commit dc15204

File tree

2 files changed

+65
-40
lines changed

2 files changed

+65
-40
lines changed

llvm/lib/Target/X86/X86FrameLowering.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,9 @@ void X86FrameLowering::emitStackProbeInlineGenericLoop(
652652
MF.insert(MBBIter, testMBB);
653653
MF.insert(MBBIter, tailMBB);
654654

655-
Register FinalStackProbed = Uses64BitFramePtr ? X86::R11 : X86::R11D;
655+
Register FinalStackProbed = Uses64BitFramePtr ? X86::R11
656+
: Is64Bit ? X86::R11D
657+
: X86::EAX;
656658
BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::COPY), FinalStackProbed)
657659
.addReg(StackPtr)
658660
.setMIFlag(MachineInstr::FrameSetup);
@@ -1073,7 +1075,9 @@ void X86FrameLowering::BuildStackAlignAND(MachineBasicBlock &MBB,
10731075
MF.insert(MBBIter, bodyMBB);
10741076
MF.insert(MBBIter, footMBB);
10751077
const unsigned MovMIOpc = Is64Bit ? X86::MOV64mi32 : X86::MOV32mi;
1076-
Register FinalStackProbed = Uses64BitFramePtr ? X86::R11 : X86::R11D;
1078+
Register FinalStackProbed = Uses64BitFramePtr ? X86::R11
1079+
: Is64Bit ? X86::R11D
1080+
: X86::EAX;
10771081

10781082
// Setup entry block
10791083
{

llvm/test/CodeGen/X86/stack-clash-large.ll

Lines changed: 59 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
; RUN: llc -mtriple=x86_64-linux-android < %s | FileCheck -check-prefix=CHECK-X86-64 %s
2-
; RUN: llc -mtriple=i686-linux-android < %s | FileCheck -check-prefix=CHECK-X86-32 %s
1+
; RUN: llc -mtriple=x86_64-linux-android < %s | FileCheck -check-prefix=CHECK-X64 %s
2+
; RUN: llc -mtriple=i686-linux-android < %s | FileCheck -check-prefix=CHECK-X86 %s
3+
; RUN: llc -mtriple=x86_64-linux-gnux32 < %s | FileCheck -check-prefix=CHECK-X32 %s
34

45
define i32 @foo() local_unnamed_addr #0 {
56

@@ -14,40 +15,60 @@ define i32 @foo() local_unnamed_addr #0 {
1415

1516
attributes #0 = {"probe-stack"="inline-asm"}
1617

17-
; CHECK-X86-64-LABEL: foo:
18-
; CHECK-X86-64: # %bb.0:
19-
; CHECK-X86-64-NEXT: movq %rsp, %r11
20-
; CHECK-X86-64-NEXT: subq $69632, %r11 # imm = 0x11000
21-
; CHECK-X86-64-NEXT: .LBB0_1:
22-
; CHECK-X86-64-NEXT: subq $4096, %rsp # imm = 0x1000
23-
; CHECK-X86-64-NEXT: movq $0, (%rsp)
24-
; CHECK-X86-64-NEXT: cmpq %r11, %rsp
25-
; CHECK-X86-64-NEXT: jne .LBB0_1
26-
; CHECK-X86-64-NEXT:# %bb.2:
27-
; CHECK-X86-64-NEXT: subq $2248, %rsp
28-
; CHECK-X86-64-NEXT: .cfi_def_cfa_offset 71888
29-
; CHECK-X86-64-NEXT: movl $1, 264(%rsp)
30-
; CHECK-X86-64-NEXT: movl $1, 28664(%rsp)
31-
; CHECK-X86-64-NEXT: movl -128(%rsp), %eax
32-
; CHECK-X86-64-NEXT: addq $71880, %rsp # imm = 0x118C8
33-
; CHECK-X86-64-NEXT: .cfi_def_cfa_offset 8
34-
; CHECK-X86-64-NEXT: retq
18+
; CHECK-X64-LABEL: foo:
19+
; CHECK-X64: # %bb.0:
20+
; CHECK-X64-NEXT: movq %rsp, %r11
21+
; CHECK-X64-NEXT: subq $69632, %r11 # imm = 0x11000
22+
; CHECK-X64-NEXT: .LBB0_1:
23+
; CHECK-X64-NEXT: subq $4096, %rsp # imm = 0x1000
24+
; CHECK-X64-NEXT: movq $0, (%rsp)
25+
; CHECK-X64-NEXT: cmpq %r11, %rsp
26+
; CHECK-X64-NEXT: jne .LBB0_1
27+
; CHECK-X64-NEXT:# %bb.2:
28+
; CHECK-X64-NEXT: subq $2248, %rsp
29+
; CHECK-X64-NEXT: .cfi_def_cfa_offset 71888
30+
; CHECK-X64-NEXT: movl $1, 264(%rsp)
31+
; CHECK-X64-NEXT: movl $1, 28664(%rsp)
32+
; CHECK-X64-NEXT: movl -128(%rsp), %eax
33+
; CHECK-X64-NEXT: addq $71880, %rsp # imm = 0x118C8
34+
; CHECK-X64-NEXT: .cfi_def_cfa_offset 8
35+
; CHECK-X64-NEXT: retq
36+
37+
; CHECK-X86-LABEL: foo:
38+
; CHECK-X86: # %bb.0:
39+
; CHECK-X86-NEXT: movl %esp, %eax
40+
; CHECK-X86-NEXT: subl $69632, %eax # imm = 0x11000
41+
; CHECK-X86-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1
42+
; CHECK-X86-NEXT: subl $4096, %esp # imm = 0x1000
43+
; CHECK-X86-NEXT: movl $0, (%esp)
44+
; CHECK-X86-NEXT: cmpl %eax, %esp
45+
; CHECK-X86-NEXT: jne .LBB0_1
46+
; CHECK-X86-NEXT:# %bb.2:
47+
; CHECK-X86-NEXT: subl $2380, %esp
48+
; CHECK-X86-NEXT: .cfi_def_cfa_offset 72016
49+
; CHECK-X86-NEXT: movl $1, 392(%esp)
50+
; CHECK-X86-NEXT: movl $1, 28792(%esp)
51+
; CHECK-X86-NEXT: movl (%esp), %eax
52+
; CHECK-X86-NEXT: addl $72012, %esp # imm = 0x1194C
53+
; CHECK-X86-NEXT: .cfi_def_cfa_offset 4
54+
; CHECK-X86-NEXT: retl
55+
56+
; CHECK-X32-LABEL: foo:
57+
; CHECK-X32: # %bb.0:
58+
; CHECK-X32-NEXT: movl %esp, %r11d
59+
; CHECK-X32-NEXT: subl $69632, %r11d # imm = 0x11000
60+
; CHECK-X32-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1
61+
; CHECK-X32-NEXT: subl $4096, %esp # imm = 0x1000
62+
; CHECK-X32-NEXT: movq $0, (%esp)
63+
; CHECK-X32-NEXT: cmpl %r11d, %esp
64+
; CHECK-X32-NEXT: jne .LBB0_1
65+
; CHECK-X32-NEXT:# %bb.2:
66+
; CHECK-X32-NEXT: subl $2248, %esp
67+
; CHECK-X32-NEXT: .cfi_def_cfa_offset 71888
68+
; CHECK-X32-NEXT: movl $1, 264(%esp)
69+
; CHECK-X32-NEXT: movl $1, 28664(%esp)
70+
; CHECK-X32-NEXT: movl -128(%esp), %eax
71+
; CHECK-X32-NEXT: addl $71880, %esp # imm = 0x118C8
72+
; CHECK-X32-NEXT: .cfi_def_cfa_offset 8
73+
; CHECK-X32-NEXT: retq
3574

36-
; CHECK-X86-32-LABEL: foo:
37-
; CHECK-X86-32: # %bb.0:
38-
; CHECK-X86-32-NEXT: movl %esp, %r11d
39-
; CHECK-X86-32-NEXT: subl $69632, %r11d # imm = 0x11000
40-
; CHECK-X86-32-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1
41-
; CHECK-X86-32-NEXT: subl $4096, %esp # imm = 0x1000
42-
; CHECK-X86-32-NEXT: movl $0, (%esp)
43-
; CHECK-X86-32-NEXT: cmpl %r11d, %esp
44-
; CHECK-X86-32-NEXT: jne .LBB0_1
45-
; CHECK-X86-32-NEXT:# %bb.2:
46-
; CHECK-X86-32-NEXT: subl $2380, %esp
47-
; CHECK-X86-32-NEXT: .cfi_def_cfa_offset 72016
48-
; CHECK-X86-32-NEXT: movl $1, 392(%esp)
49-
; CHECK-X86-32-NEXT: movl $1, 28792(%esp)
50-
; CHECK-X86-32-NEXT: movl (%esp), %eax
51-
; CHECK-X86-32-NEXT: addl $72012, %esp # imm = 0x1194C
52-
; CHECK-X86-32-NEXT: .cfi_def_cfa_offset 4
53-
; CHECK-X86-32-NEXT: retl

0 commit comments

Comments
 (0)