blob: 5407b87418f3be215f0e6eb6492fdc0f1fa866bc [file] [log] [blame]
Andrew Trick922d3142012-02-01 23:20:51 +00001; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-Linux
2; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux
3; RUN: llc < %s -mcpu=generic -mtriple=i686-darwin -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-Darwin
4; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-Darwin
5; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-MinGW
6; RUN: llc < %s -mcpu=generic -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
Andrew Trick922d3142012-02-01 23:20:51 +00009; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -segmented-stacks -filetype=obj
10; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -segmented-stacks -filetype=obj
11; RUN: llc < %s -mcpu=generic -mtriple=i686-darwin -segmented-stacks -filetype=obj
12; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -segmented-stacks -filetype=obj
13; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -segmented-stacks -filetype=obj
14; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -segmented-stacks -filetype=obj
Rafael Espindola014f7a32012-01-11 18:14:03 +000015
Andrew Trick922d3142012-02-01 23:20:51 +000016; RUN: not llc < %s -mcpu=generic -mtriple=x86_64-solaris -segmented-stacks 2> %t.log
Rafael Espindola0577c592012-01-12 20:26:13 +000017; RUN: FileCheck %s -input-file=%t.log -check-prefix=X64-Solaris
Andrew Trick922d3142012-02-01 23:20:51 +000018; RUN: not llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -segmented-stacks 2> %t.log
Rafael Espindola0577c592012-01-12 20:26:13 +000019; RUN: FileCheck %s -input-file=%t.log -check-prefix=X64-MinGW
Andrew Trick922d3142012-02-01 23:20:51 +000020; RUN: not llc < %s -mcpu=generic -mtriple=i686-freebsd -segmented-stacks 2> %t.log
Rafael Espindola0577c592012-01-12 20:26:13 +000021; RUN: FileCheck %s -input-file=%t.log -check-prefix=X32-FreeBSD
22
23; X64-Solaris: Segmented stacks not supported on this platform
24; X64-MinGW: Segmented stacks not supported on this platform
25; X32-FreeBSD: Segmented stacks not supported on FreeBSD i386
26
Rafael Espindolab0bf8932011-08-30 19:51:29 +000027; Just to prevent the alloca from being optimized away
28declare void @dummy_use(i32*, i32)
29
Rafael Espindola7692ce92012-01-11 18:51:03 +000030define void @test_basic() {
31 %mem = alloca i32, i32 10
32 call void @dummy_use (i32* %mem, i32 10)
33 ret void
Rafael Espindolab0bf8932011-08-30 19:51:29 +000034
Rafael Espindola2028b792012-01-11 19:00:37 +000035; X32-Linux: test_basic:
Rafael Espindolab0bf8932011-08-30 19:51:29 +000036
Rafael Espindola2028b792012-01-11 19:00:37 +000037; X32-Linux: cmpl %gs:48, %esp
38; X32-Linux-NEXT: ja .LBB0_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000039
Rafael Espindola2028b792012-01-11 19:00:37 +000040; X32-Linux: pushl $0
41; X32-Linux-NEXT: pushl $60
42; X32-Linux-NEXT: calll __morestack
43; X32-Linux-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +000044
Rafael Espindola2028b792012-01-11 19:00:37 +000045; X64-Linux: test_basic:
Rafael Espindolab0bf8932011-08-30 19:51:29 +000046
Rafael Espindola2028b792012-01-11 19:00:37 +000047; X64-Linux: cmpq %fs:112, %rsp
48; X64-Linux-NEXT: ja .LBB0_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000049
Rafael Espindola2028b792012-01-11 19:00:37 +000050; X64-Linux: movabsq $40, %r10
51; X64-Linux-NEXT: movabsq $0, %r11
52; X64-Linux-NEXT: callq __morestack
53; X64-Linux-NEXT: ret
54
55; X32-Darwin: test_basic:
56
57; X32-Darwin: movl $432, %ecx
58; X32-Darwin-NEXT: cmpl %gs:(%ecx), %esp
59; X32-Darwin-NEXT: ja LBB0_2
60
61; X32-Darwin: pushl $0
62; X32-Darwin-NEXT: pushl $60
63; X32-Darwin-NEXT: calll ___morestack
64; X32-Darwin-NEXT: ret
65
66; X64-Darwin: test_basic:
67
68; X64-Darwin: cmpq %gs:816, %rsp
69; X64-Darwin-NEXT: ja LBB0_2
70
71; X64-Darwin: movabsq $40, %r10
72; X64-Darwin-NEXT: movabsq $0, %r11
73; X64-Darwin-NEXT: callq ___morestack
74; X64-Darwin-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +000075
Rafael Espindolae4d18de2012-01-12 20:22:08 +000076; X32-MinGW: test_basic:
77
78; X32-MinGW: cmpl %fs:20, %esp
79; X32-MinGW-NEXT: ja LBB0_2
80
81; X32-MinGW: pushl $0
82; X32-MinGW-NEXT: pushl $48
83; X32-MinGW-NEXT: calll ___morestack
84; X32-MinGW-NEXT: ret
85
Rafael Espindola85b9d432012-01-12 20:24:30 +000086; X64-FreeBSD: test_basic:
87
88; X64-FreeBSD: cmpq %fs:24, %rsp
89; X64-FreeBSD-NEXT: ja .LBB0_2
90
91; X64-FreeBSD: movabsq $40, %r10
92; X64-FreeBSD-NEXT: movabsq $0, %r11
93; X64-FreeBSD-NEXT: callq __morestack
94; X64-FreeBSD-NEXT: ret
95
Rafael Espindolab0bf8932011-08-30 19:51:29 +000096}
97
98define i32 @test_nested(i32 * nest %closure, i32 %other) {
99 %addend = load i32 * %closure
100 %result = add i32 %other, %addend
101 ret i32 %result
102
Rafael Espindola2028b792012-01-11 19:00:37 +0000103; X32-Linux: cmpl %gs:48, %esp
104; X32-Linux-NEXT: ja .LBB1_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +0000105
Rafael Espindola2028b792012-01-11 19:00:37 +0000106; X32-Linux: pushl $4
107; X32-Linux-NEXT: pushl $0
108; X32-Linux-NEXT: calll __morestack
109; X32-Linux-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +0000110
Rafael Espindola2028b792012-01-11 19:00:37 +0000111; X64-Linux: cmpq %fs:112, %rsp
112; X64-Linux-NEXT: ja .LBB1_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +0000113
Rafael Espindola2028b792012-01-11 19:00:37 +0000114; X64-Linux: movq %r10, %rax
115; X64-Linux-NEXT: movabsq $0, %r10
116; X64-Linux-NEXT: movabsq $0, %r11
117; X64-Linux-NEXT: callq __morestack
118; X64-Linux-NEXT: ret
119; X64-Linux-NEXT: movq %rax, %r10
120
121; X32-Darwin: movl $432, %edx
122; X32-Darwin-NEXT: cmpl %gs:(%edx), %esp
123; X32-Darwin-NEXT: ja LBB1_2
124
125; X32-Darwin: pushl $4
126; X32-Darwin-NEXT: pushl $0
127; X32-Darwin-NEXT: calll ___morestack
128; X32-Darwin-NEXT: ret
129
130; X64-Darwin: cmpq %gs:816, %rsp
131; X64-Darwin-NEXT: ja LBB1_2
132
133; X64-Darwin: movq %r10, %rax
134; X64-Darwin-NEXT: movabsq $0, %r10
135; X64-Darwin-NEXT: movabsq $0, %r11
136; X64-Darwin-NEXT: callq ___morestack
137; X64-Darwin-NEXT: ret
138; X64-Darwin-NEXT: movq %rax, %r10
Rafael Espindolab0bf8932011-08-30 19:51:29 +0000139
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000140; X32-MinGW: cmpl %fs:20, %esp
141; X32-MinGW-NEXT: ja LBB1_2
142
143; X32-MinGW: pushl $4
144; X32-MinGW-NEXT: pushl $0
145; X32-MinGW-NEXT: calll ___morestack
146; X32-MinGW-NEXT: ret
147
Rafael Espindola85b9d432012-01-12 20:24:30 +0000148; X64-FreeBSD: cmpq %fs:24, %rsp
149; X64-FreeBSD-NEXT: ja .LBB1_2
150
151; X64-FreeBSD: movq %r10, %rax
152; X64-FreeBSD-NEXT: movabsq $0, %r10
153; X64-FreeBSD-NEXT: movabsq $0, %r11
154; X64-FreeBSD-NEXT: callq __morestack
155; X64-FreeBSD-NEXT: ret
156; X64-FreeBSD-NEXT: movq %rax, %r10
157
Rafael Espindolab0bf8932011-08-30 19:51:29 +0000158}
Sanjoy Das199ce332011-12-03 09:32:07 +0000159
160define void @test_large() {
161 %mem = alloca i32, i32 10000
162 call void @dummy_use (i32* %mem, i32 0)
163 ret void
164
Rafael Espindola2028b792012-01-11 19:00:37 +0000165; X32-Linux: leal -40012(%esp), %ecx
166; X32-Linux-NEXT: cmpl %gs:48, %ecx
167; X32-Linux-NEXT: ja .LBB2_2
Sanjoy Das199ce332011-12-03 09:32:07 +0000168
Rafael Espindola2028b792012-01-11 19:00:37 +0000169; X32-Linux: pushl $0
170; X32-Linux-NEXT: pushl $40012
171; X32-Linux-NEXT: calll __morestack
172; X32-Linux-NEXT: ret
Sanjoy Das199ce332011-12-03 09:32:07 +0000173
Rafael Espindola2028b792012-01-11 19:00:37 +0000174; X64-Linux: leaq -40008(%rsp), %r11
175; X64-Linux-NEXT: cmpq %fs:112, %r11
176; X64-Linux-NEXT: ja .LBB2_2
Sanjoy Das199ce332011-12-03 09:32:07 +0000177
Rafael Espindola2028b792012-01-11 19:00:37 +0000178; X64-Linux: movabsq $40008, %r10
179; X64-Linux-NEXT: movabsq $0, %r11
180; X64-Linux-NEXT: callq __morestack
181; X64-Linux-NEXT: ret
182
183; X32-Darwin: leal -40012(%esp), %ecx
184; X32-Darwin-NEXT: movl $432, %eax
185; X32-Darwin-NEXT: cmpl %gs:(%eax), %ecx
186; X32-Darwin-NEXT: ja LBB2_2
187
188; X32-Darwin: pushl $0
189; X32-Darwin-NEXT: pushl $40012
190; X32-Darwin-NEXT: calll ___morestack
191; X32-Darwin-NEXT: ret
192
193; X64-Darwin: leaq -40008(%rsp), %r11
194; X64-Darwin-NEXT: cmpq %gs:816, %r11
195; X64-Darwin-NEXT: ja LBB2_2
196
197; X64-Darwin: movabsq $40008, %r10
198; X64-Darwin-NEXT: movabsq $0, %r11
199; X64-Darwin-NEXT: callq ___morestack
200; X64-Darwin-NEXT: ret
Sanjoy Das199ce332011-12-03 09:32:07 +0000201
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000202; X32-MinGW: leal -40008(%esp), %ecx
203; X32-MinGW-NEXT: cmpl %fs:20, %ecx
204; X32-MinGW-NEXT: ja LBB2_2
205
206; X32-MinGW: pushl $0
207; X32-MinGW-NEXT: pushl $40008
208; X32-MinGW-NEXT: calll ___morestack
209; X32-MinGW-NEXT: ret
210
Rafael Espindola85b9d432012-01-12 20:24:30 +0000211; X64-FreeBSD: leaq -40008(%rsp), %r11
212; X64-FreeBSD-NEXT: cmpq %fs:24, %r11
213; X64-FreeBSD-NEXT: ja .LBB2_2
214
215; X64-FreeBSD: movabsq $40008, %r10
216; X64-FreeBSD-NEXT: movabsq $0, %r11
217; X64-FreeBSD-NEXT: callq __morestack
218; X64-FreeBSD-NEXT: ret
219
Sanjoy Das199ce332011-12-03 09:32:07 +0000220}
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000221
222define fastcc void @test_fastcc() {
223 %mem = alloca i32, i32 10
224 call void @dummy_use (i32* %mem, i32 10)
225 ret void
226
Rafael Espindola2028b792012-01-11 19:00:37 +0000227; X32-Linux: test_fastcc:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000228
Rafael Espindola2028b792012-01-11 19:00:37 +0000229; X32-Linux: cmpl %gs:48, %esp
230; X32-Linux-NEXT: ja .LBB3_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000231
Rafael Espindola2028b792012-01-11 19:00:37 +0000232; X32-Linux: pushl $0
233; X32-Linux-NEXT: pushl $60
234; X32-Linux-NEXT: calll __morestack
235; X32-Linux-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000236
Rafael Espindola2028b792012-01-11 19:00:37 +0000237; X64-Linux: test_fastcc:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000238
Rafael Espindola2028b792012-01-11 19:00:37 +0000239; X64-Linux: cmpq %fs:112, %rsp
240; X64-Linux-NEXT: ja .LBB3_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000241
Rafael Espindola2028b792012-01-11 19:00:37 +0000242; X64-Linux: movabsq $40, %r10
243; X64-Linux-NEXT: movabsq $0, %r11
244; X64-Linux-NEXT: callq __morestack
245; X64-Linux-NEXT: ret
246
247; X32-Darwin: test_fastcc:
248
249; X32-Darwin: movl $432, %eax
250; X32-Darwin-NEXT: cmpl %gs:(%eax), %esp
251; X32-Darwin-NEXT: ja LBB3_2
252
253; X32-Darwin: pushl $0
254; X32-Darwin-NEXT: pushl $60
255; X32-Darwin-NEXT: calll ___morestack
256; X32-Darwin-NEXT: ret
257
258; X64-Darwin: test_fastcc:
259
260; X64-Darwin: cmpq %gs:816, %rsp
261; X64-Darwin-NEXT: ja LBB3_2
262
263; X64-Darwin: movabsq $40, %r10
264; X64-Darwin-NEXT: movabsq $0, %r11
265; X64-Darwin-NEXT: callq ___morestack
266; X64-Darwin-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000267
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000268; X32-MinGW: test_fastcc:
269
270; X32-MinGW: cmpl %fs:20, %esp
271; X32-MinGW-NEXT: ja LBB3_2
272
273; X32-MinGW: pushl $0
274; X32-MinGW-NEXT: pushl $48
275; X32-MinGW-NEXT: calll ___morestack
276; X32-MinGW-NEXT: ret
277
Rafael Espindola85b9d432012-01-12 20:24:30 +0000278; X64-FreeBSD: test_fastcc:
279
280; X64-FreeBSD: cmpq %fs:24, %rsp
281; X64-FreeBSD-NEXT: ja .LBB3_2
282
283; X64-FreeBSD: movabsq $40, %r10
284; X64-FreeBSD-NEXT: movabsq $0, %r11
285; X64-FreeBSD-NEXT: callq __morestack
286; X64-FreeBSD-NEXT: ret
287
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000288}
289
290define fastcc void @test_fastcc_large() {
291 %mem = alloca i32, i32 10000
292 call void @dummy_use (i32* %mem, i32 0)
293 ret void
294
Rafael Espindola2028b792012-01-11 19:00:37 +0000295; X32-Linux: test_fastcc_large:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000296
Rafael Espindola2028b792012-01-11 19:00:37 +0000297; X32-Linux: leal -40012(%esp), %eax
298; X32-Linux-NEXT: cmpl %gs:48, %eax
299; X32-Linux-NEXT: ja .LBB4_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000300
Rafael Espindola2028b792012-01-11 19:00:37 +0000301; X32-Linux: pushl $0
302; X32-Linux-NEXT: pushl $40012
303; X32-Linux-NEXT: calll __morestack
304; X32-Linux-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000305
Rafael Espindola2028b792012-01-11 19:00:37 +0000306; X64-Linux: test_fastcc_large:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000307
Rafael Espindola2028b792012-01-11 19:00:37 +0000308; X64-Linux: leaq -40008(%rsp), %r11
309; X64-Linux-NEXT: cmpq %fs:112, %r11
310; X64-Linux-NEXT: ja .LBB4_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000311
Rafael Espindola2028b792012-01-11 19:00:37 +0000312; X64-Linux: movabsq $40008, %r10
313; X64-Linux-NEXT: movabsq $0, %r11
314; X64-Linux-NEXT: callq __morestack
315; X64-Linux-NEXT: ret
316
317; X32-Darwin: test_fastcc_large:
318
319; X32-Darwin: leal -40012(%esp), %eax
320; X32-Darwin-NEXT: movl $432, %ecx
321; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
322; X32-Darwin-NEXT: ja LBB4_2
323
324; X32-Darwin: pushl $0
325; X32-Darwin-NEXT: pushl $40012
326; X32-Darwin-NEXT: calll ___morestack
327; X32-Darwin-NEXT: ret
328
329; X64-Darwin: test_fastcc_large:
330
331; X64-Darwin: leaq -40008(%rsp), %r11
332; X64-Darwin-NEXT: cmpq %gs:816, %r11
333; X64-Darwin-NEXT: ja LBB4_2
334
335; X64-Darwin: movabsq $40008, %r10
336; X64-Darwin-NEXT: movabsq $0, %r11
337; X64-Darwin-NEXT: callq ___morestack
338; X64-Darwin-NEXT: ret
339
Rafael Espindolae4d18de2012-01-12 20:22:08 +0000340; X32-MinGW: test_fastcc_large:
341
342; X32-MinGW: leal -40008(%esp), %eax
343; X32-MinGW-NEXT: cmpl %fs:20, %eax
344; X32-MinGW-NEXT: ja LBB4_2
345
346; X32-MinGW: pushl $0
347; X32-MinGW-NEXT: pushl $40008
348; X32-MinGW-NEXT: calll ___morestack
349; X32-MinGW-NEXT: ret
350
Rafael Espindola85b9d432012-01-12 20:24:30 +0000351; X64-FreeBSD: test_fastcc_large:
352
353; X64-FreeBSD: leaq -40008(%rsp), %r11
354; X64-FreeBSD-NEXT: cmpq %fs:24, %r11
355; X64-FreeBSD-NEXT: ja .LBB4_2
356
357; X64-FreeBSD: movabsq $40008, %r10
358; X64-FreeBSD-NEXT: movabsq $0, %r11
359; X64-FreeBSD-NEXT: callq __morestack
360; X64-FreeBSD-NEXT: ret
361
Rafael Espindola2028b792012-01-11 19:00:37 +0000362}
363
364define fastcc void @test_fastcc_large_with_ecx_arg(i32 %a) {
365 %mem = alloca i32, i32 10000
366 call void @dummy_use (i32* %mem, i32 %a)
367 ret void
368
369; This is testing that the Mac implementation preserves ecx
370
371; X32-Darwin: test_fastcc_large_with_ecx_arg:
372
373; X32-Darwin: leal -40012(%esp), %eax
374; X32-Darwin-NEXT: pushl %ecx
375; X32-Darwin-NEXT: movl $432, %ecx
376; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
377; X32-Darwin-NEXT: popl %ecx
378; X32-Darwin-NEXT: ja LBB5_2
379
380; X32-Darwin: pushl $0
381; X32-Darwin-NEXT: pushl $40012
382; X32-Darwin-NEXT: calll ___morestack
383; X32-Darwin-NEXT: ret
384
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000385}