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
7 ; We used to crash with filetype=obj
8 ; RUN: llc < %s -mtriple=i686-linux -segmented-stacks -filetype=obj
9 ; RUN: llc < %s -mtriple=x86_64-linux -segmented-stacks -filetype=obj
10 ; RUN: llc < %s -mtriple=i686-darwin -segmented-stacks -filetype=obj
11 ; RUN: llc < %s -mtriple=x86_64-darwin -segmented-stacks -filetype=obj
12 ; RUN: llc < %s -mtriple=i686-mingw32 -segmented-stacks -filetype=obj
14 ; Just to prevent the alloca from being optimized away
15 declare void @dummy_use(i32*, i32)
17 define void @test_basic() {
18 %mem = alloca i32, i32 10
19 call void @dummy_use (i32* %mem, i32 10)
22 ; X32-Linux: test_basic:
24 ; X32-Linux: cmpl %gs:48, %esp
25 ; X32-Linux-NEXT: ja .LBB0_2
28 ; X32-Linux-NEXT: pushl $60
29 ; X32-Linux-NEXT: calll __morestack
32 ; X64-Linux: test_basic:
34 ; X64-Linux: cmpq %fs:112, %rsp
35 ; X64-Linux-NEXT: ja .LBB0_2
37 ; X64-Linux: movabsq $40, %r10
38 ; X64-Linux-NEXT: movabsq $0, %r11
39 ; X64-Linux-NEXT: callq __morestack
42 ; X32-Darwin: test_basic:
44 ; X32-Darwin: movl $432, %ecx
45 ; X32-Darwin-NEXT: cmpl %gs:(%ecx), %esp
46 ; X32-Darwin-NEXT: ja LBB0_2
48 ; X32-Darwin: pushl $0
49 ; X32-Darwin-NEXT: pushl $60
50 ; X32-Darwin-NEXT: calll ___morestack
51 ; X32-Darwin-NEXT: ret
53 ; X64-Darwin: test_basic:
55 ; X64-Darwin: cmpq %gs:816, %rsp
56 ; X64-Darwin-NEXT: ja LBB0_2
58 ; X64-Darwin: movabsq $40, %r10
59 ; X64-Darwin-NEXT: movabsq $0, %r11
60 ; X64-Darwin-NEXT: callq ___morestack
61 ; X64-Darwin-NEXT: ret
63 ; X32-MinGW: test_basic:
65 ; X32-MinGW: cmpl %fs:20, %esp
66 ; X32-MinGW-NEXT: ja LBB0_2
69 ; X32-MinGW-NEXT: pushl $48
70 ; X32-MinGW-NEXT: calll ___morestack
75 define i32 @test_nested(i32 * nest %closure, i32 %other) {
76 %addend = load i32 * %closure
77 %result = add i32 %other, %addend
80 ; X32-Linux: cmpl %gs:48, %esp
81 ; X32-Linux-NEXT: ja .LBB1_2
84 ; X32-Linux-NEXT: pushl $0
85 ; X32-Linux-NEXT: calll __morestack
88 ; X64-Linux: cmpq %fs:112, %rsp
89 ; X64-Linux-NEXT: ja .LBB1_2
91 ; X64-Linux: movq %r10, %rax
92 ; X64-Linux-NEXT: movabsq $0, %r10
93 ; X64-Linux-NEXT: movabsq $0, %r11
94 ; X64-Linux-NEXT: callq __morestack
96 ; X64-Linux-NEXT: movq %rax, %r10
98 ; X32-Darwin: movl $432, %edx
99 ; X32-Darwin-NEXT: cmpl %gs:(%edx), %esp
100 ; X32-Darwin-NEXT: ja LBB1_2
102 ; X32-Darwin: pushl $4
103 ; X32-Darwin-NEXT: pushl $0
104 ; X32-Darwin-NEXT: calll ___morestack
105 ; X32-Darwin-NEXT: ret
107 ; X64-Darwin: cmpq %gs:816, %rsp
108 ; X64-Darwin-NEXT: ja LBB1_2
110 ; X64-Darwin: movq %r10, %rax
111 ; X64-Darwin-NEXT: movabsq $0, %r10
112 ; X64-Darwin-NEXT: movabsq $0, %r11
113 ; X64-Darwin-NEXT: callq ___morestack
114 ; X64-Darwin-NEXT: ret
115 ; X64-Darwin-NEXT: movq %rax, %r10
117 ; X32-MinGW: cmpl %fs:20, %esp
118 ; X32-MinGW-NEXT: ja LBB1_2
120 ; X32-MinGW: pushl $4
121 ; X32-MinGW-NEXT: pushl $0
122 ; X32-MinGW-NEXT: calll ___morestack
123 ; X32-MinGW-NEXT: ret
127 define void @test_large() {
128 %mem = alloca i32, i32 10000
129 call void @dummy_use (i32* %mem, i32 0)
132 ; X32-Linux: leal -40012(%esp), %ecx
133 ; X32-Linux-NEXT: cmpl %gs:48, %ecx
134 ; X32-Linux-NEXT: ja .LBB2_2
136 ; X32-Linux: pushl $0
137 ; X32-Linux-NEXT: pushl $40012
138 ; X32-Linux-NEXT: calll __morestack
139 ; X32-Linux-NEXT: ret
141 ; X64-Linux: leaq -40008(%rsp), %r11
142 ; X64-Linux-NEXT: cmpq %fs:112, %r11
143 ; X64-Linux-NEXT: ja .LBB2_2
145 ; X64-Linux: movabsq $40008, %r10
146 ; X64-Linux-NEXT: movabsq $0, %r11
147 ; X64-Linux-NEXT: callq __morestack
148 ; X64-Linux-NEXT: ret
150 ; X32-Darwin: leal -40012(%esp), %ecx
151 ; X32-Darwin-NEXT: movl $432, %eax
152 ; X32-Darwin-NEXT: cmpl %gs:(%eax), %ecx
153 ; X32-Darwin-NEXT: ja LBB2_2
155 ; X32-Darwin: pushl $0
156 ; X32-Darwin-NEXT: pushl $40012
157 ; X32-Darwin-NEXT: calll ___morestack
158 ; X32-Darwin-NEXT: ret
160 ; X64-Darwin: leaq -40008(%rsp), %r11
161 ; X64-Darwin-NEXT: cmpq %gs:816, %r11
162 ; X64-Darwin-NEXT: ja LBB2_2
164 ; X64-Darwin: movabsq $40008, %r10
165 ; X64-Darwin-NEXT: movabsq $0, %r11
166 ; X64-Darwin-NEXT: callq ___morestack
167 ; X64-Darwin-NEXT: ret
169 ; X32-MinGW: leal -40008(%esp), %ecx
170 ; X32-MinGW-NEXT: cmpl %fs:20, %ecx
171 ; X32-MinGW-NEXT: ja LBB2_2
173 ; X32-MinGW: pushl $0
174 ; X32-MinGW-NEXT: pushl $40008
175 ; X32-MinGW-NEXT: calll ___morestack
176 ; X32-MinGW-NEXT: ret
180 define fastcc void @test_fastcc() {
181 %mem = alloca i32, i32 10
182 call void @dummy_use (i32* %mem, i32 10)
185 ; X32-Linux: test_fastcc:
187 ; X32-Linux: cmpl %gs:48, %esp
188 ; X32-Linux-NEXT: ja .LBB3_2
190 ; X32-Linux: pushl $0
191 ; X32-Linux-NEXT: pushl $60
192 ; X32-Linux-NEXT: calll __morestack
193 ; X32-Linux-NEXT: ret
195 ; X64-Linux: test_fastcc:
197 ; X64-Linux: cmpq %fs:112, %rsp
198 ; X64-Linux-NEXT: ja .LBB3_2
200 ; X64-Linux: movabsq $40, %r10
201 ; X64-Linux-NEXT: movabsq $0, %r11
202 ; X64-Linux-NEXT: callq __morestack
203 ; X64-Linux-NEXT: ret
205 ; X32-Darwin: test_fastcc:
207 ; X32-Darwin: movl $432, %eax
208 ; X32-Darwin-NEXT: cmpl %gs:(%eax), %esp
209 ; X32-Darwin-NEXT: ja LBB3_2
211 ; X32-Darwin: pushl $0
212 ; X32-Darwin-NEXT: pushl $60
213 ; X32-Darwin-NEXT: calll ___morestack
214 ; X32-Darwin-NEXT: ret
216 ; X64-Darwin: test_fastcc:
218 ; X64-Darwin: cmpq %gs:816, %rsp
219 ; X64-Darwin-NEXT: ja LBB3_2
221 ; X64-Darwin: movabsq $40, %r10
222 ; X64-Darwin-NEXT: movabsq $0, %r11
223 ; X64-Darwin-NEXT: callq ___morestack
224 ; X64-Darwin-NEXT: ret
226 ; X32-MinGW: test_fastcc:
228 ; X32-MinGW: cmpl %fs:20, %esp
229 ; X32-MinGW-NEXT: ja LBB3_2
231 ; X32-MinGW: pushl $0
232 ; X32-MinGW-NEXT: pushl $48
233 ; X32-MinGW-NEXT: calll ___morestack
234 ; X32-MinGW-NEXT: ret
238 define fastcc void @test_fastcc_large() {
239 %mem = alloca i32, i32 10000
240 call void @dummy_use (i32* %mem, i32 0)
243 ; X32-Linux: test_fastcc_large:
245 ; X32-Linux: leal -40012(%esp), %eax
246 ; X32-Linux-NEXT: cmpl %gs:48, %eax
247 ; X32-Linux-NEXT: ja .LBB4_2
249 ; X32-Linux: pushl $0
250 ; X32-Linux-NEXT: pushl $40012
251 ; X32-Linux-NEXT: calll __morestack
252 ; X32-Linux-NEXT: ret
254 ; X64-Linux: test_fastcc_large:
256 ; X64-Linux: leaq -40008(%rsp), %r11
257 ; X64-Linux-NEXT: cmpq %fs:112, %r11
258 ; X64-Linux-NEXT: ja .LBB4_2
260 ; X64-Linux: movabsq $40008, %r10
261 ; X64-Linux-NEXT: movabsq $0, %r11
262 ; X64-Linux-NEXT: callq __morestack
263 ; X64-Linux-NEXT: ret
265 ; X32-Darwin: test_fastcc_large:
267 ; X32-Darwin: leal -40012(%esp), %eax
268 ; X32-Darwin-NEXT: movl $432, %ecx
269 ; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
270 ; X32-Darwin-NEXT: ja LBB4_2
272 ; X32-Darwin: pushl $0
273 ; X32-Darwin-NEXT: pushl $40012
274 ; X32-Darwin-NEXT: calll ___morestack
275 ; X32-Darwin-NEXT: ret
277 ; X64-Darwin: test_fastcc_large:
279 ; X64-Darwin: leaq -40008(%rsp), %r11
280 ; X64-Darwin-NEXT: cmpq %gs:816, %r11
281 ; X64-Darwin-NEXT: ja LBB4_2
283 ; X64-Darwin: movabsq $40008, %r10
284 ; X64-Darwin-NEXT: movabsq $0, %r11
285 ; X64-Darwin-NEXT: callq ___morestack
286 ; X64-Darwin-NEXT: ret
288 ; X32-MinGW: test_fastcc_large:
290 ; X32-MinGW: leal -40008(%esp), %eax
291 ; X32-MinGW-NEXT: cmpl %fs:20, %eax
292 ; X32-MinGW-NEXT: ja LBB4_2
294 ; X32-MinGW: pushl $0
295 ; X32-MinGW-NEXT: pushl $40008
296 ; X32-MinGW-NEXT: calll ___morestack
297 ; X32-MinGW-NEXT: ret
301 define fastcc void @test_fastcc_large_with_ecx_arg(i32 %a) {
302 %mem = alloca i32, i32 10000
303 call void @dummy_use (i32* %mem, i32 %a)
306 ; This is testing that the Mac implementation preserves ecx
308 ; X32-Darwin: test_fastcc_large_with_ecx_arg:
310 ; X32-Darwin: leal -40012(%esp), %eax
311 ; X32-Darwin-NEXT: pushl %ecx
312 ; X32-Darwin-NEXT: movl $432, %ecx
313 ; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
314 ; X32-Darwin-NEXT: popl %ecx
315 ; X32-Darwin-NEXT: ja LBB5_2
317 ; X32-Darwin: pushl $0
318 ; X32-Darwin-NEXT: pushl $40012
319 ; X32-Darwin-NEXT: calll ___morestack
320 ; X32-Darwin-NEXT: ret