blob: 3650304a0880ecc7dd579b8e47dc7f8073ec64eb [file] [log] [blame]
Rafael Espindola2028b792012-01-11 19:00:37 +00001; 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
Rafael Espindolae4d18de2012-01-12 20:22:08 +00005; RUN: llc < %s -mtriple=i686-mingw32 -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-MinGW
Rafael Espindola85b9d432012-01-12 20:24:30 +00006; RUN: llc < %s -mtriple=x86_64-freebsd -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-FreeBSD
Rafael Espindolab0bf8932011-08-30 19:51:29 +00007
Rafael Espindola014f7a32012-01-11 18:14:03 +00008; 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
Rafael Espindola2028b792012-01-11 19:00:37 +000011; RUN: llc < %s -mtriple=i686-darwin -segmented-stacks -filetype=obj
12; RUN: llc < %s -mtriple=x86_64-darwin -segmented-stacks -filetype=obj
Rafael Espindolae4d18de2012-01-12 20:22:08 +000013; RUN: llc < %s -mtriple=i686-mingw32 -segmented-stacks -filetype=obj
Rafael Espindola85b9d432012-01-12 20:24:30 +000014; RUN: llc < %s -mtriple=x86_64-freebsd -segmented-stacks -filetype=obj
Rafael Espindola014f7a32012-01-11 18:14:03 +000015
Rafael Espindolab0bf8932011-08-30 19:51:29 +000016; Just to prevent the alloca from being optimized away
17declare void @dummy_use(i32*, i32)
18
Rafael Espindola7692ce92012-01-11 18:51:03 +000019define void @test_basic() {
20 %mem = alloca i32, i32 10
21 call void @dummy_use (i32* %mem, i32 10)
22 ret void
Rafael Espindolab0bf8932011-08-30 19:51:29 +000023
Rafael Espindola2028b792012-01-11 19:00:37 +000024; X32-Linux: test_basic:
Rafael Espindolab0bf8932011-08-30 19:51:29 +000025
Rafael Espindola2028b792012-01-11 19:00:37 +000026; X32-Linux: cmpl %gs:48, %esp
27; X32-Linux-NEXT: ja .LBB0_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000028
Rafael Espindola2028b792012-01-11 19:00:37 +000029; X32-Linux: pushl $0
30; X32-Linux-NEXT: pushl $60
31; X32-Linux-NEXT: calll __morestack
32; X32-Linux-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +000033
Rafael Espindola2028b792012-01-11 19:00:37 +000034; X64-Linux: test_basic:
Rafael Espindolab0bf8932011-08-30 19:51:29 +000035
Rafael Espindola2028b792012-01-11 19:00:37 +000036; X64-Linux: cmpq %fs:112, %rsp
37; X64-Linux-NEXT: ja .LBB0_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000038
Rafael Espindola2028b792012-01-11 19:00:37 +000039; X64-Linux: movabsq $40, %r10
40; X64-Linux-NEXT: movabsq $0, %r11
41; X64-Linux-NEXT: callq __morestack
42; X64-Linux-NEXT: ret
43
44; X32-Darwin: test_basic:
45
46; X32-Darwin: movl $432, %ecx
47; X32-Darwin-NEXT: cmpl %gs:(%ecx), %esp
48; X32-Darwin-NEXT: ja LBB0_2
49
50; X32-Darwin: pushl $0
51; X32-Darwin-NEXT: pushl $60
52; X32-Darwin-NEXT: calll ___morestack
53; X32-Darwin-NEXT: ret
54
55; X64-Darwin: test_basic:
56
57; X64-Darwin: cmpq %gs:816, %rsp
58; X64-Darwin-NEXT: ja LBB0_2
59
60; X64-Darwin: movabsq $40, %r10
61; X64-Darwin-NEXT: movabsq $0, %r11
62; X64-Darwin-NEXT: callq ___morestack
63; X64-Darwin-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +000064
Rafael Espindolae4d18de2012-01-12 20:22:08 +000065; X32-MinGW: test_basic:
66
67; X32-MinGW: cmpl %fs:20, %esp
68; X32-MinGW-NEXT: ja LBB0_2
69
70; X32-MinGW: pushl $0
71; X32-MinGW-NEXT: pushl $48
72; X32-MinGW-NEXT: calll ___morestack
73; X32-MinGW-NEXT: ret
74
Rafael Espindola85b9d432012-01-12 20:24:30 +000075; X64-FreeBSD: test_basic:
76
77; X64-FreeBSD: cmpq %fs:24, %rsp
78; X64-FreeBSD-NEXT: ja .LBB0_2
79
80; X64-FreeBSD: movabsq $40, %r10
81; X64-FreeBSD-NEXT: movabsq $0, %r11
82; X64-FreeBSD-NEXT: callq __morestack
83; X64-FreeBSD-NEXT: ret
84
Rafael Espindolab0bf8932011-08-30 19:51:29 +000085}
86
87define i32 @test_nested(i32 * nest %closure, i32 %other) {
88 %addend = load i32 * %closure
89 %result = add i32 %other, %addend
90 ret i32 %result
91
Rafael Espindola2028b792012-01-11 19:00:37 +000092; X32-Linux: cmpl %gs:48, %esp
93; X32-Linux-NEXT: ja .LBB1_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000094
Rafael Espindola2028b792012-01-11 19:00:37 +000095; X32-Linux: pushl $4
96; X32-Linux-NEXT: pushl $0
97; X32-Linux-NEXT: calll __morestack
98; X32-Linux-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +000099
Rafael Espindola2028b792012-01-11 19:00:37 +0000100; X64-Linux: cmpq %fs:112, %rsp
101; X64-Linux-NEXT: ja .LBB1_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +0000102
Rafael Espindola2028b792012-01-11 19:00:37 +0000103; 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
109
110; X32-Darwin: movl $432, %edx
111; X32-Darwin-NEXT: cmpl %gs:(%edx), %esp
112; X32-Darwin-NEXT: ja LBB1_2
113
114; X32-Darwin: pushl $4
115; X32-Darwin-NEXT: pushl $0
116; X32-Darwin-NEXT: calll ___morestack
117; X32-Darwin-NEXT: ret
118
119; X64-Darwin: cmpq %gs:816, %rsp
120; X64-Darwin-NEXT: ja LBB1_2
121
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
Rafael Espindolab0bf8932011-08-30 19:51:29 +0000128
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000129; X32-MinGW: cmpl %fs:20, %esp
130; X32-MinGW-NEXT: ja LBB1_2
131
132; X32-MinGW: pushl $4
133; X32-MinGW-NEXT: pushl $0
134; X32-MinGW-NEXT: calll ___morestack
135; X32-MinGW-NEXT: ret
136
Rafael Espindola85b9d432012-01-12 20:24:30 +0000137; X64-FreeBSD: cmpq %fs:24, %rsp
138; X64-FreeBSD-NEXT: ja .LBB1_2
139
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
146
Rafael Espindolab0bf8932011-08-30 19:51:29 +0000147}
Sanjoy Das199ce332011-12-03 09:32:07 +0000148
149define void @test_large() {
150 %mem = alloca i32, i32 10000
151 call void @dummy_use (i32* %mem, i32 0)
152 ret void
153
Rafael Espindola2028b792012-01-11 19:00:37 +0000154; X32-Linux: leal -40012(%esp), %ecx
155; X32-Linux-NEXT: cmpl %gs:48, %ecx
156; X32-Linux-NEXT: ja .LBB2_2
Sanjoy Das199ce332011-12-03 09:32:07 +0000157
Rafael Espindola2028b792012-01-11 19:00:37 +0000158; X32-Linux: pushl $0
159; X32-Linux-NEXT: pushl $40012
160; X32-Linux-NEXT: calll __morestack
161; X32-Linux-NEXT: ret
Sanjoy Das199ce332011-12-03 09:32:07 +0000162
Rafael Espindola2028b792012-01-11 19:00:37 +0000163; X64-Linux: leaq -40008(%rsp), %r11
164; X64-Linux-NEXT: cmpq %fs:112, %r11
165; X64-Linux-NEXT: ja .LBB2_2
Sanjoy Das199ce332011-12-03 09:32:07 +0000166
Rafael Espindola2028b792012-01-11 19:00:37 +0000167; X64-Linux: movabsq $40008, %r10
168; X64-Linux-NEXT: movabsq $0, %r11
169; X64-Linux-NEXT: callq __morestack
170; X64-Linux-NEXT: ret
171
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
176
177; X32-Darwin: pushl $0
178; X32-Darwin-NEXT: pushl $40012
179; X32-Darwin-NEXT: calll ___morestack
180; X32-Darwin-NEXT: ret
181
182; X64-Darwin: leaq -40008(%rsp), %r11
183; X64-Darwin-NEXT: cmpq %gs:816, %r11
184; X64-Darwin-NEXT: ja LBB2_2
185
186; X64-Darwin: movabsq $40008, %r10
187; X64-Darwin-NEXT: movabsq $0, %r11
188; X64-Darwin-NEXT: callq ___morestack
189; X64-Darwin-NEXT: ret
Sanjoy Das199ce332011-12-03 09:32:07 +0000190
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000191; X32-MinGW: leal -40008(%esp), %ecx
192; X32-MinGW-NEXT: cmpl %fs:20, %ecx
193; X32-MinGW-NEXT: ja LBB2_2
194
195; X32-MinGW: pushl $0
196; X32-MinGW-NEXT: pushl $40008
197; X32-MinGW-NEXT: calll ___morestack
198; X32-MinGW-NEXT: ret
199
Rafael Espindola85b9d432012-01-12 20:24:30 +0000200; X64-FreeBSD: leaq -40008(%rsp), %r11
201; X64-FreeBSD-NEXT: cmpq %fs:24, %r11
202; X64-FreeBSD-NEXT: ja .LBB2_2
203
204; X64-FreeBSD: movabsq $40008, %r10
205; X64-FreeBSD-NEXT: movabsq $0, %r11
206; X64-FreeBSD-NEXT: callq __morestack
207; X64-FreeBSD-NEXT: ret
208
Sanjoy Das199ce332011-12-03 09:32:07 +0000209}
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000210
211define fastcc void @test_fastcc() {
212 %mem = alloca i32, i32 10
213 call void @dummy_use (i32* %mem, i32 10)
214 ret void
215
Rafael Espindola2028b792012-01-11 19:00:37 +0000216; X32-Linux: test_fastcc:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000217
Rafael Espindola2028b792012-01-11 19:00:37 +0000218; X32-Linux: cmpl %gs:48, %esp
219; X32-Linux-NEXT: ja .LBB3_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000220
Rafael Espindola2028b792012-01-11 19:00:37 +0000221; X32-Linux: pushl $0
222; X32-Linux-NEXT: pushl $60
223; X32-Linux-NEXT: calll __morestack
224; X32-Linux-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000225
Rafael Espindola2028b792012-01-11 19:00:37 +0000226; X64-Linux: test_fastcc:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000227
Rafael Espindola2028b792012-01-11 19:00:37 +0000228; X64-Linux: cmpq %fs:112, %rsp
229; X64-Linux-NEXT: ja .LBB3_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000230
Rafael Espindola2028b792012-01-11 19:00:37 +0000231; X64-Linux: movabsq $40, %r10
232; X64-Linux-NEXT: movabsq $0, %r11
233; X64-Linux-NEXT: callq __morestack
234; X64-Linux-NEXT: ret
235
236; X32-Darwin: test_fastcc:
237
238; X32-Darwin: movl $432, %eax
239; X32-Darwin-NEXT: cmpl %gs:(%eax), %esp
240; X32-Darwin-NEXT: ja LBB3_2
241
242; X32-Darwin: pushl $0
243; X32-Darwin-NEXT: pushl $60
244; X32-Darwin-NEXT: calll ___morestack
245; X32-Darwin-NEXT: ret
246
247; X64-Darwin: test_fastcc:
248
249; X64-Darwin: cmpq %gs:816, %rsp
250; X64-Darwin-NEXT: ja LBB3_2
251
252; X64-Darwin: movabsq $40, %r10
253; X64-Darwin-NEXT: movabsq $0, %r11
254; X64-Darwin-NEXT: callq ___morestack
255; X64-Darwin-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000256
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000257; X32-MinGW: test_fastcc:
258
259; X32-MinGW: cmpl %fs:20, %esp
260; X32-MinGW-NEXT: ja LBB3_2
261
262; X32-MinGW: pushl $0
263; X32-MinGW-NEXT: pushl $48
264; X32-MinGW-NEXT: calll ___morestack
265; X32-MinGW-NEXT: ret
266
Rafael Espindola85b9d432012-01-12 20:24:30 +0000267; X64-FreeBSD: test_fastcc:
268
269; X64-FreeBSD: cmpq %fs:24, %rsp
270; X64-FreeBSD-NEXT: ja .LBB3_2
271
272; X64-FreeBSD: movabsq $40, %r10
273; X64-FreeBSD-NEXT: movabsq $0, %r11
274; X64-FreeBSD-NEXT: callq __morestack
275; X64-FreeBSD-NEXT: ret
276
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000277}
278
279define fastcc void @test_fastcc_large() {
280 %mem = alloca i32, i32 10000
281 call void @dummy_use (i32* %mem, i32 0)
282 ret void
283
Rafael Espindola2028b792012-01-11 19:00:37 +0000284; X32-Linux: test_fastcc_large:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000285
Rafael Espindola2028b792012-01-11 19:00:37 +0000286; X32-Linux: leal -40012(%esp), %eax
287; X32-Linux-NEXT: cmpl %gs:48, %eax
288; X32-Linux-NEXT: ja .LBB4_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000289
Rafael Espindola2028b792012-01-11 19:00:37 +0000290; X32-Linux: pushl $0
291; X32-Linux-NEXT: pushl $40012
292; X32-Linux-NEXT: calll __morestack
293; X32-Linux-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000294
Rafael Espindola2028b792012-01-11 19:00:37 +0000295; X64-Linux: test_fastcc_large:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000296
Rafael Espindola2028b792012-01-11 19:00:37 +0000297; X64-Linux: leaq -40008(%rsp), %r11
298; X64-Linux-NEXT: cmpq %fs:112, %r11
299; X64-Linux-NEXT: ja .LBB4_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000300
Rafael Espindola2028b792012-01-11 19:00:37 +0000301; X64-Linux: movabsq $40008, %r10
302; X64-Linux-NEXT: movabsq $0, %r11
303; X64-Linux-NEXT: callq __morestack
304; X64-Linux-NEXT: ret
305
306; X32-Darwin: test_fastcc_large:
307
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
312
313; X32-Darwin: pushl $0
314; X32-Darwin-NEXT: pushl $40012
315; X32-Darwin-NEXT: calll ___morestack
316; X32-Darwin-NEXT: ret
317
318; X64-Darwin: test_fastcc_large:
319
320; X64-Darwin: leaq -40008(%rsp), %r11
321; X64-Darwin-NEXT: cmpq %gs:816, %r11
322; X64-Darwin-NEXT: ja LBB4_2
323
324; X64-Darwin: movabsq $40008, %r10
325; X64-Darwin-NEXT: movabsq $0, %r11
326; X64-Darwin-NEXT: callq ___morestack
327; X64-Darwin-NEXT: ret
328
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000329; X32-MinGW: test_fastcc_large:
330
331; X32-MinGW: leal -40008(%esp), %eax
332; X32-MinGW-NEXT: cmpl %fs:20, %eax
333; X32-MinGW-NEXT: ja LBB4_2
334
335; X32-MinGW: pushl $0
336; X32-MinGW-NEXT: pushl $40008
337; X32-MinGW-NEXT: calll ___morestack
338; X32-MinGW-NEXT: ret
339
Rafael Espindola85b9d432012-01-12 20:24:30 +0000340; X64-FreeBSD: test_fastcc_large:
341
342; X64-FreeBSD: leaq -40008(%rsp), %r11
343; X64-FreeBSD-NEXT: cmpq %fs:24, %r11
344; X64-FreeBSD-NEXT: ja .LBB4_2
345
346; X64-FreeBSD: movabsq $40008, %r10
347; X64-FreeBSD-NEXT: movabsq $0, %r11
348; X64-FreeBSD-NEXT: callq __morestack
349; X64-FreeBSD-NEXT: ret
350
Rafael Espindola2028b792012-01-11 19:00:37 +0000351}
352
353define 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)
356 ret void
357
358; This is testing that the Mac implementation preserves ecx
359
360; X32-Darwin: test_fastcc_large_with_ecx_arg:
361
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
368
369; X32-Darwin: pushl $0
370; X32-Darwin-NEXT: pushl $40012
371; X32-Darwin-NEXT: calll ___morestack
372; X32-Darwin-NEXT: ret
373
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000374}