xref: /llvm-project/llvm/test/CodeGen/X86/stack-clash-large.ll (revision 7b3bbd83c0c24087072ec5b22a76799ab31f87d5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp
2; RUN: llc -mtriple=x86_64-linux-android < %s | FileCheck -check-prefix=CHECK-X64 %s
3; RUN: llc -mtriple=i686-linux-android < %s | FileCheck -check-prefix=CHECK-X86 %s
4; RUN: llc -mtriple=x86_64-linux-gnux32 < %s | FileCheck -check-prefix=CHECK-X32 %s
5
6define i32 @foo() local_unnamed_addr #0 {
7; CHECK-X64-LABEL: foo:
8; CHECK-X64:       # %bb.0:
9; CHECK-X64-NEXT:    movq %rsp, %r11
10; CHECK-X64-NEXT:    subq $69632, %r11 # imm = 0x11000
11; CHECK-X64-NEXT:    .cfi_def_cfa_register %r11
12; CHECK-X64-NEXT:    .cfi_adjust_cfa_offset 69632
13; CHECK-X64-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
14; CHECK-X64-NEXT:    subq $4096, %rsp # imm = 0x1000
15; CHECK-X64-NEXT:    movq $0, (%rsp)
16; CHECK-X64-NEXT:    cmpq %r11, %rsp
17; CHECK-X64-NEXT:    jne .LBB0_1
18; CHECK-X64-NEXT:  # %bb.2:
19; CHECK-X64-NEXT:    subq $2248, %rsp # imm = 0x8C8
20; CHECK-X64-NEXT:    .cfi_def_cfa_register %rsp
21; CHECK-X64-NEXT:    .cfi_def_cfa_offset 71888
22; CHECK-X64-NEXT:    movl $1, 264(%rsp)
23; CHECK-X64-NEXT:    movl $1, 28664(%rsp)
24; CHECK-X64-NEXT:    movl -128(%rsp), %eax
25; CHECK-X64-NEXT:    addq $71880, %rsp # imm = 0x118C8
26; CHECK-X64-NEXT:    .cfi_def_cfa_offset 8
27; CHECK-X64-NEXT:    retq
28;
29; CHECK-X86-LABEL: foo:
30; CHECK-X86:       # %bb.0:
31; CHECK-X86-NEXT:    movl %esp, %eax
32; CHECK-X86-NEXT:    subl $69632, %eax # imm = 0x11000
33; CHECK-X86-NEXT:    .cfi_def_cfa_register %eax
34; CHECK-X86-NEXT:    .cfi_adjust_cfa_offset 69632
35; CHECK-X86-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
36; CHECK-X86-NEXT:    subl $4096, %esp # imm = 0x1000
37; CHECK-X86-NEXT:    movl $0, (%esp)
38; CHECK-X86-NEXT:    cmpl %eax, %esp
39; CHECK-X86-NEXT:    jne .LBB0_1
40; CHECK-X86-NEXT:  # %bb.2:
41; CHECK-X86-NEXT:    subl $2380, %esp # imm = 0x94C
42; CHECK-X86-NEXT:    .cfi_def_cfa_register %esp
43; CHECK-X86-NEXT:    .cfi_def_cfa_offset 72016
44; CHECK-X86-NEXT:    movl $1, 392(%esp)
45; CHECK-X86-NEXT:    movl $1, 28792(%esp)
46; CHECK-X86-NEXT:    movl (%esp), %eax
47; CHECK-X86-NEXT:    addl $72012, %esp # imm = 0x1194C
48; CHECK-X86-NEXT:    .cfi_def_cfa_offset 4
49; CHECK-X86-NEXT:    retl
50;
51; CHECK-X32-LABEL: foo:
52; CHECK-X32:       # %bb.0:
53; CHECK-X32-NEXT:    movl %esp, %r11d
54; CHECK-X32-NEXT:    subl $69632, %r11d # imm = 0x11000
55; CHECK-X32-NEXT:    .cfi_def_cfa_register %r11
56; CHECK-X32-NEXT:    .cfi_adjust_cfa_offset 69632
57; CHECK-X32-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
58; CHECK-X32-NEXT:    subl $4096, %esp # imm = 0x1000
59; CHECK-X32-NEXT:    movq $0, (%esp)
60; CHECK-X32-NEXT:    cmpl %r11d, %esp
61; CHECK-X32-NEXT:    jne .LBB0_1
62; CHECK-X32-NEXT:  # %bb.2:
63; CHECK-X32-NEXT:    subl $2248, %esp # imm = 0x8C8
64; CHECK-X32-NEXT:    .cfi_def_cfa_register %rsp
65; CHECK-X32-NEXT:    .cfi_def_cfa_offset 71888
66; CHECK-X32-NEXT:    movl $1, 264(%esp)
67; CHECK-X32-NEXT:    movl $1, 28664(%esp)
68; CHECK-X32-NEXT:    movl -128(%esp), %eax
69; CHECK-X32-NEXT:    addl $71880, %esp # imm = 0x118C8
70; CHECK-X32-NEXT:    .cfi_def_cfa_offset 8
71; CHECK-X32-NEXT:    retq
72  %a = alloca i32, i64 18000, align 16
73  %b0 = getelementptr inbounds i32, ptr %a, i64 98
74  %b1 = getelementptr inbounds i32, ptr %a, i64 7198
75  store volatile i32 1, ptr %b0
76  store volatile i32 1, ptr %b1
77  %c = load volatile i32, ptr %a
78  ret i32 %c
79}
80
81define void @push_before_probe(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h) "probe-stack"="inline-asm" "no_caller_saved_registers" {
82; CHECK-X64-LABEL: push_before_probe:
83; CHECK-X64:       # %bb.0:
84; CHECK-X64-NEXT:    pushq %rax
85; CHECK-X64-NEXT:    .cfi_def_cfa_offset 16
86; CHECK-X64-NEXT:    movq %rsp, %r11
87; CHECK-X64-NEXT:    subq $69632, %r11 # imm = 0x11000
88; CHECK-X64-NEXT:    .cfi_def_cfa_register %r11
89; CHECK-X64-NEXT:    .cfi_adjust_cfa_offset 69632
90; CHECK-X64-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
91; CHECK-X64-NEXT:    subq $4096, %rsp # imm = 0x1000
92; CHECK-X64-NEXT:    movq $0, (%rsp)
93; CHECK-X64-NEXT:    cmpq %r11, %rsp
94; CHECK-X64-NEXT:    jne .LBB1_1
95; CHECK-X64-NEXT:  # %bb.2:
96; CHECK-X64-NEXT:    subq $2240, %rsp # imm = 0x8C0
97; CHECK-X64-NEXT:    .cfi_def_cfa_register %rsp
98; CHECK-X64-NEXT:    .cfi_def_cfa_offset 71888
99; CHECK-X64-NEXT:    .cfi_offset %rax, -16
100; CHECK-X64-NEXT:    movl 71888(%rsp), %eax
101; CHECK-X64-NEXT:    addl %esi, %edi
102; CHECK-X64-NEXT:    addl %ecx, %edx
103; CHECK-X64-NEXT:    addl %edi, %edx
104; CHECK-X64-NEXT:    addl %r9d, %r8d
105; CHECK-X64-NEXT:    addl 71896(%rsp), %eax
106; CHECK-X64-NEXT:    addl %r8d, %eax
107; CHECK-X64-NEXT:    addl %edx, %eax
108; CHECK-X64-NEXT:    movl %eax, 264(%rsp)
109; CHECK-X64-NEXT:    movl %eax, 28664(%rsp)
110; CHECK-X64-NEXT:    addq $71872, %rsp # imm = 0x118C0
111; CHECK-X64-NEXT:    .cfi_def_cfa_offset 16
112; CHECK-X64-NEXT:    popq %rax
113; CHECK-X64-NEXT:    .cfi_def_cfa_offset 8
114; CHECK-X64-NEXT:    retq
115;
116; CHECK-X86-LABEL: push_before_probe:
117; CHECK-X86:       # %bb.0:
118; CHECK-X86-NEXT:    pushl %esi
119; CHECK-X86-NEXT:    .cfi_def_cfa_offset 8
120; CHECK-X86-NEXT:    pushl %edx
121; CHECK-X86-NEXT:    .cfi_def_cfa_offset 12
122; CHECK-X86-NEXT:    pushl %ecx
123; CHECK-X86-NEXT:    .cfi_def_cfa_offset 16
124; CHECK-X86-NEXT:    pushl %eax
125; CHECK-X86-NEXT:    .cfi_def_cfa_offset 20
126; CHECK-X86-NEXT:    movl %esp, %eax
127; CHECK-X86-NEXT:    subl $69632, %eax # imm = 0x11000
128; CHECK-X86-NEXT:    .cfi_def_cfa_register %eax
129; CHECK-X86-NEXT:    .cfi_adjust_cfa_offset 69632
130; CHECK-X86-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
131; CHECK-X86-NEXT:    subl $4096, %esp # imm = 0x1000
132; CHECK-X86-NEXT:    movl $0, (%esp)
133; CHECK-X86-NEXT:    cmpl %eax, %esp
134; CHECK-X86-NEXT:    jne .LBB1_1
135; CHECK-X86-NEXT:  # %bb.2:
136; CHECK-X86-NEXT:    subl $2380, %esp # imm = 0x94C
137; CHECK-X86-NEXT:    .cfi_def_cfa_register %esp
138; CHECK-X86-NEXT:    .cfi_def_cfa_offset 72032
139; CHECK-X86-NEXT:    .cfi_offset %eax, -20
140; CHECK-X86-NEXT:    .cfi_offset %ecx, -16
141; CHECK-X86-NEXT:    .cfi_offset %edx, -12
142; CHECK-X86-NEXT:    .cfi_offset %esi, -8
143; CHECK-X86-NEXT:    movl 72056(%esp), %eax
144; CHECK-X86-NEXT:    movl 72048(%esp), %edx
145; CHECK-X86-NEXT:    movl 72040(%esp), %ecx
146; CHECK-X86-NEXT:    movl 72032(%esp), %esi
147; CHECK-X86-NEXT:    addl 72036(%esp), %esi
148; CHECK-X86-NEXT:    addl 72044(%esp), %ecx
149; CHECK-X86-NEXT:    addl %esi, %ecx
150; CHECK-X86-NEXT:    addl 72052(%esp), %edx
151; CHECK-X86-NEXT:    addl 72060(%esp), %eax
152; CHECK-X86-NEXT:    addl %edx, %eax
153; CHECK-X86-NEXT:    addl %ecx, %eax
154; CHECK-X86-NEXT:    movl %eax, 392(%esp)
155; CHECK-X86-NEXT:    movl %eax, 28792(%esp)
156; CHECK-X86-NEXT:    addl $72012, %esp # imm = 0x1194C
157; CHECK-X86-NEXT:    .cfi_def_cfa_offset 20
158; CHECK-X86-NEXT:    popl %eax
159; CHECK-X86-NEXT:    .cfi_def_cfa_offset 16
160; CHECK-X86-NEXT:    popl %ecx
161; CHECK-X86-NEXT:    .cfi_def_cfa_offset 12
162; CHECK-X86-NEXT:    popl %edx
163; CHECK-X86-NEXT:    .cfi_def_cfa_offset 8
164; CHECK-X86-NEXT:    popl %esi
165; CHECK-X86-NEXT:    .cfi_def_cfa_offset 4
166; CHECK-X86-NEXT:    retl
167;
168; CHECK-X32-LABEL: push_before_probe:
169; CHECK-X32:       # %bb.0:
170; CHECK-X32-NEXT:    pushq %rax
171; CHECK-X32-NEXT:    .cfi_def_cfa_offset 16
172; CHECK-X32-NEXT:    movl %esp, %r11d
173; CHECK-X32-NEXT:    subl $69632, %r11d # imm = 0x11000
174; CHECK-X32-NEXT:    .cfi_def_cfa_register %r11
175; CHECK-X32-NEXT:    .cfi_adjust_cfa_offset 69632
176; CHECK-X32-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
177; CHECK-X32-NEXT:    subl $4096, %esp # imm = 0x1000
178; CHECK-X32-NEXT:    movq $0, (%esp)
179; CHECK-X32-NEXT:    cmpl %r11d, %esp
180; CHECK-X32-NEXT:    jne .LBB1_1
181; CHECK-X32-NEXT:  # %bb.2:
182; CHECK-X32-NEXT:    subl $2240, %esp # imm = 0x8C0
183; CHECK-X32-NEXT:    .cfi_def_cfa_register %rsp
184; CHECK-X32-NEXT:    .cfi_def_cfa_offset 71888
185; CHECK-X32-NEXT:    .cfi_offset %rax, -16
186; CHECK-X32-NEXT:    movl 71888(%esp), %eax
187; CHECK-X32-NEXT:    addl %esi, %edi
188; CHECK-X32-NEXT:    addl %ecx, %edx
189; CHECK-X32-NEXT:    addl %edi, %edx
190; CHECK-X32-NEXT:    addl %r9d, %r8d
191; CHECK-X32-NEXT:    addl 71896(%esp), %eax
192; CHECK-X32-NEXT:    addl %r8d, %eax
193; CHECK-X32-NEXT:    addl %edx, %eax
194; CHECK-X32-NEXT:    movl %eax, 264(%esp)
195; CHECK-X32-NEXT:    movl %eax, 28664(%esp)
196; CHECK-X32-NEXT:    addl $71872, %esp # imm = 0x118C0
197; CHECK-X32-NEXT:    .cfi_def_cfa_offset 16
198; CHECK-X32-NEXT:    popq %rax
199; CHECK-X32-NEXT:    .cfi_def_cfa_offset 8
200; CHECK-X32-NEXT:    retq
201  %all = alloca i32, i64 18000, align 16
202  %b0 = getelementptr inbounds i32, ptr %all, i64 98
203  %b1 = getelementptr inbounds i32, ptr %all, i64 7198
204  %ab = add i32 %a, %b
205  %cd = add i32 %c, %d
206  %ef = add i32 %e, %f
207  %gh = add i32 %g, %h
208  %abcd = add i32 %ab, %cd
209  %efgh = add i32 %ef, %gh
210  %sum = add i32 %abcd, %efgh
211  store volatile i32 %sum, ptr %b0
212  store volatile i32 %sum, ptr %b1
213  ret void
214}
215
216attributes #0 =  {"probe-stack"="inline-asm"}
217