1 ; RUN: llc < %s -mtriple=i686-linux -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-Linux
2 ; RUN: llc < %s -mtriple=x86_64-linux -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux
3 ; RUN: llc < %s -mtriple=i686-darwin -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-Darwin
4 ; RUN: llc < %s -mtriple=x86_64-darwin -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-Darwin
5 ; RUN: llc < %s -mtriple=i686-mingw32 -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-MinGW
6 ; RUN: llc < %s -mtriple=x86_64-freebsd -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-FreeBSD
8 ; We used to crash with filetype=obj
9 ; RUN: llc < %s -mtriple=i686-linux -segmented-stacks -filetype=obj
10 ; RUN: llc < %s -mtriple=x86_64-linux -segmented-stacks -filetype=obj
11 ; RUN: llc < %s -mtriple=i686-darwin -segmented-stacks -filetype=obj
12 ; RUN: llc < %s -mtriple=x86_64-darwin -segmented-stacks -filetype=obj
13 ; RUN: llc < %s -mtriple=i686-mingw32 -segmented-stacks -filetype=obj
14 ; RUN: llc < %s -mtriple=x86_64-freebsd -segmented-stacks -filetype=obj
16 ; Just to prevent the alloca from being optimized away
17 declare void @dummy_use(i32*, i32)
19 define void @test_basic() {
20 %mem = alloca i32, i32 10
21 call void @dummy_use (i32* %mem, i32 10)
24 ; X32-Linux: test_basic:
26 ; X32-Linux: cmpl %gs:48, %esp
27 ; X32-Linux-NEXT: ja .LBB0_2
30 ; X32-Linux-NEXT: pushl $60
31 ; X32-Linux-NEXT: calll __morestack
34 ; X64-Linux: test_basic:
36 ; X64-Linux: cmpq %fs:112, %rsp
37 ; X64-Linux-NEXT: ja .LBB0_2
39 ; X64-Linux: movabsq $40, %r10
40 ; X64-Linux-NEXT: movabsq $0, %r11
41 ; X64-Linux-NEXT: callq __morestack
44 ; X32-Darwin: test_basic:
46 ; X32-Darwin: movl $432, %ecx
47 ; X32-Darwin-NEXT: cmpl %gs:(%ecx), %esp
48 ; X32-Darwin-NEXT: ja LBB0_2
50 ; X32-Darwin: pushl $0
51 ; X32-Darwin-NEXT: pushl $60
52 ; X32-Darwin-NEXT: calll ___morestack
53 ; X32-Darwin-NEXT: ret
55 ; X64-Darwin: test_basic:
57 ; X64-Darwin: cmpq %gs:816, %rsp
58 ; X64-Darwin-NEXT: ja LBB0_2
60 ; X64-Darwin: movabsq $40, %r10
61 ; X64-Darwin-NEXT: movabsq $0, %r11
62 ; X64-Darwin-NEXT: callq ___morestack
63 ; X64-Darwin-NEXT: ret
65 ; X32-MinGW: test_basic:
67 ; X32-MinGW: cmpl %fs:20, %esp
68 ; X32-MinGW-NEXT: ja LBB0_2
71 ; X32-MinGW-NEXT: pushl $48
72 ; X32-MinGW-NEXT: calll ___morestack
75 ; X64-FreeBSD: test_basic:
77 ; X64-FreeBSD: cmpq %fs:24, %rsp
78 ; X64-FreeBSD-NEXT: ja .LBB0_2
80 ; X64-FreeBSD: movabsq $40, %r10
81 ; X64-FreeBSD-NEXT: movabsq $0, %r11
82 ; X64-FreeBSD-NEXT: callq __morestack
83 ; X64-FreeBSD-NEXT: ret
87 define i32 @test_nested(i32 * nest %closure, i32 %other) {
88 %addend = load i32 * %closure
89 %result = add i32 %other, %addend
92 ; X32-Linux: cmpl %gs:48, %esp
93 ; X32-Linux-NEXT: ja .LBB1_2
96 ; X32-Linux-NEXT: pushl $0
97 ; X32-Linux-NEXT: calll __morestack
100 ; X64-Linux: cmpq %fs:112, %rsp
101 ; X64-Linux-NEXT: ja .LBB1_2
103 ; X64-Linux: movq %r10, %rax
104 ; X64-Linux-NEXT: movabsq $0, %r10
105 ; X64-Linux-NEXT: movabsq $0, %r11
106 ; X64-Linux-NEXT: callq __morestack
107 ; X64-Linux-NEXT: ret
108 ; X64-Linux-NEXT: movq %rax, %r10
110 ; X32-Darwin: movl $432, %edx
111 ; X32-Darwin-NEXT: cmpl %gs:(%edx), %esp
112 ; X32-Darwin-NEXT: ja LBB1_2
114 ; X32-Darwin: pushl $4
115 ; X32-Darwin-NEXT: pushl $0
116 ; X32-Darwin-NEXT: calll ___morestack
117 ; X32-Darwin-NEXT: ret
119 ; X64-Darwin: cmpq %gs:816, %rsp
120 ; X64-Darwin-NEXT: ja LBB1_2
122 ; X64-Darwin: movq %r10, %rax
123 ; X64-Darwin-NEXT: movabsq $0, %r10
124 ; X64-Darwin-NEXT: movabsq $0, %r11
125 ; X64-Darwin-NEXT: callq ___morestack
126 ; X64-Darwin-NEXT: ret
127 ; X64-Darwin-NEXT: movq %rax, %r10
129 ; X32-MinGW: cmpl %fs:20, %esp
130 ; X32-MinGW-NEXT: ja LBB1_2
132 ; X32-MinGW: pushl $4
133 ; X32-MinGW-NEXT: pushl $0
134 ; X32-MinGW-NEXT: calll ___morestack
135 ; X32-MinGW-NEXT: ret
137 ; X64-FreeBSD: cmpq %fs:24, %rsp
138 ; X64-FreeBSD-NEXT: ja .LBB1_2
140 ; X64-FreeBSD: movq %r10, %rax
141 ; X64-FreeBSD-NEXT: movabsq $0, %r10
142 ; X64-FreeBSD-NEXT: movabsq $0, %r11
143 ; X64-FreeBSD-NEXT: callq __morestack
144 ; X64-FreeBSD-NEXT: ret
145 ; X64-FreeBSD-NEXT: movq %rax, %r10
149 define void @test_large() {
150 %mem = alloca i32, i32 10000
151 call void @dummy_use (i32* %mem, i32 0)
154 ; X32-Linux: leal -40012(%esp), %ecx
155 ; X32-Linux-NEXT: cmpl %gs:48, %ecx
156 ; X32-Linux-NEXT: ja .LBB2_2
158 ; X32-Linux: pushl $0
159 ; X32-Linux-NEXT: pushl $40012
160 ; X32-Linux-NEXT: calll __morestack
161 ; X32-Linux-NEXT: ret
163 ; X64-Linux: leaq -40008(%rsp), %r11
164 ; X64-Linux-NEXT: cmpq %fs:112, %r11
165 ; X64-Linux-NEXT: ja .LBB2_2
167 ; X64-Linux: movabsq $40008, %r10
168 ; X64-Linux-NEXT: movabsq $0, %r11
169 ; X64-Linux-NEXT: callq __morestack
170 ; X64-Linux-NEXT: ret
172 ; X32-Darwin: leal -40012(%esp), %ecx
173 ; X32-Darwin-NEXT: movl $432, %eax
174 ; X32-Darwin-NEXT: cmpl %gs:(%eax), %ecx
175 ; X32-Darwin-NEXT: ja LBB2_2
177 ; X32-Darwin: pushl $0
178 ; X32-Darwin-NEXT: pushl $40012
179 ; X32-Darwin-NEXT: calll ___morestack
180 ; X32-Darwin-NEXT: ret
182 ; X64-Darwin: leaq -40008(%rsp), %r11
183 ; X64-Darwin-NEXT: cmpq %gs:816, %r11
184 ; X64-Darwin-NEXT: ja LBB2_2
186 ; X64-Darwin: movabsq $40008, %r10
187 ; X64-Darwin-NEXT: movabsq $0, %r11
188 ; X64-Darwin-NEXT: callq ___morestack
189 ; X64-Darwin-NEXT: ret
191 ; X32-MinGW: leal -40008(%esp), %ecx
192 ; X32-MinGW-NEXT: cmpl %fs:20, %ecx
193 ; X32-MinGW-NEXT: ja LBB2_2
195 ; X32-MinGW: pushl $0
196 ; X32-MinGW-NEXT: pushl $40008
197 ; X32-MinGW-NEXT: calll ___morestack
198 ; X32-MinGW-NEXT: ret
200 ; X64-FreeBSD: leaq -40008(%rsp), %r11
201 ; X64-FreeBSD-NEXT: cmpq %fs:24, %r11
202 ; X64-FreeBSD-NEXT: ja .LBB2_2
204 ; X64-FreeBSD: movabsq $40008, %r10
205 ; X64-FreeBSD-NEXT: movabsq $0, %r11
206 ; X64-FreeBSD-NEXT: callq __morestack
207 ; X64-FreeBSD-NEXT: ret
211 define fastcc void @test_fastcc() {
212 %mem = alloca i32, i32 10
213 call void @dummy_use (i32* %mem, i32 10)
216 ; X32-Linux: test_fastcc:
218 ; X32-Linux: cmpl %gs:48, %esp
219 ; X32-Linux-NEXT: ja .LBB3_2
221 ; X32-Linux: pushl $0
222 ; X32-Linux-NEXT: pushl $60
223 ; X32-Linux-NEXT: calll __morestack
224 ; X32-Linux-NEXT: ret
226 ; X64-Linux: test_fastcc:
228 ; X64-Linux: cmpq %fs:112, %rsp
229 ; X64-Linux-NEXT: ja .LBB3_2
231 ; X64-Linux: movabsq $40, %r10
232 ; X64-Linux-NEXT: movabsq $0, %r11
233 ; X64-Linux-NEXT: callq __morestack
234 ; X64-Linux-NEXT: ret
236 ; X32-Darwin: test_fastcc:
238 ; X32-Darwin: movl $432, %eax
239 ; X32-Darwin-NEXT: cmpl %gs:(%eax), %esp
240 ; X32-Darwin-NEXT: ja LBB3_2
242 ; X32-Darwin: pushl $0
243 ; X32-Darwin-NEXT: pushl $60
244 ; X32-Darwin-NEXT: calll ___morestack
245 ; X32-Darwin-NEXT: ret
247 ; X64-Darwin: test_fastcc:
249 ; X64-Darwin: cmpq %gs:816, %rsp
250 ; X64-Darwin-NEXT: ja LBB3_2
252 ; X64-Darwin: movabsq $40, %r10
253 ; X64-Darwin-NEXT: movabsq $0, %r11
254 ; X64-Darwin-NEXT: callq ___morestack
255 ; X64-Darwin-NEXT: ret
257 ; X32-MinGW: test_fastcc:
259 ; X32-MinGW: cmpl %fs:20, %esp
260 ; X32-MinGW-NEXT: ja LBB3_2
262 ; X32-MinGW: pushl $0
263 ; X32-MinGW-NEXT: pushl $48
264 ; X32-MinGW-NEXT: calll ___morestack
265 ; X32-MinGW-NEXT: ret
267 ; X64-FreeBSD: test_fastcc:
269 ; X64-FreeBSD: cmpq %fs:24, %rsp
270 ; X64-FreeBSD-NEXT: ja .LBB3_2
272 ; X64-FreeBSD: movabsq $40, %r10
273 ; X64-FreeBSD-NEXT: movabsq $0, %r11
274 ; X64-FreeBSD-NEXT: callq __morestack
275 ; X64-FreeBSD-NEXT: ret
279 define fastcc void @test_fastcc_large() {
280 %mem = alloca i32, i32 10000
281 call void @dummy_use (i32* %mem, i32 0)
284 ; X32-Linux: test_fastcc_large:
286 ; X32-Linux: leal -40012(%esp), %eax
287 ; X32-Linux-NEXT: cmpl %gs:48, %eax
288 ; X32-Linux-NEXT: ja .LBB4_2
290 ; X32-Linux: pushl $0
291 ; X32-Linux-NEXT: pushl $40012
292 ; X32-Linux-NEXT: calll __morestack
293 ; X32-Linux-NEXT: ret
295 ; X64-Linux: test_fastcc_large:
297 ; X64-Linux: leaq -40008(%rsp), %r11
298 ; X64-Linux-NEXT: cmpq %fs:112, %r11
299 ; X64-Linux-NEXT: ja .LBB4_2
301 ; X64-Linux: movabsq $40008, %r10
302 ; X64-Linux-NEXT: movabsq $0, %r11
303 ; X64-Linux-NEXT: callq __morestack
304 ; X64-Linux-NEXT: ret
306 ; X32-Darwin: test_fastcc_large:
308 ; X32-Darwin: leal -40012(%esp), %eax
309 ; X32-Darwin-NEXT: movl $432, %ecx
310 ; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
311 ; X32-Darwin-NEXT: ja LBB4_2
313 ; X32-Darwin: pushl $0
314 ; X32-Darwin-NEXT: pushl $40012
315 ; X32-Darwin-NEXT: calll ___morestack
316 ; X32-Darwin-NEXT: ret
318 ; X64-Darwin: test_fastcc_large:
320 ; X64-Darwin: leaq -40008(%rsp), %r11
321 ; X64-Darwin-NEXT: cmpq %gs:816, %r11
322 ; X64-Darwin-NEXT: ja LBB4_2
324 ; X64-Darwin: movabsq $40008, %r10
325 ; X64-Darwin-NEXT: movabsq $0, %r11
326 ; X64-Darwin-NEXT: callq ___morestack
327 ; X64-Darwin-NEXT: ret
329 ; X32-MinGW: test_fastcc_large:
331 ; X32-MinGW: leal -40008(%esp), %eax
332 ; X32-MinGW-NEXT: cmpl %fs:20, %eax
333 ; X32-MinGW-NEXT: ja LBB4_2
335 ; X32-MinGW: pushl $0
336 ; X32-MinGW-NEXT: pushl $40008
337 ; X32-MinGW-NEXT: calll ___morestack
338 ; X32-MinGW-NEXT: ret
340 ; X64-FreeBSD: test_fastcc_large:
342 ; X64-FreeBSD: leaq -40008(%rsp), %r11
343 ; X64-FreeBSD-NEXT: cmpq %fs:24, %r11
344 ; X64-FreeBSD-NEXT: ja .LBB4_2
346 ; X64-FreeBSD: movabsq $40008, %r10
347 ; X64-FreeBSD-NEXT: movabsq $0, %r11
348 ; X64-FreeBSD-NEXT: callq __morestack
349 ; X64-FreeBSD-NEXT: ret
353 define fastcc void @test_fastcc_large_with_ecx_arg(i32 %a) {
354 %mem = alloca i32, i32 10000
355 call void @dummy_use (i32* %mem, i32 %a)
358 ; This is testing that the Mac implementation preserves ecx
360 ; X32-Darwin: test_fastcc_large_with_ecx_arg:
362 ; X32-Darwin: leal -40012(%esp), %eax
363 ; X32-Darwin-NEXT: pushl %ecx
364 ; X32-Darwin-NEXT: movl $432, %ecx
365 ; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
366 ; X32-Darwin-NEXT: popl %ecx
367 ; X32-Darwin-NEXT: ja LBB5_2
369 ; X32-Darwin: pushl $0
370 ; X32-Darwin-NEXT: pushl $40012
371 ; X32-Darwin-NEXT: calll ___morestack
372 ; X32-Darwin-NEXT: ret