blob: 6e91d00ac6dd491c61be6313c07cf2ccc7995b9e [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 Espindolab0bf8932011-08-30 19:51:29 +00005
Rafael Espindola014f7a32012-01-11 18:14:03 +00006; We used to crash with filetype=obj
7; RUN: llc < %s -mtriple=i686-linux -segmented-stacks -filetype=obj
8; RUN: llc < %s -mtriple=x86_64-linux -segmented-stacks -filetype=obj
Rafael Espindola2028b792012-01-11 19:00:37 +00009; RUN: llc < %s -mtriple=i686-darwin -segmented-stacks -filetype=obj
10; RUN: llc < %s -mtriple=x86_64-darwin -segmented-stacks -filetype=obj
Rafael Espindola014f7a32012-01-11 18:14:03 +000011
Rafael Espindolab0bf8932011-08-30 19:51:29 +000012; Just to prevent the alloca from being optimized away
13declare void @dummy_use(i32*, i32)
14
Rafael Espindola7692ce92012-01-11 18:51:03 +000015define void @test_basic() {
16 %mem = alloca i32, i32 10
17 call void @dummy_use (i32* %mem, i32 10)
18 ret void
Rafael Espindolab0bf8932011-08-30 19:51:29 +000019
Rafael Espindola2028b792012-01-11 19:00:37 +000020; X32-Linux: test_basic:
Rafael Espindolab0bf8932011-08-30 19:51:29 +000021
Rafael Espindola2028b792012-01-11 19:00:37 +000022; X32-Linux: cmpl %gs:48, %esp
23; X32-Linux-NEXT: ja .LBB0_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000024
Rafael Espindola2028b792012-01-11 19:00:37 +000025; X32-Linux: pushl $0
26; X32-Linux-NEXT: pushl $60
27; X32-Linux-NEXT: calll __morestack
28; X32-Linux-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +000029
Rafael Espindola2028b792012-01-11 19:00:37 +000030; X64-Linux: test_basic:
Rafael Espindolab0bf8932011-08-30 19:51:29 +000031
Rafael Espindola2028b792012-01-11 19:00:37 +000032; X64-Linux: cmpq %fs:112, %rsp
33; X64-Linux-NEXT: ja .LBB0_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000034
Rafael Espindola2028b792012-01-11 19:00:37 +000035; X64-Linux: movabsq $40, %r10
36; X64-Linux-NEXT: movabsq $0, %r11
37; X64-Linux-NEXT: callq __morestack
38; X64-Linux-NEXT: ret
39
40; X32-Darwin: test_basic:
41
42; X32-Darwin: movl $432, %ecx
43; X32-Darwin-NEXT: cmpl %gs:(%ecx), %esp
44; X32-Darwin-NEXT: ja LBB0_2
45
46; X32-Darwin: pushl $0
47; X32-Darwin-NEXT: pushl $60
48; X32-Darwin-NEXT: calll ___morestack
49; X32-Darwin-NEXT: ret
50
51; X64-Darwin: test_basic:
52
53; X64-Darwin: cmpq %gs:816, %rsp
54; X64-Darwin-NEXT: ja LBB0_2
55
56; X64-Darwin: movabsq $40, %r10
57; X64-Darwin-NEXT: movabsq $0, %r11
58; X64-Darwin-NEXT: callq ___morestack
59; X64-Darwin-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +000060
Rafael Espindolab0bf8932011-08-30 19:51:29 +000061}
62
63define i32 @test_nested(i32 * nest %closure, i32 %other) {
64 %addend = load i32 * %closure
65 %result = add i32 %other, %addend
66 ret i32 %result
67
Rafael Espindola2028b792012-01-11 19:00:37 +000068; X32-Linux: cmpl %gs:48, %esp
69; X32-Linux-NEXT: ja .LBB1_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000070
Rafael Espindola2028b792012-01-11 19:00:37 +000071; X32-Linux: pushl $4
72; X32-Linux-NEXT: pushl $0
73; X32-Linux-NEXT: calll __morestack
74; X32-Linux-NEXT: ret
Rafael Espindolab0bf8932011-08-30 19:51:29 +000075
Rafael Espindola2028b792012-01-11 19:00:37 +000076; X64-Linux: cmpq %fs:112, %rsp
77; X64-Linux-NEXT: ja .LBB1_2
Rafael Espindolab0bf8932011-08-30 19:51:29 +000078
Rafael Espindola2028b792012-01-11 19:00:37 +000079; X64-Linux: movq %r10, %rax
80; X64-Linux-NEXT: movabsq $0, %r10
81; X64-Linux-NEXT: movabsq $0, %r11
82; X64-Linux-NEXT: callq __morestack
83; X64-Linux-NEXT: ret
84; X64-Linux-NEXT: movq %rax, %r10
85
86; X32-Darwin: movl $432, %edx
87; X32-Darwin-NEXT: cmpl %gs:(%edx), %esp
88; X32-Darwin-NEXT: ja LBB1_2
89
90; X32-Darwin: pushl $4
91; X32-Darwin-NEXT: pushl $0
92; X32-Darwin-NEXT: calll ___morestack
93; X32-Darwin-NEXT: ret
94
95; X64-Darwin: cmpq %gs:816, %rsp
96; X64-Darwin-NEXT: ja LBB1_2
97
98; X64-Darwin: movq %r10, %rax
99; X64-Darwin-NEXT: movabsq $0, %r10
100; X64-Darwin-NEXT: movabsq $0, %r11
101; X64-Darwin-NEXT: callq ___morestack
102; X64-Darwin-NEXT: ret
103; X64-Darwin-NEXT: movq %rax, %r10
Rafael Espindolab0bf8932011-08-30 19:51:29 +0000104
105}
Sanjoy Das199ce332011-12-03 09:32:07 +0000106
107define void @test_large() {
108 %mem = alloca i32, i32 10000
109 call void @dummy_use (i32* %mem, i32 0)
110 ret void
111
Rafael Espindola2028b792012-01-11 19:00:37 +0000112; X32-Linux: leal -40012(%esp), %ecx
113; X32-Linux-NEXT: cmpl %gs:48, %ecx
114; X32-Linux-NEXT: ja .LBB2_2
Sanjoy Das199ce332011-12-03 09:32:07 +0000115
Rafael Espindola2028b792012-01-11 19:00:37 +0000116; X32-Linux: pushl $0
117; X32-Linux-NEXT: pushl $40012
118; X32-Linux-NEXT: calll __morestack
119; X32-Linux-NEXT: ret
Sanjoy Das199ce332011-12-03 09:32:07 +0000120
Rafael Espindola2028b792012-01-11 19:00:37 +0000121; X64-Linux: leaq -40008(%rsp), %r11
122; X64-Linux-NEXT: cmpq %fs:112, %r11
123; X64-Linux-NEXT: ja .LBB2_2
Sanjoy Das199ce332011-12-03 09:32:07 +0000124
Rafael Espindola2028b792012-01-11 19:00:37 +0000125; X64-Linux: movabsq $40008, %r10
126; X64-Linux-NEXT: movabsq $0, %r11
127; X64-Linux-NEXT: callq __morestack
128; X64-Linux-NEXT: ret
129
130; X32-Darwin: leal -40012(%esp), %ecx
131; X32-Darwin-NEXT: movl $432, %eax
132; X32-Darwin-NEXT: cmpl %gs:(%eax), %ecx
133; X32-Darwin-NEXT: ja LBB2_2
134
135; X32-Darwin: pushl $0
136; X32-Darwin-NEXT: pushl $40012
137; X32-Darwin-NEXT: calll ___morestack
138; X32-Darwin-NEXT: ret
139
140; X64-Darwin: leaq -40008(%rsp), %r11
141; X64-Darwin-NEXT: cmpq %gs:816, %r11
142; X64-Darwin-NEXT: ja LBB2_2
143
144; X64-Darwin: movabsq $40008, %r10
145; X64-Darwin-NEXT: movabsq $0, %r11
146; X64-Darwin-NEXT: callq ___morestack
147; X64-Darwin-NEXT: ret
Sanjoy Das199ce332011-12-03 09:32:07 +0000148
149}
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000150
151define fastcc void @test_fastcc() {
152 %mem = alloca i32, i32 10
153 call void @dummy_use (i32* %mem, i32 10)
154 ret void
155
Rafael Espindola2028b792012-01-11 19:00:37 +0000156; X32-Linux: test_fastcc:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000157
Rafael Espindola2028b792012-01-11 19:00:37 +0000158; X32-Linux: cmpl %gs:48, %esp
159; X32-Linux-NEXT: ja .LBB3_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000160
Rafael Espindola2028b792012-01-11 19:00:37 +0000161; X32-Linux: pushl $0
162; X32-Linux-NEXT: pushl $60
163; X32-Linux-NEXT: calll __morestack
164; X32-Linux-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000165
Rafael Espindola2028b792012-01-11 19:00:37 +0000166; X64-Linux: test_fastcc:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000167
Rafael Espindola2028b792012-01-11 19:00:37 +0000168; X64-Linux: cmpq %fs:112, %rsp
169; X64-Linux-NEXT: ja .LBB3_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000170
Rafael Espindola2028b792012-01-11 19:00:37 +0000171; X64-Linux: movabsq $40, %r10
172; X64-Linux-NEXT: movabsq $0, %r11
173; X64-Linux-NEXT: callq __morestack
174; X64-Linux-NEXT: ret
175
176; X32-Darwin: test_fastcc:
177
178; X32-Darwin: movl $432, %eax
179; X32-Darwin-NEXT: cmpl %gs:(%eax), %esp
180; X32-Darwin-NEXT: ja LBB3_2
181
182; X32-Darwin: pushl $0
183; X32-Darwin-NEXT: pushl $60
184; X32-Darwin-NEXT: calll ___morestack
185; X32-Darwin-NEXT: ret
186
187; X64-Darwin: test_fastcc:
188
189; X64-Darwin: cmpq %gs:816, %rsp
190; X64-Darwin-NEXT: ja LBB3_2
191
192; X64-Darwin: movabsq $40, %r10
193; X64-Darwin-NEXT: movabsq $0, %r11
194; X64-Darwin-NEXT: callq ___morestack
195; X64-Darwin-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000196
197}
198
199define fastcc void @test_fastcc_large() {
200 %mem = alloca i32, i32 10000
201 call void @dummy_use (i32* %mem, i32 0)
202 ret void
203
Rafael Espindola2028b792012-01-11 19:00:37 +0000204; X32-Linux: test_fastcc_large:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000205
Rafael Espindola2028b792012-01-11 19:00:37 +0000206; X32-Linux: leal -40012(%esp), %eax
207; X32-Linux-NEXT: cmpl %gs:48, %eax
208; X32-Linux-NEXT: ja .LBB4_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000209
Rafael Espindola2028b792012-01-11 19:00:37 +0000210; X32-Linux: pushl $0
211; X32-Linux-NEXT: pushl $40012
212; X32-Linux-NEXT: calll __morestack
213; X32-Linux-NEXT: ret
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000214
Rafael Espindola2028b792012-01-11 19:00:37 +0000215; X64-Linux: test_fastcc_large:
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000216
Rafael Espindola2028b792012-01-11 19:00:37 +0000217; X64-Linux: leaq -40008(%rsp), %r11
218; X64-Linux-NEXT: cmpq %fs:112, %r11
219; X64-Linux-NEXT: ja .LBB4_2
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000220
Rafael Espindola2028b792012-01-11 19:00:37 +0000221; X64-Linux: movabsq $40008, %r10
222; X64-Linux-NEXT: movabsq $0, %r11
223; X64-Linux-NEXT: callq __morestack
224; X64-Linux-NEXT: ret
225
226; X32-Darwin: test_fastcc_large:
227
228; X32-Darwin: leal -40012(%esp), %eax
229; X32-Darwin-NEXT: movl $432, %ecx
230; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
231; X32-Darwin-NEXT: ja LBB4_2
232
233; X32-Darwin: pushl $0
234; X32-Darwin-NEXT: pushl $40012
235; X32-Darwin-NEXT: calll ___morestack
236; X32-Darwin-NEXT: ret
237
238; X64-Darwin: test_fastcc_large:
239
240; X64-Darwin: leaq -40008(%rsp), %r11
241; X64-Darwin-NEXT: cmpq %gs:816, %r11
242; X64-Darwin-NEXT: ja LBB4_2
243
244; X64-Darwin: movabsq $40008, %r10
245; X64-Darwin-NEXT: movabsq $0, %r11
246; X64-Darwin-NEXT: callq ___morestack
247; X64-Darwin-NEXT: ret
248
249}
250
251define fastcc void @test_fastcc_large_with_ecx_arg(i32 %a) {
252 %mem = alloca i32, i32 10000
253 call void @dummy_use (i32* %mem, i32 %a)
254 ret void
255
256; This is testing that the Mac implementation preserves ecx
257
258; X32-Darwin: test_fastcc_large_with_ecx_arg:
259
260; X32-Darwin: leal -40012(%esp), %eax
261; X32-Darwin-NEXT: pushl %ecx
262; X32-Darwin-NEXT: movl $432, %ecx
263; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
264; X32-Darwin-NEXT: popl %ecx
265; X32-Darwin-NEXT: ja LBB5_2
266
267; X32-Darwin: pushl $0
268; X32-Darwin-NEXT: pushl $40012
269; X32-Darwin-NEXT: calll ___morestack
270; X32-Darwin-NEXT: ret
271
Rafael Espindola25cd4ff2012-01-11 18:41:19 +0000272}