blob: 4c4c542785e91c16b23f725ae11ca108f51736c8 [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 Espindolab0bf8932011-08-30 19:51:29 +00006
Rafael Espindola014f7a32012-01-11 18:14:03 +00007; 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
Rafael Espindola2028b792012-01-11 19:00:37 +000010; RUN: llc < %s -mtriple=i686-darwin -segmented-stacks -filetype=obj
11; RUN: llc < %s -mtriple=x86_64-darwin -segmented-stacks -filetype=obj
Rafael Espindolae4d18de2012-01-12 20:22:08 +000012; RUN: llc < %s -mtriple=i686-mingw32 -segmented-stacks -filetype=obj
Rafael Espindola014f7a32012-01-11 18:14:03 +000013
Rafael Espindolab0bf8932011-08-30 19:51:29 +000014; Just to prevent the alloca from being optimized away
15declare void @dummy_use(i32*, i32)
16
Rafael Espindola7692ce92012-01-11 18:51:03 +000017define void @test_basic() {
18 %mem = alloca i32, i32 10
19 call void @dummy_use (i32* %mem, i32 10)
20 ret void
Rafael Espindolab0bf8932011-08-30 19:51:29 +000021
Rafael Espindola2028b792012-01-11 19:00:37 +000022; X32-Linux: test_basic:
Rafael Espindolab0bf8932011-08-30 19:51:29 +000023
Rafael Espindola2028b792012-01-11 19:00:37 +000024; X32-Linux: cmpl %gs:48, %esp
25; X32-Linux-NEXT: ja .LBB0_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000026
Rafael Espindola2028b792012-01-11 19:00:37 +000027; X32-Linux: pushl $0
28; X32-Linux-NEXT: pushl $60
29; X32-Linux-NEXT: calll __morestack
30; X32-Linux-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +000031
Rafael Espindola2028b792012-01-11 19:00:37 +000032; X64-Linux: test_basic:
Rafael Espindolab0bf8932011-08-30 19:51:29 +000033
Rafael Espindola2028b792012-01-11 19:00:37 +000034; X64-Linux: cmpq %fs:112, %rsp
35; X64-Linux-NEXT: ja .LBB0_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000036
Rafael Espindola2028b792012-01-11 19:00:37 +000037; X64-Linux: movabsq $40, %r10
38; X64-Linux-NEXT: movabsq $0, %r11
39; X64-Linux-NEXT: callq __morestack
40; X64-Linux-NEXT: ret
41
42; X32-Darwin: test_basic:
43
44; X32-Darwin: movl $432, %ecx
45; X32-Darwin-NEXT: cmpl %gs:(%ecx), %esp
46; X32-Darwin-NEXT: ja LBB0_2
47
48; X32-Darwin: pushl $0
49; X32-Darwin-NEXT: pushl $60
50; X32-Darwin-NEXT: calll ___morestack
51; X32-Darwin-NEXT: ret
52
53; X64-Darwin: test_basic:
54
55; X64-Darwin: cmpq %gs:816, %rsp
56; X64-Darwin-NEXT: ja LBB0_2
57
58; X64-Darwin: movabsq $40, %r10
59; X64-Darwin-NEXT: movabsq $0, %r11
60; X64-Darwin-NEXT: callq ___morestack
61; X64-Darwin-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +000062
Rafael Espindolae4d18de2012-01-12 20:22:08 +000063; X32-MinGW: test_basic:
64
65; X32-MinGW: cmpl %fs:20, %esp
66; X32-MinGW-NEXT: ja LBB0_2
67
68; X32-MinGW: pushl $0
69; X32-MinGW-NEXT: pushl $48
70; X32-MinGW-NEXT: calll ___morestack
71; X32-MinGW-NEXT: ret
72
Rafael Espindolab0bf8932011-08-30 19:51:29 +000073}
74
75define i32 @test_nested(i32 * nest %closure, i32 %other) {
76 %addend = load i32 * %closure
77 %result = add i32 %other, %addend
78 ret i32 %result
79
Rafael Espindola2028b792012-01-11 19:00:37 +000080; X32-Linux: cmpl %gs:48, %esp
81; X32-Linux-NEXT: ja .LBB1_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000082
Rafael Espindola2028b792012-01-11 19:00:37 +000083; X32-Linux: pushl $4
84; X32-Linux-NEXT: pushl $0
85; X32-Linux-NEXT: calll __morestack
86; X32-Linux-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +000087
Rafael Espindola2028b792012-01-11 19:00:37 +000088; X64-Linux: cmpq %fs:112, %rsp
89; X64-Linux-NEXT: ja .LBB1_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000090
Rafael Espindola2028b792012-01-11 19:00:37 +000091; 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
95; X64-Linux-NEXT: ret
96; X64-Linux-NEXT: movq %rax, %r10
97
98; X32-Darwin: movl $432, %edx
99; X32-Darwin-NEXT: cmpl %gs:(%edx), %esp
100; X32-Darwin-NEXT: ja LBB1_2
101
102; X32-Darwin: pushl $4
103; X32-Darwin-NEXT: pushl $0
104; X32-Darwin-NEXT: calll ___morestack
105; X32-Darwin-NEXT: ret
106
107; X64-Darwin: cmpq %gs:816, %rsp
108; X64-Darwin-NEXT: ja LBB1_2
109
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
Rafael Espindolab0bf8932011-08-30 19:51:29 +0000116
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000117; X32-MinGW: cmpl %fs:20, %esp
118; X32-MinGW-NEXT: ja LBB1_2
119
120; X32-MinGW: pushl $4
121; X32-MinGW-NEXT: pushl $0
122; X32-MinGW-NEXT: calll ___morestack
123; X32-MinGW-NEXT: ret
124
Rafael Espindolab0bf8932011-08-30 19:51:29 +0000125}
Sanjoy Das199ce332011-12-03 09:32:07 +0000126
127define void @test_large() {
128 %mem = alloca i32, i32 10000
129 call void @dummy_use (i32* %mem, i32 0)
130 ret void
131
Rafael Espindola2028b792012-01-11 19:00:37 +0000132; X32-Linux: leal -40012(%esp), %ecx
133; X32-Linux-NEXT: cmpl %gs:48, %ecx
134; X32-Linux-NEXT: ja .LBB2_2
Sanjoy Das199ce332011-12-03 09:32:07 +0000135
Rafael Espindola2028b792012-01-11 19:00:37 +0000136; X32-Linux: pushl $0
137; X32-Linux-NEXT: pushl $40012
138; X32-Linux-NEXT: calll __morestack
139; X32-Linux-NEXT: ret
Sanjoy Das199ce332011-12-03 09:32:07 +0000140
Rafael Espindola2028b792012-01-11 19:00:37 +0000141; X64-Linux: leaq -40008(%rsp), %r11
142; X64-Linux-NEXT: cmpq %fs:112, %r11
143; X64-Linux-NEXT: ja .LBB2_2
Sanjoy Das199ce332011-12-03 09:32:07 +0000144
Rafael Espindola2028b792012-01-11 19:00:37 +0000145; X64-Linux: movabsq $40008, %r10
146; X64-Linux-NEXT: movabsq $0, %r11
147; X64-Linux-NEXT: callq __morestack
148; X64-Linux-NEXT: ret
149
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
154
155; X32-Darwin: pushl $0
156; X32-Darwin-NEXT: pushl $40012
157; X32-Darwin-NEXT: calll ___morestack
158; X32-Darwin-NEXT: ret
159
160; X64-Darwin: leaq -40008(%rsp), %r11
161; X64-Darwin-NEXT: cmpq %gs:816, %r11
162; X64-Darwin-NEXT: ja LBB2_2
163
164; X64-Darwin: movabsq $40008, %r10
165; X64-Darwin-NEXT: movabsq $0, %r11
166; X64-Darwin-NEXT: callq ___morestack
167; X64-Darwin-NEXT: ret
Sanjoy Das199ce332011-12-03 09:32:07 +0000168
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000169; X32-MinGW: leal -40008(%esp), %ecx
170; X32-MinGW-NEXT: cmpl %fs:20, %ecx
171; X32-MinGW-NEXT: ja LBB2_2
172
173; X32-MinGW: pushl $0
174; X32-MinGW-NEXT: pushl $40008
175; X32-MinGW-NEXT: calll ___morestack
176; X32-MinGW-NEXT: ret
177
Sanjoy Das199ce332011-12-03 09:32:07 +0000178}
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000179
180define fastcc void @test_fastcc() {
181 %mem = alloca i32, i32 10
182 call void @dummy_use (i32* %mem, i32 10)
183 ret void
184
Rafael Espindola2028b792012-01-11 19:00:37 +0000185; X32-Linux: test_fastcc:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000186
Rafael Espindola2028b792012-01-11 19:00:37 +0000187; X32-Linux: cmpl %gs:48, %esp
188; X32-Linux-NEXT: ja .LBB3_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000189
Rafael Espindola2028b792012-01-11 19:00:37 +0000190; X32-Linux: pushl $0
191; X32-Linux-NEXT: pushl $60
192; X32-Linux-NEXT: calll __morestack
193; X32-Linux-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000194
Rafael Espindola2028b792012-01-11 19:00:37 +0000195; X64-Linux: test_fastcc:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000196
Rafael Espindola2028b792012-01-11 19:00:37 +0000197; X64-Linux: cmpq %fs:112, %rsp
198; X64-Linux-NEXT: ja .LBB3_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000199
Rafael Espindola2028b792012-01-11 19:00:37 +0000200; X64-Linux: movabsq $40, %r10
201; X64-Linux-NEXT: movabsq $0, %r11
202; X64-Linux-NEXT: callq __morestack
203; X64-Linux-NEXT: ret
204
205; X32-Darwin: test_fastcc:
206
207; X32-Darwin: movl $432, %eax
208; X32-Darwin-NEXT: cmpl %gs:(%eax), %esp
209; X32-Darwin-NEXT: ja LBB3_2
210
211; X32-Darwin: pushl $0
212; X32-Darwin-NEXT: pushl $60
213; X32-Darwin-NEXT: calll ___morestack
214; X32-Darwin-NEXT: ret
215
216; X64-Darwin: test_fastcc:
217
218; X64-Darwin: cmpq %gs:816, %rsp
219; X64-Darwin-NEXT: ja LBB3_2
220
221; X64-Darwin: movabsq $40, %r10
222; X64-Darwin-NEXT: movabsq $0, %r11
223; X64-Darwin-NEXT: callq ___morestack
224; X64-Darwin-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000225
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000226; X32-MinGW: test_fastcc:
227
228; X32-MinGW: cmpl %fs:20, %esp
229; X32-MinGW-NEXT: ja LBB3_2
230
231; X32-MinGW: pushl $0
232; X32-MinGW-NEXT: pushl $48
233; X32-MinGW-NEXT: calll ___morestack
234; X32-MinGW-NEXT: ret
235
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000236}
237
238define fastcc void @test_fastcc_large() {
239 %mem = alloca i32, i32 10000
240 call void @dummy_use (i32* %mem, i32 0)
241 ret void
242
Rafael Espindola2028b792012-01-11 19:00:37 +0000243; X32-Linux: test_fastcc_large:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000244
Rafael Espindola2028b792012-01-11 19:00:37 +0000245; X32-Linux: leal -40012(%esp), %eax
246; X32-Linux-NEXT: cmpl %gs:48, %eax
247; X32-Linux-NEXT: ja .LBB4_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000248
Rafael Espindola2028b792012-01-11 19:00:37 +0000249; X32-Linux: pushl $0
250; X32-Linux-NEXT: pushl $40012
251; X32-Linux-NEXT: calll __morestack
252; X32-Linux-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000253
Rafael Espindola2028b792012-01-11 19:00:37 +0000254; X64-Linux: test_fastcc_large:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000255
Rafael Espindola2028b792012-01-11 19:00:37 +0000256; X64-Linux: leaq -40008(%rsp), %r11
257; X64-Linux-NEXT: cmpq %fs:112, %r11
258; X64-Linux-NEXT: ja .LBB4_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000259
Rafael Espindola2028b792012-01-11 19:00:37 +0000260; X64-Linux: movabsq $40008, %r10
261; X64-Linux-NEXT: movabsq $0, %r11
262; X64-Linux-NEXT: callq __morestack
263; X64-Linux-NEXT: ret
264
265; X32-Darwin: test_fastcc_large:
266
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
271
272; X32-Darwin: pushl $0
273; X32-Darwin-NEXT: pushl $40012
274; X32-Darwin-NEXT: calll ___morestack
275; X32-Darwin-NEXT: ret
276
277; X64-Darwin: test_fastcc_large:
278
279; X64-Darwin: leaq -40008(%rsp), %r11
280; X64-Darwin-NEXT: cmpq %gs:816, %r11
281; X64-Darwin-NEXT: ja LBB4_2
282
283; X64-Darwin: movabsq $40008, %r10
284; X64-Darwin-NEXT: movabsq $0, %r11
285; X64-Darwin-NEXT: callq ___morestack
286; X64-Darwin-NEXT: ret
287
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000288; X32-MinGW: test_fastcc_large:
289
290; X32-MinGW: leal -40008(%esp), %eax
291; X32-MinGW-NEXT: cmpl %fs:20, %eax
292; X32-MinGW-NEXT: ja LBB4_2
293
294; X32-MinGW: pushl $0
295; X32-MinGW-NEXT: pushl $40008
296; X32-MinGW-NEXT: calll ___morestack
297; X32-MinGW-NEXT: ret
298
Rafael Espindola2028b792012-01-11 19:00:37 +0000299}
300
301define 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)
304 ret void
305
306; This is testing that the Mac implementation preserves ecx
307
308; X32-Darwin: test_fastcc_large_with_ecx_arg:
309
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
316
317; X32-Darwin: pushl $0
318; X32-Darwin-NEXT: pushl $40012
319; X32-Darwin-NEXT: calll ___morestack
320; X32-Darwin-NEXT: ret
321
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000322}