xref: /llvm-project/llvm/test/CodeGen/X86/segmented-stacks.ll (revision ee5585ed09aff2e54cb540fad4c33f0c93626b1b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -verify-machineinstrs | FileCheck %s -check-prefix=X86-Linux
3; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux  -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux
4; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -code-model=large -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux-Large
5; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnux32 -verify-machineinstrs | FileCheck %s -check-prefix=X32ABI
6; RUN: llc < %s -mcpu=generic -mtriple=i686-darwin -verify-machineinstrs | FileCheck %s -check-prefix=X86-Darwin
7; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -verify-machineinstrs | FileCheck %s -check-prefix=X64-Darwin
8; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -verify-machineinstrs | FileCheck %s -check-prefix=X86-MinGW
9; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -verify-machineinstrs | FileCheck %s -check-prefix=X64-FreeBSD
10; RUN: llc < %s -mcpu=generic -mtriple=i686-dragonfly -verify-machineinstrs | FileCheck %s -check-prefix=X86-DFlyBSD
11; RUN: llc < %s -mcpu=generic -mtriple=x86_64-dragonfly -verify-machineinstrs | FileCheck %s -check-prefix=X64-DFlyBSD
12; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -verify-machineinstrs | FileCheck %s -check-prefix=X64-MinGW
13
14; We used to crash with filetype=obj
15; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -filetype=obj -o /dev/null
16; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -filetype=obj -o /dev/null
17; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnux32 -filetype=obj -o /dev/null
18; RUN: llc < %s -mcpu=generic -mtriple=i686-darwin -filetype=obj -o /dev/null
19; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -filetype=obj -o /dev/null
20; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -filetype=obj -o /dev/null
21; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -filetype=obj -o /dev/null
22; RUN: llc < %s -mcpu=generic -mtriple=i686-dragonfly -filetype=obj -o /dev/null
23; RUN: llc < %s -mcpu=generic -mtriple=x86_64-dragonfly -filetype=obj -o /dev/null
24; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -filetype=obj -o /dev/null
25
26; RUN: not --crash llc < %s -mcpu=generic -mtriple=x86_64-solaris 2> %t.log
27; RUN: FileCheck %s -input-file=%t.log -check-prefix=X64-Solaris
28; RUN: not --crash llc < %s -mcpu=generic -mtriple=i686-freebsd 2> %t.log
29; RUN: FileCheck %s -input-file=%t.log -check-prefix=X86-FreeBSD
30
31; X64-Solaris: Segmented stacks not supported on this platform
32; X86-FreeBSD: Segmented stacks not supported on FreeBSD i386
33
34; Just to prevent the alloca from being optimized away
35declare void @dummy_use(ptr, i32)
36
37define void @test_basic() #0 {
38; X86-Linux-LABEL: test_basic:
39; X86-Linux:       # %bb.0:
40; X86-Linux-NEXT:    cmpl %gs:48, %esp
41; X86-Linux-NEXT:    jbe .LBB0_1
42; X86-Linux-NEXT:  .LBB0_2:
43; X86-Linux-NEXT:    subl $52, %esp
44; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 52
45; X86-Linux-NEXT:    leal {{[0-9]+}}(%esp), %eax
46; X86-Linux-NEXT:    pushl $10
47; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
48; X86-Linux-NEXT:    pushl %eax
49; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
50; X86-Linux-NEXT:    calll dummy_use@PLT
51; X86-Linux-NEXT:    addl $60, %esp
52; X86-Linux-NEXT:    .cfi_adjust_cfa_offset -60
53; X86-Linux-NEXT:    retl
54; X86-Linux-NEXT:  .LBB0_1:
55; X86-Linux-NEXT:    pushl $0
56; X86-Linux-NEXT:    pushl $44
57; X86-Linux-NEXT:    calll __morestack
58; X86-Linux-NEXT:    retl
59; X86-Linux-NEXT:    jmp .LBB0_2
60;
61; X64-Linux-LABEL: test_basic:
62; X64-Linux:       # %bb.0:
63; X64-Linux-NEXT:    cmpq %fs:112, %rsp
64; X64-Linux-NEXT:    jbe .LBB0_1
65; X64-Linux-NEXT:  .LBB0_2:
66; X64-Linux-NEXT:    subq $40, %rsp
67; X64-Linux-NEXT:    .cfi_def_cfa_offset 48
68; X64-Linux-NEXT:    movq %rsp, %rdi
69; X64-Linux-NEXT:    movl $10, %esi
70; X64-Linux-NEXT:    callq dummy_use@PLT
71; X64-Linux-NEXT:    addq $40, %rsp
72; X64-Linux-NEXT:    .cfi_def_cfa_offset 8
73; X64-Linux-NEXT:    retq
74; X64-Linux-NEXT:  .LBB0_1:
75; X64-Linux-NEXT:    movl $40, %r10d
76; X64-Linux-NEXT:    movl $0, %r11d
77; X64-Linux-NEXT:    callq __morestack
78; X64-Linux-NEXT:    retq
79; X64-Linux-NEXT:    jmp .LBB0_2
80;
81; X64-Linux-Large-LABEL: test_basic:
82; X64-Linux-Large:       # %bb.0:
83; X64-Linux-Large-NEXT:    cmpq %fs:112, %rsp
84; X64-Linux-Large-NEXT:    jbe .LBB0_1
85; X64-Linux-Large-NEXT:  .LBB0_2:
86; X64-Linux-Large-NEXT:    subq $40, %rsp
87; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 48
88; X64-Linux-Large-NEXT:    movabsq $dummy_use, %rax
89; X64-Linux-Large-NEXT:    movq %rsp, %rdi
90; X64-Linux-Large-NEXT:    movl $10, %esi
91; X64-Linux-Large-NEXT:    callq *%rax
92; X64-Linux-Large-NEXT:    addq $40, %rsp
93; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 8
94; X64-Linux-Large-NEXT:    retq
95; X64-Linux-Large-NEXT:  .LBB0_1:
96; X64-Linux-Large-NEXT:    movl $40, %r10d
97; X64-Linux-Large-NEXT:    movl $0, %r11d
98; X64-Linux-Large-NEXT:    callq *__morestack_addr(%rip)
99; X64-Linux-Large-NEXT:    retq
100; X64-Linux-Large-NEXT:    jmp .LBB0_2
101;
102; X32ABI-LABEL: test_basic:
103; X32ABI:       # %bb.0:
104; X32ABI-NEXT:    cmpl %fs:64, %esp
105; X32ABI-NEXT:    jbe .LBB0_1
106; X32ABI-NEXT:  .LBB0_2:
107; X32ABI-NEXT:    subl $40, %esp
108; X32ABI-NEXT:    .cfi_def_cfa_offset 48
109; X32ABI-NEXT:    movl %esp, %edi
110; X32ABI-NEXT:    movl $10, %esi
111; X32ABI-NEXT:    callq dummy_use@PLT
112; X32ABI-NEXT:    addl $40, %esp
113; X32ABI-NEXT:    .cfi_def_cfa_offset 8
114; X32ABI-NEXT:    retq
115; X32ABI-NEXT:  .LBB0_1:
116; X32ABI-NEXT:    movl $40, %r10d
117; X32ABI-NEXT:    movl $0, %r11d
118; X32ABI-NEXT:    callq __morestack
119; X32ABI-NEXT:    retq
120; X32ABI-NEXT:    jmp .LBB0_2
121;
122; X86-Darwin-LABEL: test_basic:
123; X86-Darwin:       ## %bb.0:
124; X86-Darwin-NEXT:    movl $432, %ecx ## imm = 0x1B0
125; X86-Darwin-NEXT:    cmpl %gs:(%ecx), %esp
126; X86-Darwin-NEXT:    jbe LBB0_1
127; X86-Darwin-NEXT:  LBB0_2:
128; X86-Darwin-NEXT:    subl $60, %esp
129; X86-Darwin-NEXT:    .cfi_def_cfa_offset 64
130; X86-Darwin-NEXT:    leal {{[0-9]+}}(%esp), %eax
131; X86-Darwin-NEXT:    movl %eax, (%esp)
132; X86-Darwin-NEXT:    movl $10, {{[0-9]+}}(%esp)
133; X86-Darwin-NEXT:    calll _dummy_use
134; X86-Darwin-NEXT:    addl $60, %esp
135; X86-Darwin-NEXT:    retl
136; X86-Darwin-NEXT:  LBB0_1:
137; X86-Darwin-NEXT:    pushl $0
138; X86-Darwin-NEXT:    pushl $60
139; X86-Darwin-NEXT:    calll ___morestack
140; X86-Darwin-NEXT:    retl
141; X86-Darwin-NEXT:    jmp LBB0_2
142;
143; X64-Darwin-LABEL: test_basic:
144; X64-Darwin:       ## %bb.0:
145; X64-Darwin-NEXT:    cmpq %gs:816, %rsp
146; X64-Darwin-NEXT:    jbe LBB0_1
147; X64-Darwin-NEXT:  LBB0_2:
148; X64-Darwin-NEXT:    subq $40, %rsp
149; X64-Darwin-NEXT:    .cfi_def_cfa_offset 48
150; X64-Darwin-NEXT:    movq %rsp, %rdi
151; X64-Darwin-NEXT:    movl $10, %esi
152; X64-Darwin-NEXT:    callq _dummy_use
153; X64-Darwin-NEXT:    addq $40, %rsp
154; X64-Darwin-NEXT:    retq
155; X64-Darwin-NEXT:  LBB0_1:
156; X64-Darwin-NEXT:    movl $40, %r10d
157; X64-Darwin-NEXT:    movl $0, %r11d
158; X64-Darwin-NEXT:    callq ___morestack
159; X64-Darwin-NEXT:    retq
160; X64-Darwin-NEXT:    jmp LBB0_2
161;
162; X86-MinGW-LABEL: test_basic:
163; X86-MinGW:       # %bb.0:
164; X86-MinGW-NEXT:    cmpl %fs:20, %esp
165; X86-MinGW-NEXT:    jbe LBB0_1
166; X86-MinGW-NEXT:  LBB0_2:
167; X86-MinGW-NEXT:    subl $40, %esp
168; X86-MinGW-NEXT:    .cfi_def_cfa_offset 44
169; X86-MinGW-NEXT:    movl %esp, %eax
170; X86-MinGW-NEXT:    pushl $10
171; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
172; X86-MinGW-NEXT:    pushl %eax
173; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
174; X86-MinGW-NEXT:    calll _dummy_use
175; X86-MinGW-NEXT:    addl $48, %esp
176; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset -48
177; X86-MinGW-NEXT:    retl
178; X86-MinGW-NEXT:  LBB0_1:
179; X86-MinGW-NEXT:    pushl $0
180; X86-MinGW-NEXT:    pushl $40
181; X86-MinGW-NEXT:    calll ___morestack
182; X86-MinGW-NEXT:    retl
183; X86-MinGW-NEXT:    jmp LBB0_2
184;
185; X64-FreeBSD-LABEL: test_basic:
186; X64-FreeBSD:       # %bb.0:
187; X64-FreeBSD-NEXT:    cmpq %fs:24, %rsp
188; X64-FreeBSD-NEXT:    jbe .LBB0_1
189; X64-FreeBSD-NEXT:  .LBB0_2:
190; X64-FreeBSD-NEXT:    subq $40, %rsp
191; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 48
192; X64-FreeBSD-NEXT:    movq %rsp, %rdi
193; X64-FreeBSD-NEXT:    movl $10, %esi
194; X64-FreeBSD-NEXT:    callq dummy_use@PLT
195; X64-FreeBSD-NEXT:    addq $40, %rsp
196; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 8
197; X64-FreeBSD-NEXT:    retq
198; X64-FreeBSD-NEXT:  .LBB0_1:
199; X64-FreeBSD-NEXT:    movl $40, %r10d
200; X64-FreeBSD-NEXT:    movl $0, %r11d
201; X64-FreeBSD-NEXT:    callq __morestack
202; X64-FreeBSD-NEXT:    retq
203; X64-FreeBSD-NEXT:    jmp .LBB0_2
204;
205; X86-DFlyBSD-LABEL: test_basic:
206; X86-DFlyBSD:       # %bb.0:
207; X86-DFlyBSD-NEXT:    cmpl %fs:16, %esp
208; X86-DFlyBSD-NEXT:    jbe .LBB0_1
209; X86-DFlyBSD-NEXT:  .LBB0_2:
210; X86-DFlyBSD-NEXT:    subl $40, %esp
211; X86-DFlyBSD-NEXT:    .cfi_def_cfa_offset 44
212; X86-DFlyBSD-NEXT:    movl %esp, %eax
213; X86-DFlyBSD-NEXT:    pushl $10
214; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
215; X86-DFlyBSD-NEXT:    pushl %eax
216; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
217; X86-DFlyBSD-NEXT:    calll dummy_use@PLT
218; X86-DFlyBSD-NEXT:    addl $48, %esp
219; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset -48
220; X86-DFlyBSD-NEXT:    retl
221; X86-DFlyBSD-NEXT:  .LBB0_1:
222; X86-DFlyBSD-NEXT:    pushl $0
223; X86-DFlyBSD-NEXT:    pushl $40
224; X86-DFlyBSD-NEXT:    calll __morestack
225; X86-DFlyBSD-NEXT:    retl
226; X86-DFlyBSD-NEXT:    jmp .LBB0_2
227;
228; X64-DFlyBSD-LABEL: test_basic:
229; X64-DFlyBSD:       # %bb.0:
230; X64-DFlyBSD-NEXT:    cmpq %fs:32, %rsp
231; X64-DFlyBSD-NEXT:    jbe .LBB0_1
232; X64-DFlyBSD-NEXT:  .LBB0_2:
233; X64-DFlyBSD-NEXT:    subq $40, %rsp
234; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 48
235; X64-DFlyBSD-NEXT:    movq %rsp, %rdi
236; X64-DFlyBSD-NEXT:    movl $10, %esi
237; X64-DFlyBSD-NEXT:    callq dummy_use@PLT
238; X64-DFlyBSD-NEXT:    addq $40, %rsp
239; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 8
240; X64-DFlyBSD-NEXT:    retq
241; X64-DFlyBSD-NEXT:  .LBB0_1:
242; X64-DFlyBSD-NEXT:    movl $40, %r10d
243; X64-DFlyBSD-NEXT:    movl $0, %r11d
244; X64-DFlyBSD-NEXT:    callq __morestack
245; X64-DFlyBSD-NEXT:    retq
246; X64-DFlyBSD-NEXT:    jmp .LBB0_2
247;
248; X64-MinGW-LABEL: test_basic:
249; X64-MinGW:       # %bb.0:
250; X64-MinGW-NEXT:    cmpq %gs:40, %rsp
251; X64-MinGW-NEXT:    jbe .LBB0_1
252; X64-MinGW-NEXT:  .LBB0_2:
253; X64-MinGW-NEXT:    subq $72, %rsp
254; X64-MinGW-NEXT:    .seh_stackalloc 72
255; X64-MinGW-NEXT:    .seh_endprologue
256; X64-MinGW-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
257; X64-MinGW-NEXT:    movl $10, %edx
258; X64-MinGW-NEXT:    callq dummy_use
259; X64-MinGW-NEXT:    nop
260; X64-MinGW-NEXT:    addq $72, %rsp
261; X64-MinGW-NEXT:    retq
262; X64-MinGW-NEXT:  .LBB0_1:
263; X64-MinGW-NEXT:    movl $72, %r10d
264; X64-MinGW-NEXT:    movl $32, %r11d
265; X64-MinGW-NEXT:    callq __morestack
266; X64-MinGW-NEXT:    retq
267; X64-MinGW-NEXT:    jmp .LBB0_2
268; X64-MinGW-NEXT:    .seh_endproc
269        %mem = alloca i32, i32 10
270        call void @dummy_use (ptr %mem, i32 10)
271	ret void
272}
273
274define i32 @test_nested(ptr nest %closure, i32 %other) #0 {
275; X86-Linux-LABEL: test_nested:
276; X86-Linux:       # %bb.0:
277; X86-Linux-NEXT:    cmpl %gs:48, %esp
278; X86-Linux-NEXT:    jbe .LBB1_1
279; X86-Linux-NEXT:  .LBB1_2:
280; X86-Linux-NEXT:    pushl %esi
281; X86-Linux-NEXT:    .cfi_def_cfa_offset 8
282; X86-Linux-NEXT:    subl $40, %esp
283; X86-Linux-NEXT:    .cfi_def_cfa_offset 48
284; X86-Linux-NEXT:    .cfi_offset %esi, -8
285; X86-Linux-NEXT:    movl {{[0-9]+}}(%esp), %esi
286; X86-Linux-NEXT:    addl (%ecx), %esi
287; X86-Linux-NEXT:    subl $8, %esp
288; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 8
289; X86-Linux-NEXT:    leal {{[0-9]+}}(%esp), %eax
290; X86-Linux-NEXT:    pushl $10
291; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
292; X86-Linux-NEXT:    pushl %eax
293; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
294; X86-Linux-NEXT:    calll dummy_use@PLT
295; X86-Linux-NEXT:    addl $16, %esp
296; X86-Linux-NEXT:    .cfi_adjust_cfa_offset -16
297; X86-Linux-NEXT:    movl %esi, %eax
298; X86-Linux-NEXT:    addl $40, %esp
299; X86-Linux-NEXT:    .cfi_def_cfa_offset 8
300; X86-Linux-NEXT:    popl %esi
301; X86-Linux-NEXT:    .cfi_def_cfa_offset 4
302; X86-Linux-NEXT:    retl
303; X86-Linux-NEXT:  .LBB1_1:
304; X86-Linux-NEXT:    .cfi_restore %esi
305; X86-Linux-NEXT:    pushl $4
306; X86-Linux-NEXT:    pushl $44
307; X86-Linux-NEXT:    calll __morestack
308; X86-Linux-NEXT:    retl
309; X86-Linux-NEXT:    jmp .LBB1_2
310;
311; X64-Linux-LABEL: test_nested:
312; X64-Linux:       # %bb.0:
313; X64-Linux-NEXT:    cmpq %fs:112, %rsp
314; X64-Linux-NEXT:    jbe .LBB1_1
315; X64-Linux-NEXT:  .LBB1_2:
316; X64-Linux-NEXT:    pushq %rbx
317; X64-Linux-NEXT:    .cfi_def_cfa_offset 16
318; X64-Linux-NEXT:    subq $48, %rsp
319; X64-Linux-NEXT:    .cfi_def_cfa_offset 64
320; X64-Linux-NEXT:    .cfi_offset %rbx, -16
321; X64-Linux-NEXT:    movl %edi, %ebx
322; X64-Linux-NEXT:    addl (%r10), %ebx
323; X64-Linux-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
324; X64-Linux-NEXT:    movl $10, %esi
325; X64-Linux-NEXT:    callq dummy_use@PLT
326; X64-Linux-NEXT:    movl %ebx, %eax
327; X64-Linux-NEXT:    addq $48, %rsp
328; X64-Linux-NEXT:    .cfi_def_cfa_offset 16
329; X64-Linux-NEXT:    popq %rbx
330; X64-Linux-NEXT:    .cfi_def_cfa_offset 8
331; X64-Linux-NEXT:    retq
332; X64-Linux-NEXT:  .LBB1_1:
333; X64-Linux-NEXT:    .cfi_restore %rbx
334; X64-Linux-NEXT:    movq %r10, %rax
335; X64-Linux-NEXT:    movl $56, %r10d
336; X64-Linux-NEXT:    movl $0, %r11d
337; X64-Linux-NEXT:    callq __morestack
338; X64-Linux-NEXT:    retq
339; X64-Linux-NEXT:    movq %rax, %r10
340; X64-Linux-NEXT:    jmp .LBB1_2
341;
342; X64-Linux-Large-LABEL: test_nested:
343; X64-Linux-Large:       # %bb.0:
344; X64-Linux-Large-NEXT:    cmpq %fs:112, %rsp
345; X64-Linux-Large-NEXT:    jbe .LBB1_1
346; X64-Linux-Large-NEXT:  .LBB1_2:
347; X64-Linux-Large-NEXT:    pushq %rbx
348; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 16
349; X64-Linux-Large-NEXT:    subq $48, %rsp
350; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 64
351; X64-Linux-Large-NEXT:    .cfi_offset %rbx, -16
352; X64-Linux-Large-NEXT:    movl %edi, %ebx
353; X64-Linux-Large-NEXT:    addl (%r10), %ebx
354; X64-Linux-Large-NEXT:    movabsq $dummy_use, %rax
355; X64-Linux-Large-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
356; X64-Linux-Large-NEXT:    movl $10, %esi
357; X64-Linux-Large-NEXT:    callq *%rax
358; X64-Linux-Large-NEXT:    movl %ebx, %eax
359; X64-Linux-Large-NEXT:    addq $48, %rsp
360; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 16
361; X64-Linux-Large-NEXT:    popq %rbx
362; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 8
363; X64-Linux-Large-NEXT:    retq
364; X64-Linux-Large-NEXT:  .LBB1_1:
365; X64-Linux-Large-NEXT:    .cfi_restore %rbx
366; X64-Linux-Large-NEXT:    movq %r10, %rax
367; X64-Linux-Large-NEXT:    movl $56, %r10d
368; X64-Linux-Large-NEXT:    movl $0, %r11d
369; X64-Linux-Large-NEXT:    callq *__morestack_addr(%rip)
370; X64-Linux-Large-NEXT:    retq
371; X64-Linux-Large-NEXT:    movq %rax, %r10
372; X64-Linux-Large-NEXT:    jmp .LBB1_2
373;
374; X32ABI-LABEL: test_nested:
375; X32ABI:       # %bb.0:
376; X32ABI-NEXT:    cmpl %fs:64, %esp
377; X32ABI-NEXT:    jbe .LBB1_1
378; X32ABI-NEXT:  .LBB1_2:
379; X32ABI-NEXT:    pushq %rbx
380; X32ABI-NEXT:    .cfi_def_cfa_offset 16
381; X32ABI-NEXT:    subl $48, %esp
382; X32ABI-NEXT:    .cfi_def_cfa_offset 64
383; X32ABI-NEXT:    .cfi_offset %rbx, -16
384; X32ABI-NEXT:    movl %edi, %ebx
385; X32ABI-NEXT:    addl (%r10d), %ebx
386; X32ABI-NEXT:    leal {{[0-9]+}}(%rsp), %edi
387; X32ABI-NEXT:    movl $10, %esi
388; X32ABI-NEXT:    callq dummy_use@PLT
389; X32ABI-NEXT:    movl %ebx, %eax
390; X32ABI-NEXT:    addl $48, %esp
391; X32ABI-NEXT:    .cfi_def_cfa_offset 16
392; X32ABI-NEXT:    popq %rbx
393; X32ABI-NEXT:    .cfi_def_cfa_offset 8
394; X32ABI-NEXT:    retq
395; X32ABI-NEXT:  .LBB1_1:
396; X32ABI-NEXT:    .cfi_restore %rbx
397; X32ABI-NEXT:    movl %r10d, %eax
398; X32ABI-NEXT:    movl $56, %r10d
399; X32ABI-NEXT:    movl $0, %r11d
400; X32ABI-NEXT:    callq __morestack
401; X32ABI-NEXT:    retq
402; X32ABI-NEXT:    movq %rax, %r10
403; X32ABI-NEXT:    jmp .LBB1_2
404;
405; X86-Darwin-LABEL: test_nested:
406; X86-Darwin:       ## %bb.0:
407; X86-Darwin-NEXT:    movl $432, %edx ## imm = 0x1B0
408; X86-Darwin-NEXT:    cmpl %gs:(%edx), %esp
409; X86-Darwin-NEXT:    jbe LBB1_1
410; X86-Darwin-NEXT:  LBB1_2:
411; X86-Darwin-NEXT:    pushl %esi
412; X86-Darwin-NEXT:    .cfi_def_cfa_offset 8
413; X86-Darwin-NEXT:    subl $56, %esp
414; X86-Darwin-NEXT:    .cfi_def_cfa_offset 64
415; X86-Darwin-NEXT:    .cfi_offset %esi, -8
416; X86-Darwin-NEXT:    movl {{[0-9]+}}(%esp), %esi
417; X86-Darwin-NEXT:    addl (%ecx), %esi
418; X86-Darwin-NEXT:    leal {{[0-9]+}}(%esp), %eax
419; X86-Darwin-NEXT:    movl %eax, (%esp)
420; X86-Darwin-NEXT:    movl $10, {{[0-9]+}}(%esp)
421; X86-Darwin-NEXT:    calll _dummy_use
422; X86-Darwin-NEXT:    movl %esi, %eax
423; X86-Darwin-NEXT:    addl $56, %esp
424; X86-Darwin-NEXT:    popl %esi
425; X86-Darwin-NEXT:    retl
426; X86-Darwin-NEXT:  LBB1_1:
427; X86-Darwin-NEXT:    pushl $4
428; X86-Darwin-NEXT:    pushl $60
429; X86-Darwin-NEXT:    calll ___morestack
430; X86-Darwin-NEXT:    retl
431; X86-Darwin-NEXT:    jmp LBB1_2
432;
433; X64-Darwin-LABEL: test_nested:
434; X64-Darwin:       ## %bb.0:
435; X64-Darwin-NEXT:    cmpq %gs:816, %rsp
436; X64-Darwin-NEXT:    jbe LBB1_1
437; X64-Darwin-NEXT:  LBB1_2:
438; X64-Darwin-NEXT:    pushq %rbx
439; X64-Darwin-NEXT:    .cfi_def_cfa_offset 16
440; X64-Darwin-NEXT:    subq $48, %rsp
441; X64-Darwin-NEXT:    .cfi_def_cfa_offset 64
442; X64-Darwin-NEXT:    .cfi_offset %rbx, -16
443; X64-Darwin-NEXT:    movl %edi, %ebx
444; X64-Darwin-NEXT:    addl (%r10), %ebx
445; X64-Darwin-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
446; X64-Darwin-NEXT:    movl $10, %esi
447; X64-Darwin-NEXT:    callq _dummy_use
448; X64-Darwin-NEXT:    movl %ebx, %eax
449; X64-Darwin-NEXT:    addq $48, %rsp
450; X64-Darwin-NEXT:    popq %rbx
451; X64-Darwin-NEXT:    retq
452; X64-Darwin-NEXT:  LBB1_1:
453; X64-Darwin-NEXT:    movq %r10, %rax
454; X64-Darwin-NEXT:    movl $56, %r10d
455; X64-Darwin-NEXT:    movl $0, %r11d
456; X64-Darwin-NEXT:    callq ___morestack
457; X64-Darwin-NEXT:    retq
458; X64-Darwin-NEXT:    movq %rax, %r10
459; X64-Darwin-NEXT:    jmp LBB1_2
460;
461; X86-MinGW-LABEL: test_nested:
462; X86-MinGW:       # %bb.0:
463; X86-MinGW-NEXT:    cmpl %fs:20, %esp
464; X86-MinGW-NEXT:    jbe LBB1_1
465; X86-MinGW-NEXT:  LBB1_2:
466; X86-MinGW-NEXT:    pushl %esi
467; X86-MinGW-NEXT:    .cfi_def_cfa_offset 8
468; X86-MinGW-NEXT:    subl $40, %esp
469; X86-MinGW-NEXT:    .cfi_def_cfa_offset 48
470; X86-MinGW-NEXT:    .cfi_offset %esi, -8
471; X86-MinGW-NEXT:    movl {{[0-9]+}}(%esp), %esi
472; X86-MinGW-NEXT:    addl (%ecx), %esi
473; X86-MinGW-NEXT:    movl %esp, %eax
474; X86-MinGW-NEXT:    pushl $10
475; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
476; X86-MinGW-NEXT:    pushl %eax
477; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
478; X86-MinGW-NEXT:    calll _dummy_use
479; X86-MinGW-NEXT:    addl $8, %esp
480; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset -8
481; X86-MinGW-NEXT:    movl %esi, %eax
482; X86-MinGW-NEXT:    addl $40, %esp
483; X86-MinGW-NEXT:    popl %esi
484; X86-MinGW-NEXT:    retl
485; X86-MinGW-NEXT:  LBB1_1:
486; X86-MinGW-NEXT:    .cfi_def_cfa_offset 4
487; X86-MinGW-NEXT:    .cfi_restore %esi
488; X86-MinGW-NEXT:    pushl $4
489; X86-MinGW-NEXT:    pushl $44
490; X86-MinGW-NEXT:    calll ___morestack
491; X86-MinGW-NEXT:    retl
492; X86-MinGW-NEXT:    jmp LBB1_2
493;
494; X64-FreeBSD-LABEL: test_nested:
495; X64-FreeBSD:       # %bb.0:
496; X64-FreeBSD-NEXT:    cmpq %fs:24, %rsp
497; X64-FreeBSD-NEXT:    jbe .LBB1_1
498; X64-FreeBSD-NEXT:  .LBB1_2:
499; X64-FreeBSD-NEXT:    pushq %rbx
500; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 16
501; X64-FreeBSD-NEXT:    subq $48, %rsp
502; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 64
503; X64-FreeBSD-NEXT:    .cfi_offset %rbx, -16
504; X64-FreeBSD-NEXT:    movl %edi, %ebx
505; X64-FreeBSD-NEXT:    addl (%r10), %ebx
506; X64-FreeBSD-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
507; X64-FreeBSD-NEXT:    movl $10, %esi
508; X64-FreeBSD-NEXT:    callq dummy_use@PLT
509; X64-FreeBSD-NEXT:    movl %ebx, %eax
510; X64-FreeBSD-NEXT:    addq $48, %rsp
511; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 16
512; X64-FreeBSD-NEXT:    popq %rbx
513; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 8
514; X64-FreeBSD-NEXT:    retq
515; X64-FreeBSD-NEXT:  .LBB1_1:
516; X64-FreeBSD-NEXT:    .cfi_restore %rbx
517; X64-FreeBSD-NEXT:    movq %r10, %rax
518; X64-FreeBSD-NEXT:    movl $56, %r10d
519; X64-FreeBSD-NEXT:    movl $0, %r11d
520; X64-FreeBSD-NEXT:    callq __morestack
521; X64-FreeBSD-NEXT:    retq
522; X64-FreeBSD-NEXT:    movq %rax, %r10
523; X64-FreeBSD-NEXT:    jmp .LBB1_2
524;
525; X86-DFlyBSD-LABEL: test_nested:
526; X86-DFlyBSD:       # %bb.0:
527; X86-DFlyBSD-NEXT:    cmpl %fs:16, %esp
528; X86-DFlyBSD-NEXT:    jbe .LBB1_1
529; X86-DFlyBSD-NEXT:  .LBB1_2:
530; X86-DFlyBSD-NEXT:    pushl %esi
531; X86-DFlyBSD-NEXT:    .cfi_def_cfa_offset 8
532; X86-DFlyBSD-NEXT:    subl $40, %esp
533; X86-DFlyBSD-NEXT:    .cfi_def_cfa_offset 48
534; X86-DFlyBSD-NEXT:    .cfi_offset %esi, -8
535; X86-DFlyBSD-NEXT:    movl {{[0-9]+}}(%esp), %esi
536; X86-DFlyBSD-NEXT:    addl (%ecx), %esi
537; X86-DFlyBSD-NEXT:    movl %esp, %eax
538; X86-DFlyBSD-NEXT:    pushl $10
539; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
540; X86-DFlyBSD-NEXT:    pushl %eax
541; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
542; X86-DFlyBSD-NEXT:    calll dummy_use@PLT
543; X86-DFlyBSD-NEXT:    addl $8, %esp
544; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset -8
545; X86-DFlyBSD-NEXT:    movl %esi, %eax
546; X86-DFlyBSD-NEXT:    addl $40, %esp
547; X86-DFlyBSD-NEXT:    .cfi_def_cfa_offset 8
548; X86-DFlyBSD-NEXT:    popl %esi
549; X86-DFlyBSD-NEXT:    .cfi_def_cfa_offset 4
550; X86-DFlyBSD-NEXT:    retl
551; X86-DFlyBSD-NEXT:  .LBB1_1:
552; X86-DFlyBSD-NEXT:    .cfi_restore %esi
553; X86-DFlyBSD-NEXT:    pushl $4
554; X86-DFlyBSD-NEXT:    pushl $44
555; X86-DFlyBSD-NEXT:    calll __morestack
556; X86-DFlyBSD-NEXT:    retl
557; X86-DFlyBSD-NEXT:    jmp .LBB1_2
558;
559; X64-DFlyBSD-LABEL: test_nested:
560; X64-DFlyBSD:       # %bb.0:
561; X64-DFlyBSD-NEXT:    cmpq %fs:32, %rsp
562; X64-DFlyBSD-NEXT:    jbe .LBB1_1
563; X64-DFlyBSD-NEXT:  .LBB1_2:
564; X64-DFlyBSD-NEXT:    pushq %rbx
565; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 16
566; X64-DFlyBSD-NEXT:    subq $48, %rsp
567; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 64
568; X64-DFlyBSD-NEXT:    .cfi_offset %rbx, -16
569; X64-DFlyBSD-NEXT:    movl %edi, %ebx
570; X64-DFlyBSD-NEXT:    addl (%r10), %ebx
571; X64-DFlyBSD-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
572; X64-DFlyBSD-NEXT:    movl $10, %esi
573; X64-DFlyBSD-NEXT:    callq dummy_use@PLT
574; X64-DFlyBSD-NEXT:    movl %ebx, %eax
575; X64-DFlyBSD-NEXT:    addq $48, %rsp
576; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 16
577; X64-DFlyBSD-NEXT:    popq %rbx
578; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 8
579; X64-DFlyBSD-NEXT:    retq
580; X64-DFlyBSD-NEXT:  .LBB1_1:
581; X64-DFlyBSD-NEXT:    .cfi_restore %rbx
582; X64-DFlyBSD-NEXT:    movq %r10, %rax
583; X64-DFlyBSD-NEXT:    movl $56, %r10d
584; X64-DFlyBSD-NEXT:    movl $0, %r11d
585; X64-DFlyBSD-NEXT:    callq __morestack
586; X64-DFlyBSD-NEXT:    retq
587; X64-DFlyBSD-NEXT:    movq %rax, %r10
588; X64-DFlyBSD-NEXT:    jmp .LBB1_2
589;
590; X64-MinGW-LABEL: test_nested:
591; X64-MinGW:       # %bb.0:
592; X64-MinGW-NEXT:    cmpq %gs:40, %rsp
593; X64-MinGW-NEXT:    jbe .LBB1_1
594; X64-MinGW-NEXT:  .LBB1_2:
595; X64-MinGW-NEXT:    pushq %rsi
596; X64-MinGW-NEXT:    .seh_pushreg %rsi
597; X64-MinGW-NEXT:    subq $80, %rsp
598; X64-MinGW-NEXT:    .seh_stackalloc 80
599; X64-MinGW-NEXT:    .seh_endprologue
600; X64-MinGW-NEXT:    movl %ecx, %esi
601; X64-MinGW-NEXT:    addl (%r10), %esi
602; X64-MinGW-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
603; X64-MinGW-NEXT:    movl $10, %edx
604; X64-MinGW-NEXT:    callq dummy_use
605; X64-MinGW-NEXT:    movl %esi, %eax
606; X64-MinGW-NEXT:    addq $80, %rsp
607; X64-MinGW-NEXT:    popq %rsi
608; X64-MinGW-NEXT:    retq
609; X64-MinGW-NEXT:  .LBB1_1:
610; X64-MinGW-NEXT:    movq %r10, %rax
611; X64-MinGW-NEXT:    movl $88, %r10d
612; X64-MinGW-NEXT:    movl $32, %r11d
613; X64-MinGW-NEXT:    callq __morestack
614; X64-MinGW-NEXT:    retq
615; X64-MinGW-NEXT:    movq %rax, %r10
616; X64-MinGW-NEXT:    jmp .LBB1_2
617; X64-MinGW-NEXT:    .seh_endproc
618       %addend = load i32 , ptr %closure
619       %result = add i32 %other, %addend
620       %mem = alloca i32, i32 10
621       call void @dummy_use (ptr %mem, i32 10)
622       ret i32 %result
623}
624
625define void @test_large() #0 {
626; X86-Linux-LABEL: test_large:
627; X86-Linux:       # %bb.0:
628; X86-Linux-NEXT:    leal -{{[0-9]+}}(%esp), %ecx
629; X86-Linux-NEXT:    cmpl %gs:48, %ecx
630; X86-Linux-NEXT:    jbe .LBB2_1
631; X86-Linux-NEXT:  .LBB2_2:
632; X86-Linux-NEXT:    subl $40020, %esp # imm = 0x9C54
633; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 40020
634; X86-Linux-NEXT:    leal {{[0-9]+}}(%esp), %eax
635; X86-Linux-NEXT:    pushl $3
636; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
637; X86-Linux-NEXT:    pushl %eax
638; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
639; X86-Linux-NEXT:    calll dummy_use@PLT
640; X86-Linux-NEXT:    addl $40028, %esp # imm = 0x9C5C
641; X86-Linux-NEXT:    .cfi_adjust_cfa_offset -40028
642; X86-Linux-NEXT:    retl
643; X86-Linux-NEXT:  .LBB2_1:
644; X86-Linux-NEXT:    pushl $0
645; X86-Linux-NEXT:    pushl $40012 # imm = 0x9C4C
646; X86-Linux-NEXT:    calll __morestack
647; X86-Linux-NEXT:    retl
648; X86-Linux-NEXT:    jmp .LBB2_2
649;
650; X64-Linux-LABEL: test_large:
651; X64-Linux:       # %bb.0:
652; X64-Linux-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
653; X64-Linux-NEXT:    cmpq %fs:112, %r11
654; X64-Linux-NEXT:    jbe .LBB2_1
655; X64-Linux-NEXT:  .LBB2_2:
656; X64-Linux-NEXT:    subq $40008, %rsp # imm = 0x9C48
657; X64-Linux-NEXT:    .cfi_def_cfa_offset 40016
658; X64-Linux-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
659; X64-Linux-NEXT:    movl $3, %esi
660; X64-Linux-NEXT:    callq dummy_use@PLT
661; X64-Linux-NEXT:    addq $40008, %rsp # imm = 0x9C48
662; X64-Linux-NEXT:    .cfi_def_cfa_offset 8
663; X64-Linux-NEXT:    retq
664; X64-Linux-NEXT:  .LBB2_1:
665; X64-Linux-NEXT:    movl $40008, %r10d # imm = 0x9C48
666; X64-Linux-NEXT:    movl $0, %r11d
667; X64-Linux-NEXT:    callq __morestack
668; X64-Linux-NEXT:    retq
669; X64-Linux-NEXT:    jmp .LBB2_2
670;
671; X64-Linux-Large-LABEL: test_large:
672; X64-Linux-Large:       # %bb.0:
673; X64-Linux-Large-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
674; X64-Linux-Large-NEXT:    cmpq %fs:112, %r11
675; X64-Linux-Large-NEXT:    jbe .LBB2_1
676; X64-Linux-Large-NEXT:  .LBB2_2:
677; X64-Linux-Large-NEXT:    subq $40008, %rsp # imm = 0x9C48
678; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 40016
679; X64-Linux-Large-NEXT:    movabsq $dummy_use, %rax
680; X64-Linux-Large-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
681; X64-Linux-Large-NEXT:    movl $3, %esi
682; X64-Linux-Large-NEXT:    callq *%rax
683; X64-Linux-Large-NEXT:    addq $40008, %rsp # imm = 0x9C48
684; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 8
685; X64-Linux-Large-NEXT:    retq
686; X64-Linux-Large-NEXT:  .LBB2_1:
687; X64-Linux-Large-NEXT:    movl $40008, %r10d # imm = 0x9C48
688; X64-Linux-Large-NEXT:    movl $0, %r11d
689; X64-Linux-Large-NEXT:    callq *__morestack_addr(%rip)
690; X64-Linux-Large-NEXT:    retq
691; X64-Linux-Large-NEXT:    jmp .LBB2_2
692;
693; X32ABI-LABEL: test_large:
694; X32ABI:       # %bb.0:
695; X32ABI-NEXT:    leal -{{[0-9]+}}(%rsp), %r11d
696; X32ABI-NEXT:    cmpl %fs:64, %r11d
697; X32ABI-NEXT:    jbe .LBB2_1
698; X32ABI-NEXT:  .LBB2_2:
699; X32ABI-NEXT:    subl $40008, %esp # imm = 0x9C48
700; X32ABI-NEXT:    .cfi_def_cfa_offset 40016
701; X32ABI-NEXT:    leal {{[0-9]+}}(%rsp), %edi
702; X32ABI-NEXT:    movl $3, %esi
703; X32ABI-NEXT:    callq dummy_use@PLT
704; X32ABI-NEXT:    addl $40008, %esp # imm = 0x9C48
705; X32ABI-NEXT:    .cfi_def_cfa_offset 8
706; X32ABI-NEXT:    retq
707; X32ABI-NEXT:  .LBB2_1:
708; X32ABI-NEXT:    movl $40008, %r10d # imm = 0x9C48
709; X32ABI-NEXT:    movl $0, %r11d
710; X32ABI-NEXT:    callq __morestack
711; X32ABI-NEXT:    retq
712; X32ABI-NEXT:    jmp .LBB2_2
713;
714; X86-Darwin-LABEL: test_large:
715; X86-Darwin:       ## %bb.0:
716; X86-Darwin-NEXT:    leal -{{[0-9]+}}(%esp), %ecx
717; X86-Darwin-NEXT:    movl $432, %eax ## imm = 0x1B0
718; X86-Darwin-NEXT:    cmpl %gs:(%eax), %ecx
719; X86-Darwin-NEXT:    jbe LBB2_1
720; X86-Darwin-NEXT:  LBB2_2:
721; X86-Darwin-NEXT:    subl $40012, %esp ## imm = 0x9C4C
722; X86-Darwin-NEXT:    .cfi_def_cfa_offset 40016
723; X86-Darwin-NEXT:    leal {{[0-9]+}}(%esp), %eax
724; X86-Darwin-NEXT:    movl %eax, (%esp)
725; X86-Darwin-NEXT:    movl $3, {{[0-9]+}}(%esp)
726; X86-Darwin-NEXT:    calll _dummy_use
727; X86-Darwin-NEXT:    addl $40012, %esp ## imm = 0x9C4C
728; X86-Darwin-NEXT:    retl
729; X86-Darwin-NEXT:  LBB2_1:
730; X86-Darwin-NEXT:    pushl $0
731; X86-Darwin-NEXT:    pushl $40012 ## imm = 0x9C4C
732; X86-Darwin-NEXT:    calll ___morestack
733; X86-Darwin-NEXT:    retl
734; X86-Darwin-NEXT:    jmp LBB2_2
735;
736; X64-Darwin-LABEL: test_large:
737; X64-Darwin:       ## %bb.0:
738; X64-Darwin-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
739; X64-Darwin-NEXT:    cmpq %gs:816, %r11
740; X64-Darwin-NEXT:    jbe LBB2_1
741; X64-Darwin-NEXT:  LBB2_2:
742; X64-Darwin-NEXT:    subq $40008, %rsp ## imm = 0x9C48
743; X64-Darwin-NEXT:    .cfi_def_cfa_offset 40016
744; X64-Darwin-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
745; X64-Darwin-NEXT:    movl $3, %esi
746; X64-Darwin-NEXT:    callq _dummy_use
747; X64-Darwin-NEXT:    addq $40008, %rsp ## imm = 0x9C48
748; X64-Darwin-NEXT:    retq
749; X64-Darwin-NEXT:  LBB2_1:
750; X64-Darwin-NEXT:    movl $40008, %r10d ## imm = 0x9C48
751; X64-Darwin-NEXT:    movl $0, %r11d
752; X64-Darwin-NEXT:    callq ___morestack
753; X64-Darwin-NEXT:    retq
754; X64-Darwin-NEXT:    jmp LBB2_2
755;
756; X86-MinGW-LABEL: test_large:
757; X86-MinGW:       # %bb.0:
758; X86-MinGW-NEXT:    leal -{{[0-9]+}}(%esp), %ecx
759; X86-MinGW-NEXT:    cmpl %fs:20, %ecx
760; X86-MinGW-NEXT:    jbe LBB2_1
761; X86-MinGW-NEXT:  LBB2_2:
762; X86-MinGW-NEXT:    movl $40000, %eax # imm = 0x9C40
763; X86-MinGW-NEXT:    calll __alloca
764; X86-MinGW-NEXT:    .cfi_def_cfa_offset 40004
765; X86-MinGW-NEXT:    movl %esp, %eax
766; X86-MinGW-NEXT:    pushl $3
767; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
768; X86-MinGW-NEXT:    pushl %eax
769; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
770; X86-MinGW-NEXT:    calll _dummy_use
771; X86-MinGW-NEXT:    addl $40008, %esp # imm = 0x9C48
772; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset -40008
773; X86-MinGW-NEXT:    retl
774; X86-MinGW-NEXT:  LBB2_1:
775; X86-MinGW-NEXT:    pushl $0
776; X86-MinGW-NEXT:    pushl $40000 # imm = 0x9C40
777; X86-MinGW-NEXT:    calll ___morestack
778; X86-MinGW-NEXT:    retl
779; X86-MinGW-NEXT:    jmp LBB2_2
780;
781; X64-FreeBSD-LABEL: test_large:
782; X64-FreeBSD:       # %bb.0:
783; X64-FreeBSD-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
784; X64-FreeBSD-NEXT:    cmpq %fs:24, %r11
785; X64-FreeBSD-NEXT:    jbe .LBB2_1
786; X64-FreeBSD-NEXT:  .LBB2_2:
787; X64-FreeBSD-NEXT:    subq $40008, %rsp # imm = 0x9C48
788; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 40016
789; X64-FreeBSD-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
790; X64-FreeBSD-NEXT:    movl $3, %esi
791; X64-FreeBSD-NEXT:    callq dummy_use@PLT
792; X64-FreeBSD-NEXT:    addq $40008, %rsp # imm = 0x9C48
793; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 8
794; X64-FreeBSD-NEXT:    retq
795; X64-FreeBSD-NEXT:  .LBB2_1:
796; X64-FreeBSD-NEXT:    movl $40008, %r10d # imm = 0x9C48
797; X64-FreeBSD-NEXT:    movl $0, %r11d
798; X64-FreeBSD-NEXT:    callq __morestack
799; X64-FreeBSD-NEXT:    retq
800; X64-FreeBSD-NEXT:    jmp .LBB2_2
801;
802; X86-DFlyBSD-LABEL: test_large:
803; X86-DFlyBSD:       # %bb.0:
804; X86-DFlyBSD-NEXT:    leal -{{[0-9]+}}(%esp), %ecx
805; X86-DFlyBSD-NEXT:    cmpl %fs:16, %ecx
806; X86-DFlyBSD-NEXT:    jbe .LBB2_1
807; X86-DFlyBSD-NEXT:  .LBB2_2:
808; X86-DFlyBSD-NEXT:    subl $40000, %esp # imm = 0x9C40
809; X86-DFlyBSD-NEXT:    .cfi_def_cfa_offset 40004
810; X86-DFlyBSD-NEXT:    movl %esp, %eax
811; X86-DFlyBSD-NEXT:    pushl $3
812; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
813; X86-DFlyBSD-NEXT:    pushl %eax
814; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
815; X86-DFlyBSD-NEXT:    calll dummy_use@PLT
816; X86-DFlyBSD-NEXT:    addl $40008, %esp # imm = 0x9C48
817; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset -40008
818; X86-DFlyBSD-NEXT:    retl
819; X86-DFlyBSD-NEXT:  .LBB2_1:
820; X86-DFlyBSD-NEXT:    pushl $0
821; X86-DFlyBSD-NEXT:    pushl $40000 # imm = 0x9C40
822; X86-DFlyBSD-NEXT:    calll __morestack
823; X86-DFlyBSD-NEXT:    retl
824; X86-DFlyBSD-NEXT:    jmp .LBB2_2
825;
826; X64-DFlyBSD-LABEL: test_large:
827; X64-DFlyBSD:       # %bb.0:
828; X64-DFlyBSD-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
829; X64-DFlyBSD-NEXT:    cmpq %fs:32, %r11
830; X64-DFlyBSD-NEXT:    jbe .LBB2_1
831; X64-DFlyBSD-NEXT:  .LBB2_2:
832; X64-DFlyBSD-NEXT:    subq $40008, %rsp # imm = 0x9C48
833; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 40016
834; X64-DFlyBSD-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
835; X64-DFlyBSD-NEXT:    movl $3, %esi
836; X64-DFlyBSD-NEXT:    callq dummy_use@PLT
837; X64-DFlyBSD-NEXT:    addq $40008, %rsp # imm = 0x9C48
838; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 8
839; X64-DFlyBSD-NEXT:    retq
840; X64-DFlyBSD-NEXT:  .LBB2_1:
841; X64-DFlyBSD-NEXT:    movl $40008, %r10d # imm = 0x9C48
842; X64-DFlyBSD-NEXT:    movl $0, %r11d
843; X64-DFlyBSD-NEXT:    callq __morestack
844; X64-DFlyBSD-NEXT:    retq
845; X64-DFlyBSD-NEXT:    jmp .LBB2_2
846;
847; X64-MinGW-LABEL: test_large:
848; X64-MinGW:       # %bb.0:
849; X64-MinGW-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
850; X64-MinGW-NEXT:    cmpq %gs:40, %r11
851; X64-MinGW-NEXT:    jbe .LBB2_1
852; X64-MinGW-NEXT:  .LBB2_2:
853; X64-MinGW-NEXT:    movl $40040, %eax # imm = 0x9C68
854; X64-MinGW-NEXT:    callq ___chkstk_ms
855; X64-MinGW-NEXT:    subq %rax, %rsp
856; X64-MinGW-NEXT:    .seh_stackalloc 40040
857; X64-MinGW-NEXT:    .seh_endprologue
858; X64-MinGW-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
859; X64-MinGW-NEXT:    movl $3, %edx
860; X64-MinGW-NEXT:    callq dummy_use
861; X64-MinGW-NEXT:    nop
862; X64-MinGW-NEXT:    addq $40040, %rsp # imm = 0x9C68
863; X64-MinGW-NEXT:    retq
864; X64-MinGW-NEXT:  .LBB2_1:
865; X64-MinGW-NEXT:    movl $40040, %r10d # imm = 0x9C68
866; X64-MinGW-NEXT:    movl $32, %r11d
867; X64-MinGW-NEXT:    callq __morestack
868; X64-MinGW-NEXT:    retq
869; X64-MinGW-NEXT:    jmp .LBB2_2
870; X64-MinGW-NEXT:    .seh_endproc
871        %mem = alloca i32, i32 10000
872        call void @dummy_use (ptr %mem, i32 3)
873        ret void
874}
875
876define fastcc void @test_fastcc() #0 {
877; X86-Linux-LABEL: test_fastcc:
878; X86-Linux:       # %bb.0:
879; X86-Linux-NEXT:    cmpl %gs:48, %esp
880; X86-Linux-NEXT:    jbe .LBB3_1
881; X86-Linux-NEXT:  .LBB3_2:
882; X86-Linux-NEXT:    subl $52, %esp
883; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 52
884; X86-Linux-NEXT:    leal {{[0-9]+}}(%esp), %eax
885; X86-Linux-NEXT:    pushl $10
886; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
887; X86-Linux-NEXT:    pushl %eax
888; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
889; X86-Linux-NEXT:    calll dummy_use@PLT
890; X86-Linux-NEXT:    addl $60, %esp
891; X86-Linux-NEXT:    .cfi_adjust_cfa_offset -60
892; X86-Linux-NEXT:    retl
893; X86-Linux-NEXT:  .LBB3_1:
894; X86-Linux-NEXT:    pushl $0
895; X86-Linux-NEXT:    pushl $44
896; X86-Linux-NEXT:    calll __morestack
897; X86-Linux-NEXT:    retl
898; X86-Linux-NEXT:    jmp .LBB3_2
899;
900; X64-Linux-LABEL: test_fastcc:
901; X64-Linux:       # %bb.0:
902; X64-Linux-NEXT:    cmpq %fs:112, %rsp
903; X64-Linux-NEXT:    jbe .LBB3_1
904; X64-Linux-NEXT:  .LBB3_2:
905; X64-Linux-NEXT:    subq $40, %rsp
906; X64-Linux-NEXT:    .cfi_def_cfa_offset 48
907; X64-Linux-NEXT:    movq %rsp, %rdi
908; X64-Linux-NEXT:    movl $10, %esi
909; X64-Linux-NEXT:    callq dummy_use@PLT
910; X64-Linux-NEXT:    addq $40, %rsp
911; X64-Linux-NEXT:    .cfi_def_cfa_offset 8
912; X64-Linux-NEXT:    retq
913; X64-Linux-NEXT:  .LBB3_1:
914; X64-Linux-NEXT:    movl $40, %r10d
915; X64-Linux-NEXT:    movl $0, %r11d
916; X64-Linux-NEXT:    callq __morestack
917; X64-Linux-NEXT:    retq
918; X64-Linux-NEXT:    jmp .LBB3_2
919;
920; X64-Linux-Large-LABEL: test_fastcc:
921; X64-Linux-Large:       # %bb.0:
922; X64-Linux-Large-NEXT:    cmpq %fs:112, %rsp
923; X64-Linux-Large-NEXT:    jbe .LBB3_1
924; X64-Linux-Large-NEXT:  .LBB3_2:
925; X64-Linux-Large-NEXT:    subq $40, %rsp
926; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 48
927; X64-Linux-Large-NEXT:    movabsq $dummy_use, %rax
928; X64-Linux-Large-NEXT:    movq %rsp, %rdi
929; X64-Linux-Large-NEXT:    movl $10, %esi
930; X64-Linux-Large-NEXT:    callq *%rax
931; X64-Linux-Large-NEXT:    addq $40, %rsp
932; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 8
933; X64-Linux-Large-NEXT:    retq
934; X64-Linux-Large-NEXT:  .LBB3_1:
935; X64-Linux-Large-NEXT:    movl $40, %r10d
936; X64-Linux-Large-NEXT:    movl $0, %r11d
937; X64-Linux-Large-NEXT:    callq *__morestack_addr(%rip)
938; X64-Linux-Large-NEXT:    retq
939; X64-Linux-Large-NEXT:    jmp .LBB3_2
940;
941; X32ABI-LABEL: test_fastcc:
942; X32ABI:       # %bb.0:
943; X32ABI-NEXT:    cmpl %fs:64, %esp
944; X32ABI-NEXT:    jbe .LBB3_1
945; X32ABI-NEXT:  .LBB3_2:
946; X32ABI-NEXT:    subl $40, %esp
947; X32ABI-NEXT:    .cfi_def_cfa_offset 48
948; X32ABI-NEXT:    movl %esp, %edi
949; X32ABI-NEXT:    movl $10, %esi
950; X32ABI-NEXT:    callq dummy_use@PLT
951; X32ABI-NEXT:    addl $40, %esp
952; X32ABI-NEXT:    .cfi_def_cfa_offset 8
953; X32ABI-NEXT:    retq
954; X32ABI-NEXT:  .LBB3_1:
955; X32ABI-NEXT:    movl $40, %r10d
956; X32ABI-NEXT:    movl $0, %r11d
957; X32ABI-NEXT:    callq __morestack
958; X32ABI-NEXT:    retq
959; X32ABI-NEXT:    jmp .LBB3_2
960;
961; X86-Darwin-LABEL: test_fastcc:
962; X86-Darwin:       ## %bb.0:
963; X86-Darwin-NEXT:    movl $432, %eax ## imm = 0x1B0
964; X86-Darwin-NEXT:    cmpl %gs:(%eax), %esp
965; X86-Darwin-NEXT:    jbe LBB3_1
966; X86-Darwin-NEXT:  LBB3_2:
967; X86-Darwin-NEXT:    subl $60, %esp
968; X86-Darwin-NEXT:    .cfi_def_cfa_offset 64
969; X86-Darwin-NEXT:    leal {{[0-9]+}}(%esp), %eax
970; X86-Darwin-NEXT:    movl %eax, (%esp)
971; X86-Darwin-NEXT:    movl $10, {{[0-9]+}}(%esp)
972; X86-Darwin-NEXT:    calll _dummy_use
973; X86-Darwin-NEXT:    addl $60, %esp
974; X86-Darwin-NEXT:    retl
975; X86-Darwin-NEXT:  LBB3_1:
976; X86-Darwin-NEXT:    pushl $0
977; X86-Darwin-NEXT:    pushl $60
978; X86-Darwin-NEXT:    calll ___morestack
979; X86-Darwin-NEXT:    retl
980; X86-Darwin-NEXT:    jmp LBB3_2
981;
982; X64-Darwin-LABEL: test_fastcc:
983; X64-Darwin:       ## %bb.0:
984; X64-Darwin-NEXT:    cmpq %gs:816, %rsp
985; X64-Darwin-NEXT:    jbe LBB3_1
986; X64-Darwin-NEXT:  LBB3_2:
987; X64-Darwin-NEXT:    subq $40, %rsp
988; X64-Darwin-NEXT:    .cfi_def_cfa_offset 48
989; X64-Darwin-NEXT:    movq %rsp, %rdi
990; X64-Darwin-NEXT:    movl $10, %esi
991; X64-Darwin-NEXT:    callq _dummy_use
992; X64-Darwin-NEXT:    addq $40, %rsp
993; X64-Darwin-NEXT:    retq
994; X64-Darwin-NEXT:  LBB3_1:
995; X64-Darwin-NEXT:    movl $40, %r10d
996; X64-Darwin-NEXT:    movl $0, %r11d
997; X64-Darwin-NEXT:    callq ___morestack
998; X64-Darwin-NEXT:    retq
999; X64-Darwin-NEXT:    jmp LBB3_2
1000;
1001; X86-MinGW-LABEL: test_fastcc:
1002; X86-MinGW:       # %bb.0:
1003; X86-MinGW-NEXT:    cmpl %fs:20, %esp
1004; X86-MinGW-NEXT:    jbe LBB3_1
1005; X86-MinGW-NEXT:  LBB3_2:
1006; X86-MinGW-NEXT:    subl $40, %esp
1007; X86-MinGW-NEXT:    .cfi_def_cfa_offset 44
1008; X86-MinGW-NEXT:    movl %esp, %eax
1009; X86-MinGW-NEXT:    pushl $10
1010; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
1011; X86-MinGW-NEXT:    pushl %eax
1012; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
1013; X86-MinGW-NEXT:    calll _dummy_use
1014; X86-MinGW-NEXT:    addl $48, %esp
1015; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset -48
1016; X86-MinGW-NEXT:    retl
1017; X86-MinGW-NEXT:  LBB3_1:
1018; X86-MinGW-NEXT:    pushl $0
1019; X86-MinGW-NEXT:    pushl $40
1020; X86-MinGW-NEXT:    calll ___morestack
1021; X86-MinGW-NEXT:    retl
1022; X86-MinGW-NEXT:    jmp LBB3_2
1023;
1024; X64-FreeBSD-LABEL: test_fastcc:
1025; X64-FreeBSD:       # %bb.0:
1026; X64-FreeBSD-NEXT:    cmpq %fs:24, %rsp
1027; X64-FreeBSD-NEXT:    jbe .LBB3_1
1028; X64-FreeBSD-NEXT:  .LBB3_2:
1029; X64-FreeBSD-NEXT:    subq $40, %rsp
1030; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 48
1031; X64-FreeBSD-NEXT:    movq %rsp, %rdi
1032; X64-FreeBSD-NEXT:    movl $10, %esi
1033; X64-FreeBSD-NEXT:    callq dummy_use@PLT
1034; X64-FreeBSD-NEXT:    addq $40, %rsp
1035; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 8
1036; X64-FreeBSD-NEXT:    retq
1037; X64-FreeBSD-NEXT:  .LBB3_1:
1038; X64-FreeBSD-NEXT:    movl $40, %r10d
1039; X64-FreeBSD-NEXT:    movl $0, %r11d
1040; X64-FreeBSD-NEXT:    callq __morestack
1041; X64-FreeBSD-NEXT:    retq
1042; X64-FreeBSD-NEXT:    jmp .LBB3_2
1043;
1044; X86-DFlyBSD-LABEL: test_fastcc:
1045; X86-DFlyBSD:       # %bb.0:
1046; X86-DFlyBSD-NEXT:    cmpl %fs:16, %esp
1047; X86-DFlyBSD-NEXT:    jbe .LBB3_1
1048; X86-DFlyBSD-NEXT:  .LBB3_2:
1049; X86-DFlyBSD-NEXT:    subl $40, %esp
1050; X86-DFlyBSD-NEXT:    .cfi_def_cfa_offset 44
1051; X86-DFlyBSD-NEXT:    movl %esp, %eax
1052; X86-DFlyBSD-NEXT:    pushl $10
1053; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
1054; X86-DFlyBSD-NEXT:    pushl %eax
1055; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
1056; X86-DFlyBSD-NEXT:    calll dummy_use@PLT
1057; X86-DFlyBSD-NEXT:    addl $48, %esp
1058; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset -48
1059; X86-DFlyBSD-NEXT:    retl
1060; X86-DFlyBSD-NEXT:  .LBB3_1:
1061; X86-DFlyBSD-NEXT:    pushl $0
1062; X86-DFlyBSD-NEXT:    pushl $40
1063; X86-DFlyBSD-NEXT:    calll __morestack
1064; X86-DFlyBSD-NEXT:    retl
1065; X86-DFlyBSD-NEXT:    jmp .LBB3_2
1066;
1067; X64-DFlyBSD-LABEL: test_fastcc:
1068; X64-DFlyBSD:       # %bb.0:
1069; X64-DFlyBSD-NEXT:    cmpq %fs:32, %rsp
1070; X64-DFlyBSD-NEXT:    jbe .LBB3_1
1071; X64-DFlyBSD-NEXT:  .LBB3_2:
1072; X64-DFlyBSD-NEXT:    subq $40, %rsp
1073; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 48
1074; X64-DFlyBSD-NEXT:    movq %rsp, %rdi
1075; X64-DFlyBSD-NEXT:    movl $10, %esi
1076; X64-DFlyBSD-NEXT:    callq dummy_use@PLT
1077; X64-DFlyBSD-NEXT:    addq $40, %rsp
1078; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 8
1079; X64-DFlyBSD-NEXT:    retq
1080; X64-DFlyBSD-NEXT:  .LBB3_1:
1081; X64-DFlyBSD-NEXT:    movl $40, %r10d
1082; X64-DFlyBSD-NEXT:    movl $0, %r11d
1083; X64-DFlyBSD-NEXT:    callq __morestack
1084; X64-DFlyBSD-NEXT:    retq
1085; X64-DFlyBSD-NEXT:    jmp .LBB3_2
1086;
1087; X64-MinGW-LABEL: test_fastcc:
1088; X64-MinGW:       # %bb.0:
1089; X64-MinGW-NEXT:    cmpq %gs:40, %rsp
1090; X64-MinGW-NEXT:    jbe .LBB3_1
1091; X64-MinGW-NEXT:  .LBB3_2:
1092; X64-MinGW-NEXT:    subq $72, %rsp
1093; X64-MinGW-NEXT:    .seh_stackalloc 72
1094; X64-MinGW-NEXT:    .seh_endprologue
1095; X64-MinGW-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
1096; X64-MinGW-NEXT:    movl $10, %edx
1097; X64-MinGW-NEXT:    callq dummy_use
1098; X64-MinGW-NEXT:    nop
1099; X64-MinGW-NEXT:    addq $72, %rsp
1100; X64-MinGW-NEXT:    retq
1101; X64-MinGW-NEXT:  .LBB3_1:
1102; X64-MinGW-NEXT:    movl $72, %r10d
1103; X64-MinGW-NEXT:    movl $32, %r11d
1104; X64-MinGW-NEXT:    callq __morestack
1105; X64-MinGW-NEXT:    retq
1106; X64-MinGW-NEXT:    jmp .LBB3_2
1107; X64-MinGW-NEXT:    .seh_endproc
1108        %mem = alloca i32, i32 10
1109        call void @dummy_use (ptr %mem, i32 10)
1110        ret void
1111}
1112
1113define fastcc void @test_fastcc_large() #0 {
1114; X86-Linux-LABEL: test_fastcc_large:
1115; X86-Linux:       # %bb.0:
1116; X86-Linux-NEXT:    leal -{{[0-9]+}}(%esp), %eax
1117; X86-Linux-NEXT:    cmpl %gs:48, %eax
1118; X86-Linux-NEXT:    jbe .LBB4_1
1119; X86-Linux-NEXT:  .LBB4_2:
1120; X86-Linux-NEXT:    subl $40020, %esp # imm = 0x9C54
1121; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 40020
1122; X86-Linux-NEXT:    leal {{[0-9]+}}(%esp), %eax
1123; X86-Linux-NEXT:    pushl $3
1124; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
1125; X86-Linux-NEXT:    pushl %eax
1126; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
1127; X86-Linux-NEXT:    calll dummy_use@PLT
1128; X86-Linux-NEXT:    addl $40028, %esp # imm = 0x9C5C
1129; X86-Linux-NEXT:    .cfi_adjust_cfa_offset -40028
1130; X86-Linux-NEXT:    retl
1131; X86-Linux-NEXT:  .LBB4_1:
1132; X86-Linux-NEXT:    pushl $0
1133; X86-Linux-NEXT:    pushl $40012 # imm = 0x9C4C
1134; X86-Linux-NEXT:    calll __morestack
1135; X86-Linux-NEXT:    retl
1136; X86-Linux-NEXT:    jmp .LBB4_2
1137;
1138; X64-Linux-LABEL: test_fastcc_large:
1139; X64-Linux:       # %bb.0:
1140; X64-Linux-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1141; X64-Linux-NEXT:    cmpq %fs:112, %r11
1142; X64-Linux-NEXT:    jbe .LBB4_1
1143; X64-Linux-NEXT:  .LBB4_2:
1144; X64-Linux-NEXT:    subq $40008, %rsp # imm = 0x9C48
1145; X64-Linux-NEXT:    .cfi_def_cfa_offset 40016
1146; X64-Linux-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
1147; X64-Linux-NEXT:    movl $3, %esi
1148; X64-Linux-NEXT:    callq dummy_use@PLT
1149; X64-Linux-NEXT:    addq $40008, %rsp # imm = 0x9C48
1150; X64-Linux-NEXT:    .cfi_def_cfa_offset 8
1151; X64-Linux-NEXT:    retq
1152; X64-Linux-NEXT:  .LBB4_1:
1153; X64-Linux-NEXT:    movl $40008, %r10d # imm = 0x9C48
1154; X64-Linux-NEXT:    movl $0, %r11d
1155; X64-Linux-NEXT:    callq __morestack
1156; X64-Linux-NEXT:    retq
1157; X64-Linux-NEXT:    jmp .LBB4_2
1158;
1159; X64-Linux-Large-LABEL: test_fastcc_large:
1160; X64-Linux-Large:       # %bb.0:
1161; X64-Linux-Large-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1162; X64-Linux-Large-NEXT:    cmpq %fs:112, %r11
1163; X64-Linux-Large-NEXT:    jbe .LBB4_1
1164; X64-Linux-Large-NEXT:  .LBB4_2:
1165; X64-Linux-Large-NEXT:    subq $40008, %rsp # imm = 0x9C48
1166; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 40016
1167; X64-Linux-Large-NEXT:    movabsq $dummy_use, %rax
1168; X64-Linux-Large-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
1169; X64-Linux-Large-NEXT:    movl $3, %esi
1170; X64-Linux-Large-NEXT:    callq *%rax
1171; X64-Linux-Large-NEXT:    addq $40008, %rsp # imm = 0x9C48
1172; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 8
1173; X64-Linux-Large-NEXT:    retq
1174; X64-Linux-Large-NEXT:  .LBB4_1:
1175; X64-Linux-Large-NEXT:    movl $40008, %r10d # imm = 0x9C48
1176; X64-Linux-Large-NEXT:    movl $0, %r11d
1177; X64-Linux-Large-NEXT:    callq *__morestack_addr(%rip)
1178; X64-Linux-Large-NEXT:    retq
1179; X64-Linux-Large-NEXT:    jmp .LBB4_2
1180;
1181; X32ABI-LABEL: test_fastcc_large:
1182; X32ABI:       # %bb.0:
1183; X32ABI-NEXT:    leal -{{[0-9]+}}(%rsp), %r11d
1184; X32ABI-NEXT:    cmpl %fs:64, %r11d
1185; X32ABI-NEXT:    jbe .LBB4_1
1186; X32ABI-NEXT:  .LBB4_2:
1187; X32ABI-NEXT:    subl $40008, %esp # imm = 0x9C48
1188; X32ABI-NEXT:    .cfi_def_cfa_offset 40016
1189; X32ABI-NEXT:    leal {{[0-9]+}}(%rsp), %edi
1190; X32ABI-NEXT:    movl $3, %esi
1191; X32ABI-NEXT:    callq dummy_use@PLT
1192; X32ABI-NEXT:    addl $40008, %esp # imm = 0x9C48
1193; X32ABI-NEXT:    .cfi_def_cfa_offset 8
1194; X32ABI-NEXT:    retq
1195; X32ABI-NEXT:  .LBB4_1:
1196; X32ABI-NEXT:    movl $40008, %r10d # imm = 0x9C48
1197; X32ABI-NEXT:    movl $0, %r11d
1198; X32ABI-NEXT:    callq __morestack
1199; X32ABI-NEXT:    retq
1200; X32ABI-NEXT:    jmp .LBB4_2
1201;
1202; X86-Darwin-LABEL: test_fastcc_large:
1203; X86-Darwin:       ## %bb.0:
1204; X86-Darwin-NEXT:    leal -{{[0-9]+}}(%esp), %eax
1205; X86-Darwin-NEXT:    movl $432, %ecx ## imm = 0x1B0
1206; X86-Darwin-NEXT:    cmpl %gs:(%ecx), %eax
1207; X86-Darwin-NEXT:    jbe LBB4_1
1208; X86-Darwin-NEXT:  LBB4_2:
1209; X86-Darwin-NEXT:    subl $40012, %esp ## imm = 0x9C4C
1210; X86-Darwin-NEXT:    .cfi_def_cfa_offset 40016
1211; X86-Darwin-NEXT:    leal {{[0-9]+}}(%esp), %eax
1212; X86-Darwin-NEXT:    movl %eax, (%esp)
1213; X86-Darwin-NEXT:    movl $3, {{[0-9]+}}(%esp)
1214; X86-Darwin-NEXT:    calll _dummy_use
1215; X86-Darwin-NEXT:    addl $40012, %esp ## imm = 0x9C4C
1216; X86-Darwin-NEXT:    retl
1217; X86-Darwin-NEXT:  LBB4_1:
1218; X86-Darwin-NEXT:    pushl $0
1219; X86-Darwin-NEXT:    pushl $40012 ## imm = 0x9C4C
1220; X86-Darwin-NEXT:    calll ___morestack
1221; X86-Darwin-NEXT:    retl
1222; X86-Darwin-NEXT:    jmp LBB4_2
1223;
1224; X64-Darwin-LABEL: test_fastcc_large:
1225; X64-Darwin:       ## %bb.0:
1226; X64-Darwin-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1227; X64-Darwin-NEXT:    cmpq %gs:816, %r11
1228; X64-Darwin-NEXT:    jbe LBB4_1
1229; X64-Darwin-NEXT:  LBB4_2:
1230; X64-Darwin-NEXT:    subq $40008, %rsp ## imm = 0x9C48
1231; X64-Darwin-NEXT:    .cfi_def_cfa_offset 40016
1232; X64-Darwin-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
1233; X64-Darwin-NEXT:    movl $3, %esi
1234; X64-Darwin-NEXT:    callq _dummy_use
1235; X64-Darwin-NEXT:    addq $40008, %rsp ## imm = 0x9C48
1236; X64-Darwin-NEXT:    retq
1237; X64-Darwin-NEXT:  LBB4_1:
1238; X64-Darwin-NEXT:    movl $40008, %r10d ## imm = 0x9C48
1239; X64-Darwin-NEXT:    movl $0, %r11d
1240; X64-Darwin-NEXT:    callq ___morestack
1241; X64-Darwin-NEXT:    retq
1242; X64-Darwin-NEXT:    jmp LBB4_2
1243;
1244; X86-MinGW-LABEL: test_fastcc_large:
1245; X86-MinGW:       # %bb.0:
1246; X86-MinGW-NEXT:    leal -{{[0-9]+}}(%esp), %eax
1247; X86-MinGW-NEXT:    cmpl %fs:20, %eax
1248; X86-MinGW-NEXT:    jbe LBB4_1
1249; X86-MinGW-NEXT:  LBB4_2:
1250; X86-MinGW-NEXT:    movl $40000, %eax # imm = 0x9C40
1251; X86-MinGW-NEXT:    calll __alloca
1252; X86-MinGW-NEXT:    .cfi_def_cfa_offset 40004
1253; X86-MinGW-NEXT:    movl %esp, %eax
1254; X86-MinGW-NEXT:    pushl $3
1255; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
1256; X86-MinGW-NEXT:    pushl %eax
1257; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
1258; X86-MinGW-NEXT:    calll _dummy_use
1259; X86-MinGW-NEXT:    addl $40008, %esp # imm = 0x9C48
1260; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset -40008
1261; X86-MinGW-NEXT:    retl
1262; X86-MinGW-NEXT:  LBB4_1:
1263; X86-MinGW-NEXT:    pushl $0
1264; X86-MinGW-NEXT:    pushl $40000 # imm = 0x9C40
1265; X86-MinGW-NEXT:    calll ___morestack
1266; X86-MinGW-NEXT:    retl
1267; X86-MinGW-NEXT:    jmp LBB4_2
1268;
1269; X64-FreeBSD-LABEL: test_fastcc_large:
1270; X64-FreeBSD:       # %bb.0:
1271; X64-FreeBSD-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1272; X64-FreeBSD-NEXT:    cmpq %fs:24, %r11
1273; X64-FreeBSD-NEXT:    jbe .LBB4_1
1274; X64-FreeBSD-NEXT:  .LBB4_2:
1275; X64-FreeBSD-NEXT:    subq $40008, %rsp # imm = 0x9C48
1276; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 40016
1277; X64-FreeBSD-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
1278; X64-FreeBSD-NEXT:    movl $3, %esi
1279; X64-FreeBSD-NEXT:    callq dummy_use@PLT
1280; X64-FreeBSD-NEXT:    addq $40008, %rsp # imm = 0x9C48
1281; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 8
1282; X64-FreeBSD-NEXT:    retq
1283; X64-FreeBSD-NEXT:  .LBB4_1:
1284; X64-FreeBSD-NEXT:    movl $40008, %r10d # imm = 0x9C48
1285; X64-FreeBSD-NEXT:    movl $0, %r11d
1286; X64-FreeBSD-NEXT:    callq __morestack
1287; X64-FreeBSD-NEXT:    retq
1288; X64-FreeBSD-NEXT:    jmp .LBB4_2
1289;
1290; X86-DFlyBSD-LABEL: test_fastcc_large:
1291; X86-DFlyBSD:       # %bb.0:
1292; X86-DFlyBSD-NEXT:    leal -{{[0-9]+}}(%esp), %eax
1293; X86-DFlyBSD-NEXT:    cmpl %fs:16, %eax
1294; X86-DFlyBSD-NEXT:    jbe .LBB4_1
1295; X86-DFlyBSD-NEXT:  .LBB4_2:
1296; X86-DFlyBSD-NEXT:    subl $40000, %esp # imm = 0x9C40
1297; X86-DFlyBSD-NEXT:    .cfi_def_cfa_offset 40004
1298; X86-DFlyBSD-NEXT:    movl %esp, %eax
1299; X86-DFlyBSD-NEXT:    pushl $3
1300; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
1301; X86-DFlyBSD-NEXT:    pushl %eax
1302; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
1303; X86-DFlyBSD-NEXT:    calll dummy_use@PLT
1304; X86-DFlyBSD-NEXT:    addl $40008, %esp # imm = 0x9C48
1305; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset -40008
1306; X86-DFlyBSD-NEXT:    retl
1307; X86-DFlyBSD-NEXT:  .LBB4_1:
1308; X86-DFlyBSD-NEXT:    pushl $0
1309; X86-DFlyBSD-NEXT:    pushl $40000 # imm = 0x9C40
1310; X86-DFlyBSD-NEXT:    calll __morestack
1311; X86-DFlyBSD-NEXT:    retl
1312; X86-DFlyBSD-NEXT:    jmp .LBB4_2
1313;
1314; X64-DFlyBSD-LABEL: test_fastcc_large:
1315; X64-DFlyBSD:       # %bb.0:
1316; X64-DFlyBSD-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1317; X64-DFlyBSD-NEXT:    cmpq %fs:32, %r11
1318; X64-DFlyBSD-NEXT:    jbe .LBB4_1
1319; X64-DFlyBSD-NEXT:  .LBB4_2:
1320; X64-DFlyBSD-NEXT:    subq $40008, %rsp # imm = 0x9C48
1321; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 40016
1322; X64-DFlyBSD-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
1323; X64-DFlyBSD-NEXT:    movl $3, %esi
1324; X64-DFlyBSD-NEXT:    callq dummy_use@PLT
1325; X64-DFlyBSD-NEXT:    addq $40008, %rsp # imm = 0x9C48
1326; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 8
1327; X64-DFlyBSD-NEXT:    retq
1328; X64-DFlyBSD-NEXT:  .LBB4_1:
1329; X64-DFlyBSD-NEXT:    movl $40008, %r10d # imm = 0x9C48
1330; X64-DFlyBSD-NEXT:    movl $0, %r11d
1331; X64-DFlyBSD-NEXT:    callq __morestack
1332; X64-DFlyBSD-NEXT:    retq
1333; X64-DFlyBSD-NEXT:    jmp .LBB4_2
1334;
1335; X64-MinGW-LABEL: test_fastcc_large:
1336; X64-MinGW:       # %bb.0:
1337; X64-MinGW-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1338; X64-MinGW-NEXT:    cmpq %gs:40, %r11
1339; X64-MinGW-NEXT:    jbe .LBB4_1
1340; X64-MinGW-NEXT:  .LBB4_2:
1341; X64-MinGW-NEXT:    movl $40040, %eax # imm = 0x9C68
1342; X64-MinGW-NEXT:    callq ___chkstk_ms
1343; X64-MinGW-NEXT:    subq %rax, %rsp
1344; X64-MinGW-NEXT:    .seh_stackalloc 40040
1345; X64-MinGW-NEXT:    .seh_endprologue
1346; X64-MinGW-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
1347; X64-MinGW-NEXT:    movl $3, %edx
1348; X64-MinGW-NEXT:    callq dummy_use
1349; X64-MinGW-NEXT:    nop
1350; X64-MinGW-NEXT:    addq $40040, %rsp # imm = 0x9C68
1351; X64-MinGW-NEXT:    retq
1352; X64-MinGW-NEXT:  .LBB4_1:
1353; X64-MinGW-NEXT:    movl $40040, %r10d # imm = 0x9C68
1354; X64-MinGW-NEXT:    movl $32, %r11d
1355; X64-MinGW-NEXT:    callq __morestack
1356; X64-MinGW-NEXT:    retq
1357; X64-MinGW-NEXT:    jmp .LBB4_2
1358; X64-MinGW-NEXT:    .seh_endproc
1359        %mem = alloca i32, i32 10000
1360        call void @dummy_use (ptr %mem, i32 3)
1361        ret void
1362}
1363
1364; This is testing that the Mac implementation preserves ecx
1365
1366define fastcc void @test_fastcc_large_with_ecx_arg(i32 %a) #0 {
1367; X86-Linux-LABEL: test_fastcc_large_with_ecx_arg:
1368; X86-Linux:       # %bb.0:
1369; X86-Linux-NEXT:    leal -{{[0-9]+}}(%esp), %eax
1370; X86-Linux-NEXT:    cmpl %gs:48, %eax
1371; X86-Linux-NEXT:    jbe .LBB5_1
1372; X86-Linux-NEXT:  .LBB5_2:
1373; X86-Linux-NEXT:    subl $40020, %esp # imm = 0x9C54
1374; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 40020
1375; X86-Linux-NEXT:    leal {{[0-9]+}}(%esp), %eax
1376; X86-Linux-NEXT:    pushl %ecx
1377; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
1378; X86-Linux-NEXT:    pushl %eax
1379; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
1380; X86-Linux-NEXT:    calll dummy_use@PLT
1381; X86-Linux-NEXT:    addl $40028, %esp # imm = 0x9C5C
1382; X86-Linux-NEXT:    .cfi_adjust_cfa_offset -40028
1383; X86-Linux-NEXT:    retl
1384; X86-Linux-NEXT:  .LBB5_1:
1385; X86-Linux-NEXT:    pushl $0
1386; X86-Linux-NEXT:    pushl $40012 # imm = 0x9C4C
1387; X86-Linux-NEXT:    calll __morestack
1388; X86-Linux-NEXT:    retl
1389; X86-Linux-NEXT:    jmp .LBB5_2
1390;
1391; X64-Linux-LABEL: test_fastcc_large_with_ecx_arg:
1392; X64-Linux:       # %bb.0:
1393; X64-Linux-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1394; X64-Linux-NEXT:    cmpq %fs:112, %r11
1395; X64-Linux-NEXT:    jbe .LBB5_1
1396; X64-Linux-NEXT:  .LBB5_2:
1397; X64-Linux-NEXT:    subq $40008, %rsp # imm = 0x9C48
1398; X64-Linux-NEXT:    .cfi_def_cfa_offset 40016
1399; X64-Linux-NEXT:    movl %edi, %esi
1400; X64-Linux-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
1401; X64-Linux-NEXT:    callq dummy_use@PLT
1402; X64-Linux-NEXT:    addq $40008, %rsp # imm = 0x9C48
1403; X64-Linux-NEXT:    .cfi_def_cfa_offset 8
1404; X64-Linux-NEXT:    retq
1405; X64-Linux-NEXT:  .LBB5_1:
1406; X64-Linux-NEXT:    movl $40008, %r10d # imm = 0x9C48
1407; X64-Linux-NEXT:    movl $0, %r11d
1408; X64-Linux-NEXT:    callq __morestack
1409; X64-Linux-NEXT:    retq
1410; X64-Linux-NEXT:    jmp .LBB5_2
1411;
1412; X64-Linux-Large-LABEL: test_fastcc_large_with_ecx_arg:
1413; X64-Linux-Large:       # %bb.0:
1414; X64-Linux-Large-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1415; X64-Linux-Large-NEXT:    cmpq %fs:112, %r11
1416; X64-Linux-Large-NEXT:    jbe .LBB5_1
1417; X64-Linux-Large-NEXT:  .LBB5_2:
1418; X64-Linux-Large-NEXT:    subq $40008, %rsp # imm = 0x9C48
1419; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 40016
1420; X64-Linux-Large-NEXT:    movl %edi, %esi
1421; X64-Linux-Large-NEXT:    movabsq $dummy_use, %rax
1422; X64-Linux-Large-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
1423; X64-Linux-Large-NEXT:    callq *%rax
1424; X64-Linux-Large-NEXT:    addq $40008, %rsp # imm = 0x9C48
1425; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 8
1426; X64-Linux-Large-NEXT:    retq
1427; X64-Linux-Large-NEXT:  .LBB5_1:
1428; X64-Linux-Large-NEXT:    movl $40008, %r10d # imm = 0x9C48
1429; X64-Linux-Large-NEXT:    movl $0, %r11d
1430; X64-Linux-Large-NEXT:    callq *__morestack_addr(%rip)
1431; X64-Linux-Large-NEXT:    retq
1432; X64-Linux-Large-NEXT:    jmp .LBB5_2
1433;
1434; X32ABI-LABEL: test_fastcc_large_with_ecx_arg:
1435; X32ABI:       # %bb.0:
1436; X32ABI-NEXT:    leal -{{[0-9]+}}(%rsp), %r11d
1437; X32ABI-NEXT:    cmpl %fs:64, %r11d
1438; X32ABI-NEXT:    jbe .LBB5_1
1439; X32ABI-NEXT:  .LBB5_2:
1440; X32ABI-NEXT:    subl $40008, %esp # imm = 0x9C48
1441; X32ABI-NEXT:    .cfi_def_cfa_offset 40016
1442; X32ABI-NEXT:    movl %edi, %esi
1443; X32ABI-NEXT:    leal {{[0-9]+}}(%rsp), %edi
1444; X32ABI-NEXT:    callq dummy_use@PLT
1445; X32ABI-NEXT:    addl $40008, %esp # imm = 0x9C48
1446; X32ABI-NEXT:    .cfi_def_cfa_offset 8
1447; X32ABI-NEXT:    retq
1448; X32ABI-NEXT:  .LBB5_1:
1449; X32ABI-NEXT:    movl $40008, %r10d # imm = 0x9C48
1450; X32ABI-NEXT:    movl $0, %r11d
1451; X32ABI-NEXT:    callq __morestack
1452; X32ABI-NEXT:    retq
1453; X32ABI-NEXT:    jmp .LBB5_2
1454;
1455; X86-Darwin-LABEL: test_fastcc_large_with_ecx_arg:
1456; X86-Darwin:       ## %bb.0:
1457; X86-Darwin-NEXT:    leal -{{[0-9]+}}(%esp), %eax
1458; X86-Darwin-NEXT:    pushl %ecx
1459; X86-Darwin-NEXT:    movl $432, %ecx ## imm = 0x1B0
1460; X86-Darwin-NEXT:    cmpl %gs:(%ecx), %eax
1461; X86-Darwin-NEXT:    popl %ecx
1462; X86-Darwin-NEXT:    jbe LBB5_1
1463; X86-Darwin-NEXT:  LBB5_2:
1464; X86-Darwin-NEXT:    subl $40012, %esp ## imm = 0x9C4C
1465; X86-Darwin-NEXT:    .cfi_def_cfa_offset 40016
1466; X86-Darwin-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
1467; X86-Darwin-NEXT:    leal {{[0-9]+}}(%esp), %eax
1468; X86-Darwin-NEXT:    movl %eax, (%esp)
1469; X86-Darwin-NEXT:    calll _dummy_use
1470; X86-Darwin-NEXT:    addl $40012, %esp ## imm = 0x9C4C
1471; X86-Darwin-NEXT:    retl
1472; X86-Darwin-NEXT:  LBB5_1:
1473; X86-Darwin-NEXT:    pushl $0
1474; X86-Darwin-NEXT:    pushl $40012 ## imm = 0x9C4C
1475; X86-Darwin-NEXT:    calll ___morestack
1476; X86-Darwin-NEXT:    retl
1477; X86-Darwin-NEXT:    jmp LBB5_2
1478;
1479; X64-Darwin-LABEL: test_fastcc_large_with_ecx_arg:
1480; X64-Darwin:       ## %bb.0:
1481; X64-Darwin-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1482; X64-Darwin-NEXT:    cmpq %gs:816, %r11
1483; X64-Darwin-NEXT:    jbe LBB5_1
1484; X64-Darwin-NEXT:  LBB5_2:
1485; X64-Darwin-NEXT:    subq $40008, %rsp ## imm = 0x9C48
1486; X64-Darwin-NEXT:    .cfi_def_cfa_offset 40016
1487; X64-Darwin-NEXT:    movl %edi, %esi
1488; X64-Darwin-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
1489; X64-Darwin-NEXT:    callq _dummy_use
1490; X64-Darwin-NEXT:    addq $40008, %rsp ## imm = 0x9C48
1491; X64-Darwin-NEXT:    retq
1492; X64-Darwin-NEXT:  LBB5_1:
1493; X64-Darwin-NEXT:    movl $40008, %r10d ## imm = 0x9C48
1494; X64-Darwin-NEXT:    movl $0, %r11d
1495; X64-Darwin-NEXT:    callq ___morestack
1496; X64-Darwin-NEXT:    retq
1497; X64-Darwin-NEXT:    jmp LBB5_2
1498;
1499; X86-MinGW-LABEL: test_fastcc_large_with_ecx_arg:
1500; X86-MinGW:       # %bb.0:
1501; X86-MinGW-NEXT:    leal -{{[0-9]+}}(%esp), %eax
1502; X86-MinGW-NEXT:    cmpl %fs:20, %eax
1503; X86-MinGW-NEXT:    jbe LBB5_1
1504; X86-MinGW-NEXT:  LBB5_2:
1505; X86-MinGW-NEXT:    movl $40000, %eax # imm = 0x9C40
1506; X86-MinGW-NEXT:    calll __alloca
1507; X86-MinGW-NEXT:    .cfi_def_cfa_offset 40004
1508; X86-MinGW-NEXT:    movl %esp, %eax
1509; X86-MinGW-NEXT:    pushl %ecx
1510; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
1511; X86-MinGW-NEXT:    pushl %eax
1512; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
1513; X86-MinGW-NEXT:    calll _dummy_use
1514; X86-MinGW-NEXT:    addl $40008, %esp # imm = 0x9C48
1515; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset -40008
1516; X86-MinGW-NEXT:    retl
1517; X86-MinGW-NEXT:  LBB5_1:
1518; X86-MinGW-NEXT:    pushl $0
1519; X86-MinGW-NEXT:    pushl $40000 # imm = 0x9C40
1520; X86-MinGW-NEXT:    calll ___morestack
1521; X86-MinGW-NEXT:    retl
1522; X86-MinGW-NEXT:    jmp LBB5_2
1523;
1524; X64-FreeBSD-LABEL: test_fastcc_large_with_ecx_arg:
1525; X64-FreeBSD:       # %bb.0:
1526; X64-FreeBSD-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1527; X64-FreeBSD-NEXT:    cmpq %fs:24, %r11
1528; X64-FreeBSD-NEXT:    jbe .LBB5_1
1529; X64-FreeBSD-NEXT:  .LBB5_2:
1530; X64-FreeBSD-NEXT:    subq $40008, %rsp # imm = 0x9C48
1531; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 40016
1532; X64-FreeBSD-NEXT:    movl %edi, %esi
1533; X64-FreeBSD-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
1534; X64-FreeBSD-NEXT:    callq dummy_use@PLT
1535; X64-FreeBSD-NEXT:    addq $40008, %rsp # imm = 0x9C48
1536; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 8
1537; X64-FreeBSD-NEXT:    retq
1538; X64-FreeBSD-NEXT:  .LBB5_1:
1539; X64-FreeBSD-NEXT:    movl $40008, %r10d # imm = 0x9C48
1540; X64-FreeBSD-NEXT:    movl $0, %r11d
1541; X64-FreeBSD-NEXT:    callq __morestack
1542; X64-FreeBSD-NEXT:    retq
1543; X64-FreeBSD-NEXT:    jmp .LBB5_2
1544;
1545; X86-DFlyBSD-LABEL: test_fastcc_large_with_ecx_arg:
1546; X86-DFlyBSD:       # %bb.0:
1547; X86-DFlyBSD-NEXT:    leal -{{[0-9]+}}(%esp), %eax
1548; X86-DFlyBSD-NEXT:    cmpl %fs:16, %eax
1549; X86-DFlyBSD-NEXT:    jbe .LBB5_1
1550; X86-DFlyBSD-NEXT:  .LBB5_2:
1551; X86-DFlyBSD-NEXT:    subl $40000, %esp # imm = 0x9C40
1552; X86-DFlyBSD-NEXT:    .cfi_def_cfa_offset 40004
1553; X86-DFlyBSD-NEXT:    movl %esp, %eax
1554; X86-DFlyBSD-NEXT:    pushl %ecx
1555; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
1556; X86-DFlyBSD-NEXT:    pushl %eax
1557; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
1558; X86-DFlyBSD-NEXT:    calll dummy_use@PLT
1559; X86-DFlyBSD-NEXT:    addl $40008, %esp # imm = 0x9C48
1560; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset -40008
1561; X86-DFlyBSD-NEXT:    retl
1562; X86-DFlyBSD-NEXT:  .LBB5_1:
1563; X86-DFlyBSD-NEXT:    pushl $0
1564; X86-DFlyBSD-NEXT:    pushl $40000 # imm = 0x9C40
1565; X86-DFlyBSD-NEXT:    calll __morestack
1566; X86-DFlyBSD-NEXT:    retl
1567; X86-DFlyBSD-NEXT:    jmp .LBB5_2
1568;
1569; X64-DFlyBSD-LABEL: test_fastcc_large_with_ecx_arg:
1570; X64-DFlyBSD:       # %bb.0:
1571; X64-DFlyBSD-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1572; X64-DFlyBSD-NEXT:    cmpq %fs:32, %r11
1573; X64-DFlyBSD-NEXT:    jbe .LBB5_1
1574; X64-DFlyBSD-NEXT:  .LBB5_2:
1575; X64-DFlyBSD-NEXT:    subq $40008, %rsp # imm = 0x9C48
1576; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 40016
1577; X64-DFlyBSD-NEXT:    movl %edi, %esi
1578; X64-DFlyBSD-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
1579; X64-DFlyBSD-NEXT:    callq dummy_use@PLT
1580; X64-DFlyBSD-NEXT:    addq $40008, %rsp # imm = 0x9C48
1581; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 8
1582; X64-DFlyBSD-NEXT:    retq
1583; X64-DFlyBSD-NEXT:  .LBB5_1:
1584; X64-DFlyBSD-NEXT:    movl $40008, %r10d # imm = 0x9C48
1585; X64-DFlyBSD-NEXT:    movl $0, %r11d
1586; X64-DFlyBSD-NEXT:    callq __morestack
1587; X64-DFlyBSD-NEXT:    retq
1588; X64-DFlyBSD-NEXT:    jmp .LBB5_2
1589;
1590; X64-MinGW-LABEL: test_fastcc_large_with_ecx_arg:
1591; X64-MinGW:       # %bb.0:
1592; X64-MinGW-NEXT:    leaq -{{[0-9]+}}(%rsp), %r11
1593; X64-MinGW-NEXT:    cmpq %gs:40, %r11
1594; X64-MinGW-NEXT:    jbe .LBB5_1
1595; X64-MinGW-NEXT:  .LBB5_2:
1596; X64-MinGW-NEXT:    movl $40040, %eax # imm = 0x9C68
1597; X64-MinGW-NEXT:    callq ___chkstk_ms
1598; X64-MinGW-NEXT:    subq %rax, %rsp
1599; X64-MinGW-NEXT:    .seh_stackalloc 40040
1600; X64-MinGW-NEXT:    .seh_endprologue
1601; X64-MinGW-NEXT:    movl %ecx, %edx
1602; X64-MinGW-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
1603; X64-MinGW-NEXT:    callq dummy_use
1604; X64-MinGW-NEXT:    nop
1605; X64-MinGW-NEXT:    addq $40040, %rsp # imm = 0x9C68
1606; X64-MinGW-NEXT:    retq
1607; X64-MinGW-NEXT:  .LBB5_1:
1608; X64-MinGW-NEXT:    movl $40040, %r10d # imm = 0x9C68
1609; X64-MinGW-NEXT:    movl $32, %r11d
1610; X64-MinGW-NEXT:    callq __morestack
1611; X64-MinGW-NEXT:    retq
1612; X64-MinGW-NEXT:    jmp .LBB5_2
1613; X64-MinGW-NEXT:    .seh_endproc
1614        %mem = alloca i32, i32 10000
1615        call void @dummy_use (ptr %mem, i32 %a)
1616        ret void
1617}
1618
1619define void @test_nostack() #0 {
1620; X86-Linux-LABEL: test_nostack:
1621; X86-Linux:       # %bb.0:
1622; X86-Linux-NEXT:    retl
1623;
1624; X64-Linux-LABEL: test_nostack:
1625; X64-Linux:       # %bb.0:
1626; X64-Linux-NEXT:    retq
1627;
1628; X64-Linux-Large-LABEL: test_nostack:
1629; X64-Linux-Large:       # %bb.0:
1630; X64-Linux-Large-NEXT:    retq
1631;
1632; X32ABI-LABEL: test_nostack:
1633; X32ABI:       # %bb.0:
1634; X32ABI-NEXT:    retq
1635;
1636; X86-Darwin-LABEL: test_nostack:
1637; X86-Darwin:       ## %bb.0:
1638; X86-Darwin-NEXT:    retl
1639;
1640; X64-Darwin-LABEL: test_nostack:
1641; X64-Darwin:       ## %bb.0:
1642; X64-Darwin-NEXT:    retq
1643;
1644; X86-MinGW-LABEL: test_nostack:
1645; X86-MinGW:       # %bb.0:
1646; X86-MinGW-NEXT:    retl
1647;
1648; X64-FreeBSD-LABEL: test_nostack:
1649; X64-FreeBSD:       # %bb.0:
1650; X64-FreeBSD-NEXT:    retq
1651;
1652; X86-DFlyBSD-LABEL: test_nostack:
1653; X86-DFlyBSD:       # %bb.0:
1654; X86-DFlyBSD-NEXT:    retl
1655;
1656; X64-DFlyBSD-LABEL: test_nostack:
1657; X64-DFlyBSD:       # %bb.0:
1658; X64-DFlyBSD-NEXT:    retq
1659;
1660; X64-MinGW-LABEL: test_nostack:
1661; X64-MinGW:       # %bb.0:
1662; X64-MinGW-NEXT:    retq
1663	ret void
1664}
1665
1666define void @test_nosplitstck() {
1667; X86-Linux-LABEL: test_nosplitstck:
1668; X86-Linux:       # %bb.0:
1669; X86-Linux-NEXT:    retl
1670;
1671; X64-Linux-LABEL: test_nosplitstck:
1672; X64-Linux:       # %bb.0:
1673; X64-Linux-NEXT:    retq
1674;
1675; X64-Linux-Large-LABEL: test_nosplitstck:
1676; X64-Linux-Large:       # %bb.0:
1677; X64-Linux-Large-NEXT:    retq
1678;
1679; X32ABI-LABEL: test_nosplitstck:
1680; X32ABI:       # %bb.0:
1681; X32ABI-NEXT:    retq
1682;
1683; X86-Darwin-LABEL: test_nosplitstck:
1684; X86-Darwin:       ## %bb.0:
1685; X86-Darwin-NEXT:    retl
1686;
1687; X64-Darwin-LABEL: test_nosplitstck:
1688; X64-Darwin:       ## %bb.0:
1689; X64-Darwin-NEXT:    retq
1690;
1691; X86-MinGW-LABEL: test_nosplitstck:
1692; X86-MinGW:       # %bb.0:
1693; X86-MinGW-NEXT:    retl
1694;
1695; X64-FreeBSD-LABEL: test_nosplitstck:
1696; X64-FreeBSD:       # %bb.0:
1697; X64-FreeBSD-NEXT:    retq
1698;
1699; X86-DFlyBSD-LABEL: test_nosplitstck:
1700; X86-DFlyBSD:       # %bb.0:
1701; X86-DFlyBSD-NEXT:    retl
1702;
1703; X64-DFlyBSD-LABEL: test_nosplitstck:
1704; X64-DFlyBSD:       # %bb.0:
1705; X64-DFlyBSD-NEXT:    retq
1706;
1707; X64-MinGW-LABEL: test_nosplitstck:
1708; X64-MinGW:       # %bb.0:
1709; X64-MinGW-NEXT:    retq
1710	ret void
1711}
1712
1713; Test to make sure that a morestack call is generated if there is a
1714; sibling call, even if the function in question has no stack frame
1715; (PR37807).
1716
1717declare i32 @callee(i32)
1718
1719define i32 @test_sibling_call_empty_frame(i32 %x) #0 {
1720; X86-Linux-LABEL: test_sibling_call_empty_frame:
1721; X86-Linux:       # %bb.0:
1722; X86-Linux-NEXT:    cmpl %gs:48, %esp
1723; X86-Linux-NEXT:    ja callee@PLT # TAILCALL
1724; X86-Linux-NEXT:  # %bb.1:
1725; X86-Linux-NEXT:    pushl $4
1726; X86-Linux-NEXT:    pushl $0
1727; X86-Linux-NEXT:    calll __morestack
1728; X86-Linux-NEXT:    retl
1729; X86-Linux-NEXT:    jmp callee@PLT # TAILCALL
1730;
1731; X64-Linux-LABEL: test_sibling_call_empty_frame:
1732; X64-Linux:       # %bb.0:
1733; X64-Linux-NEXT:    cmpq %fs:112, %rsp
1734; X64-Linux-NEXT:    ja callee@PLT # TAILCALL
1735; X64-Linux-NEXT:  # %bb.1:
1736; X64-Linux-NEXT:    movl $0, %r10d
1737; X64-Linux-NEXT:    movl $0, %r11d
1738; X64-Linux-NEXT:    callq __morestack
1739; X64-Linux-NEXT:    retq
1740; X64-Linux-NEXT:    jmp callee@PLT # TAILCALL
1741;
1742; X64-Linux-Large-LABEL: test_sibling_call_empty_frame:
1743; X64-Linux-Large:       # %bb.0:
1744; X64-Linux-Large-NEXT:    cmpq %fs:112, %rsp
1745; X64-Linux-Large-NEXT:    jbe .LBB8_1
1746; X64-Linux-Large-NEXT:  # %bb.2:
1747; X64-Linux-Large-NEXT:    movabsq $callee, %rax
1748; X64-Linux-Large-NEXT:    jmpq *%rax # TAILCALL
1749; X64-Linux-Large-NEXT:  .LBB8_1:
1750; X64-Linux-Large-NEXT:    movl $0, %r10d
1751; X64-Linux-Large-NEXT:    movl $0, %r11d
1752; X64-Linux-Large-NEXT:    callq *__morestack_addr(%rip)
1753; X64-Linux-Large-NEXT:    retq
1754; X64-Linux-Large-NEXT:    movabsq $callee, %rax
1755; X64-Linux-Large-NEXT:    jmpq *%rax # TAILCALL
1756;
1757; X32ABI-LABEL: test_sibling_call_empty_frame:
1758; X32ABI:       # %bb.0:
1759; X32ABI-NEXT:    cmpl %fs:64, %esp
1760; X32ABI-NEXT:    ja callee@PLT # TAILCALL
1761; X32ABI-NEXT:  # %bb.1:
1762; X32ABI-NEXT:    movl $0, %r10d
1763; X32ABI-NEXT:    movl $0, %r11d
1764; X32ABI-NEXT:    callq __morestack
1765; X32ABI-NEXT:    retq
1766; X32ABI-NEXT:    jmp callee@PLT # TAILCALL
1767;
1768; X86-Darwin-LABEL: test_sibling_call_empty_frame:
1769; X86-Darwin:       ## %bb.0:
1770; X86-Darwin-NEXT:    movl $432, %ecx ## imm = 0x1B0
1771; X86-Darwin-NEXT:    cmpl %gs:(%ecx), %esp
1772; X86-Darwin-NEXT:    ja _callee ## TAILCALL
1773; X86-Darwin-NEXT:  ## %bb.1:
1774; X86-Darwin-NEXT:    pushl $4
1775; X86-Darwin-NEXT:    pushl $0
1776; X86-Darwin-NEXT:    calll ___morestack
1777; X86-Darwin-NEXT:    retl
1778; X86-Darwin-NEXT:    jmp _callee ## TAILCALL
1779;
1780; X64-Darwin-LABEL: test_sibling_call_empty_frame:
1781; X64-Darwin:       ## %bb.0:
1782; X64-Darwin-NEXT:    cmpq %gs:816, %rsp
1783; X64-Darwin-NEXT:    ja _callee ## TAILCALL
1784; X64-Darwin-NEXT:  ## %bb.1:
1785; X64-Darwin-NEXT:    movl $0, %r10d
1786; X64-Darwin-NEXT:    movl $0, %r11d
1787; X64-Darwin-NEXT:    callq ___morestack
1788; X64-Darwin-NEXT:    retq
1789; X64-Darwin-NEXT:    jmp _callee ## TAILCALL
1790;
1791; X86-MinGW-LABEL: test_sibling_call_empty_frame:
1792; X86-MinGW:       # %bb.0:
1793; X86-MinGW-NEXT:    cmpl %fs:20, %esp
1794; X86-MinGW-NEXT:    ja _callee # TAILCALL
1795; X86-MinGW-NEXT:  # %bb.1:
1796; X86-MinGW-NEXT:    pushl $4
1797; X86-MinGW-NEXT:    pushl $0
1798; X86-MinGW-NEXT:    calll ___morestack
1799; X86-MinGW-NEXT:    retl
1800; X86-MinGW-NEXT:    jmp _callee # TAILCALL
1801;
1802; X64-FreeBSD-LABEL: test_sibling_call_empty_frame:
1803; X64-FreeBSD:       # %bb.0:
1804; X64-FreeBSD-NEXT:    cmpq %fs:24, %rsp
1805; X64-FreeBSD-NEXT:    ja callee@PLT # TAILCALL
1806; X64-FreeBSD-NEXT:  # %bb.1:
1807; X64-FreeBSD-NEXT:    movl $0, %r10d
1808; X64-FreeBSD-NEXT:    movl $0, %r11d
1809; X64-FreeBSD-NEXT:    callq __morestack
1810; X64-FreeBSD-NEXT:    retq
1811; X64-FreeBSD-NEXT:    jmp callee@PLT # TAILCALL
1812;
1813; X86-DFlyBSD-LABEL: test_sibling_call_empty_frame:
1814; X86-DFlyBSD:       # %bb.0:
1815; X86-DFlyBSD-NEXT:    cmpl %fs:16, %esp
1816; X86-DFlyBSD-NEXT:    ja callee@PLT # TAILCALL
1817; X86-DFlyBSD-NEXT:  # %bb.1:
1818; X86-DFlyBSD-NEXT:    pushl $4
1819; X86-DFlyBSD-NEXT:    pushl $0
1820; X86-DFlyBSD-NEXT:    calll __morestack
1821; X86-DFlyBSD-NEXT:    retl
1822; X86-DFlyBSD-NEXT:    jmp callee@PLT # TAILCALL
1823;
1824; X64-DFlyBSD-LABEL: test_sibling_call_empty_frame:
1825; X64-DFlyBSD:       # %bb.0:
1826; X64-DFlyBSD-NEXT:    cmpq %fs:32, %rsp
1827; X64-DFlyBSD-NEXT:    ja callee@PLT # TAILCALL
1828; X64-DFlyBSD-NEXT:  # %bb.1:
1829; X64-DFlyBSD-NEXT:    movl $0, %r10d
1830; X64-DFlyBSD-NEXT:    movl $0, %r11d
1831; X64-DFlyBSD-NEXT:    callq __morestack
1832; X64-DFlyBSD-NEXT:    retq
1833; X64-DFlyBSD-NEXT:    jmp callee@PLT # TAILCALL
1834;
1835; X64-MinGW-LABEL: test_sibling_call_empty_frame:
1836; X64-MinGW:       # %bb.0:
1837; X64-MinGW-NEXT:    cmpq %gs:40, %rsp
1838; X64-MinGW-NEXT:    ja callee # TAILCALL
1839; X64-MinGW-NEXT:  # %bb.1:
1840; X64-MinGW-NEXT:    movl $0, %r10d
1841; X64-MinGW-NEXT:    movl $32, %r11d
1842; X64-MinGW-NEXT:    callq __morestack
1843; X64-MinGW-NEXT:    retq
1844; X64-MinGW-NEXT:    jmp callee # TAILCALL
1845  %call = tail call i32 @callee(i32 %x) #0
1846  ret i32 %call
1847}
1848
1849; Test that unused nested argument doesn't need saving/restoring.
1850
1851define i32 @test_nested_unused(ptr nest %unused) #0 {
1852; X86-Linux-LABEL: test_nested_unused:
1853; X86-Linux:       # %bb.0:
1854; X86-Linux-NEXT:    cmpl %gs:48, %esp
1855; X86-Linux-NEXT:    jbe .LBB9_1
1856; X86-Linux-NEXT:  .LBB9_2:
1857; X86-Linux-NEXT:    subl $52, %esp
1858; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 52
1859; X86-Linux-NEXT:    leal {{[0-9]+}}(%esp), %eax
1860; X86-Linux-NEXT:    pushl $10
1861; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
1862; X86-Linux-NEXT:    pushl %eax
1863; X86-Linux-NEXT:    .cfi_adjust_cfa_offset 4
1864; X86-Linux-NEXT:    calll dummy_use@PLT
1865; X86-Linux-NEXT:    addl $16, %esp
1866; X86-Linux-NEXT:    .cfi_adjust_cfa_offset -16
1867; X86-Linux-NEXT:    movl $123, %eax
1868; X86-Linux-NEXT:    addl $44, %esp
1869; X86-Linux-NEXT:    .cfi_def_cfa_offset 4
1870; X86-Linux-NEXT:    retl
1871; X86-Linux-NEXT:  .LBB9_1:
1872; X86-Linux-NEXT:    pushl $0
1873; X86-Linux-NEXT:    pushl $44
1874; X86-Linux-NEXT:    calll __morestack
1875; X86-Linux-NEXT:    retl
1876; X86-Linux-NEXT:    jmp .LBB9_2
1877;
1878; X64-Linux-LABEL: test_nested_unused:
1879; X64-Linux:       # %bb.0:
1880; X64-Linux-NEXT:    cmpq %fs:112, %rsp
1881; X64-Linux-NEXT:    jbe .LBB9_1
1882; X64-Linux-NEXT:  .LBB9_2:
1883; X64-Linux-NEXT:    subq $40, %rsp
1884; X64-Linux-NEXT:    .cfi_def_cfa_offset 48
1885; X64-Linux-NEXT:    movq %rsp, %rdi
1886; X64-Linux-NEXT:    movl $10, %esi
1887; X64-Linux-NEXT:    callq dummy_use@PLT
1888; X64-Linux-NEXT:    movl $123, %eax
1889; X64-Linux-NEXT:    addq $40, %rsp
1890; X64-Linux-NEXT:    .cfi_def_cfa_offset 8
1891; X64-Linux-NEXT:    retq
1892; X64-Linux-NEXT:  .LBB9_1:
1893; X64-Linux-NEXT:    movl $40, %r10d
1894; X64-Linux-NEXT:    movl $0, %r11d
1895; X64-Linux-NEXT:    callq __morestack
1896; X64-Linux-NEXT:    retq
1897; X64-Linux-NEXT:    jmp .LBB9_2
1898;
1899; X64-Linux-Large-LABEL: test_nested_unused:
1900; X64-Linux-Large:       # %bb.0:
1901; X64-Linux-Large-NEXT:    cmpq %fs:112, %rsp
1902; X64-Linux-Large-NEXT:    jbe .LBB9_1
1903; X64-Linux-Large-NEXT:  .LBB9_2:
1904; X64-Linux-Large-NEXT:    subq $40, %rsp
1905; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 48
1906; X64-Linux-Large-NEXT:    movabsq $dummy_use, %rax
1907; X64-Linux-Large-NEXT:    movq %rsp, %rdi
1908; X64-Linux-Large-NEXT:    movl $10, %esi
1909; X64-Linux-Large-NEXT:    callq *%rax
1910; X64-Linux-Large-NEXT:    movl $123, %eax
1911; X64-Linux-Large-NEXT:    addq $40, %rsp
1912; X64-Linux-Large-NEXT:    .cfi_def_cfa_offset 8
1913; X64-Linux-Large-NEXT:    retq
1914; X64-Linux-Large-NEXT:  .LBB9_1:
1915; X64-Linux-Large-NEXT:    movl $40, %r10d
1916; X64-Linux-Large-NEXT:    movl $0, %r11d
1917; X64-Linux-Large-NEXT:    callq *__morestack_addr(%rip)
1918; X64-Linux-Large-NEXT:    retq
1919; X64-Linux-Large-NEXT:    jmp .LBB9_2
1920;
1921; X32ABI-LABEL: test_nested_unused:
1922; X32ABI:       # %bb.0:
1923; X32ABI-NEXT:    cmpl %fs:64, %esp
1924; X32ABI-NEXT:    jbe .LBB9_1
1925; X32ABI-NEXT:  .LBB9_2:
1926; X32ABI-NEXT:    subl $40, %esp
1927; X32ABI-NEXT:    .cfi_def_cfa_offset 48
1928; X32ABI-NEXT:    movl %esp, %edi
1929; X32ABI-NEXT:    movl $10, %esi
1930; X32ABI-NEXT:    callq dummy_use@PLT
1931; X32ABI-NEXT:    movl $123, %eax
1932; X32ABI-NEXT:    addl $40, %esp
1933; X32ABI-NEXT:    .cfi_def_cfa_offset 8
1934; X32ABI-NEXT:    retq
1935; X32ABI-NEXT:  .LBB9_1:
1936; X32ABI-NEXT:    movl $40, %r10d
1937; X32ABI-NEXT:    movl $0, %r11d
1938; X32ABI-NEXT:    callq __morestack
1939; X32ABI-NEXT:    retq
1940; X32ABI-NEXT:    jmp .LBB9_2
1941;
1942; X86-Darwin-LABEL: test_nested_unused:
1943; X86-Darwin:       ## %bb.0:
1944; X86-Darwin-NEXT:    movl $432, %ecx ## imm = 0x1B0
1945; X86-Darwin-NEXT:    cmpl %gs:(%ecx), %esp
1946; X86-Darwin-NEXT:    jbe LBB9_1
1947; X86-Darwin-NEXT:  LBB9_2:
1948; X86-Darwin-NEXT:    subl $60, %esp
1949; X86-Darwin-NEXT:    .cfi_def_cfa_offset 64
1950; X86-Darwin-NEXT:    leal {{[0-9]+}}(%esp), %eax
1951; X86-Darwin-NEXT:    movl %eax, (%esp)
1952; X86-Darwin-NEXT:    movl $10, {{[0-9]+}}(%esp)
1953; X86-Darwin-NEXT:    calll _dummy_use
1954; X86-Darwin-NEXT:    movl $123, %eax
1955; X86-Darwin-NEXT:    addl $60, %esp
1956; X86-Darwin-NEXT:    retl
1957; X86-Darwin-NEXT:  LBB9_1:
1958; X86-Darwin-NEXT:    pushl $0
1959; X86-Darwin-NEXT:    pushl $60
1960; X86-Darwin-NEXT:    calll ___morestack
1961; X86-Darwin-NEXT:    retl
1962; X86-Darwin-NEXT:    jmp LBB9_2
1963;
1964; X64-Darwin-LABEL: test_nested_unused:
1965; X64-Darwin:       ## %bb.0:
1966; X64-Darwin-NEXT:    cmpq %gs:816, %rsp
1967; X64-Darwin-NEXT:    jbe LBB9_1
1968; X64-Darwin-NEXT:  LBB9_2:
1969; X64-Darwin-NEXT:    subq $40, %rsp
1970; X64-Darwin-NEXT:    .cfi_def_cfa_offset 48
1971; X64-Darwin-NEXT:    movq %rsp, %rdi
1972; X64-Darwin-NEXT:    movl $10, %esi
1973; X64-Darwin-NEXT:    callq _dummy_use
1974; X64-Darwin-NEXT:    movl $123, %eax
1975; X64-Darwin-NEXT:    addq $40, %rsp
1976; X64-Darwin-NEXT:    retq
1977; X64-Darwin-NEXT:  LBB9_1:
1978; X64-Darwin-NEXT:    movl $40, %r10d
1979; X64-Darwin-NEXT:    movl $0, %r11d
1980; X64-Darwin-NEXT:    callq ___morestack
1981; X64-Darwin-NEXT:    retq
1982; X64-Darwin-NEXT:    jmp LBB9_2
1983;
1984; X86-MinGW-LABEL: test_nested_unused:
1985; X86-MinGW:       # %bb.0:
1986; X86-MinGW-NEXT:    cmpl %fs:20, %esp
1987; X86-MinGW-NEXT:    jbe LBB9_1
1988; X86-MinGW-NEXT:  LBB9_2:
1989; X86-MinGW-NEXT:    subl $40, %esp
1990; X86-MinGW-NEXT:    .cfi_def_cfa_offset 44
1991; X86-MinGW-NEXT:    movl %esp, %eax
1992; X86-MinGW-NEXT:    pushl $10
1993; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
1994; X86-MinGW-NEXT:    pushl %eax
1995; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset 4
1996; X86-MinGW-NEXT:    calll _dummy_use
1997; X86-MinGW-NEXT:    addl $8, %esp
1998; X86-MinGW-NEXT:    .cfi_adjust_cfa_offset -8
1999; X86-MinGW-NEXT:    movl $123, %eax
2000; X86-MinGW-NEXT:    addl $40, %esp
2001; X86-MinGW-NEXT:    retl
2002; X86-MinGW-NEXT:  LBB9_1:
2003; X86-MinGW-NEXT:    .cfi_def_cfa_offset 4
2004; X86-MinGW-NEXT:    pushl $0
2005; X86-MinGW-NEXT:    pushl $40
2006; X86-MinGW-NEXT:    calll ___morestack
2007; X86-MinGW-NEXT:    retl
2008; X86-MinGW-NEXT:    jmp LBB9_2
2009;
2010; X64-FreeBSD-LABEL: test_nested_unused:
2011; X64-FreeBSD:       # %bb.0:
2012; X64-FreeBSD-NEXT:    cmpq %fs:24, %rsp
2013; X64-FreeBSD-NEXT:    jbe .LBB9_1
2014; X64-FreeBSD-NEXT:  .LBB9_2:
2015; X64-FreeBSD-NEXT:    subq $40, %rsp
2016; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 48
2017; X64-FreeBSD-NEXT:    movq %rsp, %rdi
2018; X64-FreeBSD-NEXT:    movl $10, %esi
2019; X64-FreeBSD-NEXT:    callq dummy_use@PLT
2020; X64-FreeBSD-NEXT:    movl $123, %eax
2021; X64-FreeBSD-NEXT:    addq $40, %rsp
2022; X64-FreeBSD-NEXT:    .cfi_def_cfa_offset 8
2023; X64-FreeBSD-NEXT:    retq
2024; X64-FreeBSD-NEXT:  .LBB9_1:
2025; X64-FreeBSD-NEXT:    movl $40, %r10d
2026; X64-FreeBSD-NEXT:    movl $0, %r11d
2027; X64-FreeBSD-NEXT:    callq __morestack
2028; X64-FreeBSD-NEXT:    retq
2029; X64-FreeBSD-NEXT:    jmp .LBB9_2
2030;
2031; X86-DFlyBSD-LABEL: test_nested_unused:
2032; X86-DFlyBSD:       # %bb.0:
2033; X86-DFlyBSD-NEXT:    cmpl %fs:16, %esp
2034; X86-DFlyBSD-NEXT:    jbe .LBB9_1
2035; X86-DFlyBSD-NEXT:  .LBB9_2:
2036; X86-DFlyBSD-NEXT:    subl $40, %esp
2037; X86-DFlyBSD-NEXT:    .cfi_def_cfa_offset 44
2038; X86-DFlyBSD-NEXT:    movl %esp, %eax
2039; X86-DFlyBSD-NEXT:    pushl $10
2040; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
2041; X86-DFlyBSD-NEXT:    pushl %eax
2042; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset 4
2043; X86-DFlyBSD-NEXT:    calll dummy_use@PLT
2044; X86-DFlyBSD-NEXT:    addl $8, %esp
2045; X86-DFlyBSD-NEXT:    .cfi_adjust_cfa_offset -8
2046; X86-DFlyBSD-NEXT:    movl $123, %eax
2047; X86-DFlyBSD-NEXT:    addl $40, %esp
2048; X86-DFlyBSD-NEXT:    .cfi_def_cfa_offset 4
2049; X86-DFlyBSD-NEXT:    retl
2050; X86-DFlyBSD-NEXT:  .LBB9_1:
2051; X86-DFlyBSD-NEXT:    pushl $0
2052; X86-DFlyBSD-NEXT:    pushl $40
2053; X86-DFlyBSD-NEXT:    calll __morestack
2054; X86-DFlyBSD-NEXT:    retl
2055; X86-DFlyBSD-NEXT:    jmp .LBB9_2
2056;
2057; X64-DFlyBSD-LABEL: test_nested_unused:
2058; X64-DFlyBSD:       # %bb.0:
2059; X64-DFlyBSD-NEXT:    cmpq %fs:32, %rsp
2060; X64-DFlyBSD-NEXT:    jbe .LBB9_1
2061; X64-DFlyBSD-NEXT:  .LBB9_2:
2062; X64-DFlyBSD-NEXT:    subq $40, %rsp
2063; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 48
2064; X64-DFlyBSD-NEXT:    movq %rsp, %rdi
2065; X64-DFlyBSD-NEXT:    movl $10, %esi
2066; X64-DFlyBSD-NEXT:    callq dummy_use@PLT
2067; X64-DFlyBSD-NEXT:    movl $123, %eax
2068; X64-DFlyBSD-NEXT:    addq $40, %rsp
2069; X64-DFlyBSD-NEXT:    .cfi_def_cfa_offset 8
2070; X64-DFlyBSD-NEXT:    retq
2071; X64-DFlyBSD-NEXT:  .LBB9_1:
2072; X64-DFlyBSD-NEXT:    movl $40, %r10d
2073; X64-DFlyBSD-NEXT:    movl $0, %r11d
2074; X64-DFlyBSD-NEXT:    callq __morestack
2075; X64-DFlyBSD-NEXT:    retq
2076; X64-DFlyBSD-NEXT:    jmp .LBB9_2
2077;
2078; X64-MinGW-LABEL: test_nested_unused:
2079; X64-MinGW:       # %bb.0:
2080; X64-MinGW-NEXT:    cmpq %gs:40, %rsp
2081; X64-MinGW-NEXT:    jbe .LBB9_1
2082; X64-MinGW-NEXT:  .LBB9_2:
2083; X64-MinGW-NEXT:    subq $72, %rsp
2084; X64-MinGW-NEXT:    .seh_stackalloc 72
2085; X64-MinGW-NEXT:    .seh_endprologue
2086; X64-MinGW-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
2087; X64-MinGW-NEXT:    movl $10, %edx
2088; X64-MinGW-NEXT:    callq dummy_use
2089; X64-MinGW-NEXT:    movl $123, %eax
2090; X64-MinGW-NEXT:    addq $72, %rsp
2091; X64-MinGW-NEXT:    retq
2092; X64-MinGW-NEXT:  .LBB9_1:
2093; X64-MinGW-NEXT:    movl $72, %r10d
2094; X64-MinGW-NEXT:    movl $32, %r11d
2095; X64-MinGW-NEXT:    callq __morestack
2096; X64-MinGW-NEXT:    retq
2097; X64-MinGW-NEXT:    jmp .LBB9_2
2098; X64-MinGW-NEXT:    .seh_endproc
2099       %mem = alloca i32, i32 10
2100       call void @dummy_use (ptr %mem, i32 10)
2101       ret i32 123
2102}
2103
2104attributes #0 = { "split-stack" }
2105
2106; X64-Linux-Large: .section ".note.GNU-split-stack","",@progbits
2107; X64-Linux-Large-NEXT: .section ".note.GNU-no-split-stack","",@progbits
2108; X64-Linux-Large-NEXT: .section	".note.GNU-stack","",@progbits
2109; X64-Linux-Large-NEXT: .rodata
2110; X64-Linux-Large-NEXT: __morestack_addr:
2111; X64-Linux-Large-NEXT: .quad	__morestack
2112
2113; X86-Linux: .section ".note.GNU-split-stack","",@progbits
2114; X86-Linux: .section ".note.GNU-no-split-stack","",@progbits
2115
2116; X64-Linux: .section ".note.GNU-split-stack","",@progbits
2117; X64-Linux: .section ".note.GNU-no-split-stack","",@progbits
2118
2119; X64-FreeBSD: .section ".note.GNU-split-stack","",@progbits
2120; X64-FreeBSD: .section ".note.GNU-no-split-stack","",@progbits
2121
2122; X86-DFlyBSD: .section ".note.GNU-split-stack","",@progbits
2123; X86-DFlyBSD: .section ".note.GNU-no-split-stack","",@progbits
2124
2125; X64-DFlyBSD: .section ".note.GNU-split-stack","",@progbits
2126; X64-DFlyBSD: .section ".note.GNU-no-split-stack","",@progbits
2127