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
3 ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -verify-machineinstrs | FileCheck %s -check-prefix=X64
4 ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnux32 -verify-machineinstrs | FileCheck %s -check-prefix=X32ABI
5 ; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -filetype=obj
6 ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -filetype=obj
7 ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnux32 -filetype=obj
9 ; Just to prevent the alloca from being optimized away
10 declare void @dummy_use(ptr, i32)
12 define i32 @test_basic(i32 %l) #0 {
13 ; X86-LABEL: test_basic:
15 ; X86-NEXT: cmpl %gs:48, %esp
16 ; X86-NEXT: jbe .LBB0_1
18 ; X86-NEXT: pushl %ebp
19 ; X86-NEXT: .cfi_def_cfa_offset 8
20 ; X86-NEXT: .cfi_offset %ebp, -8
21 ; X86-NEXT: movl %esp, %ebp
22 ; X86-NEXT: .cfi_def_cfa_register %ebp
23 ; X86-NEXT: pushl %esi
24 ; X86-NEXT: pushl %eax
25 ; X86-NEXT: .cfi_offset %esi, -12
26 ; X86-NEXT: movl 8(%ebp), %esi
27 ; X86-NEXT: movl %esp, %eax
28 ; X86-NEXT: leal 15(,%esi,4), %ecx
29 ; X86-NEXT: andl $-16, %ecx
30 ; X86-NEXT: subl %ecx, %eax
31 ; X86-NEXT: cmpl %eax, %gs:48
32 ; X86-NEXT: jg .LBB0_4
34 ; X86-NEXT: movl %eax, %esp
35 ; X86-NEXT: jmp .LBB0_5
37 ; X86-NEXT: subl $12, %esp
38 ; X86-NEXT: pushl %ecx
39 ; X86-NEXT: calll __morestack_allocate_stack_space
40 ; X86-NEXT: addl $16, %esp
42 ; X86-NEXT: subl $16, %esp
43 ; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
44 ; X86-NEXT: movl %eax, (%esp)
45 ; X86-NEXT: calll dummy_use@PLT
46 ; X86-NEXT: addl $16, %esp
47 ; X86-NEXT: testl %esi, %esi
48 ; X86-NEXT: je .LBB0_6
49 ; X86-NEXT: # %bb.8: # %false
51 ; X86-NEXT: subl $16, %esp
52 ; X86-NEXT: movl %esi, (%esp)
53 ; X86-NEXT: calll test_basic@PLT
54 ; X86-NEXT: jmp .LBB0_7
55 ; X86-NEXT: .LBB0_6: # %true
56 ; X86-NEXT: xorl %eax, %eax
57 ; X86-NEXT: .LBB0_7: # %true
58 ; X86-NEXT: leal -4(%ebp), %esp
61 ; X86-NEXT: .cfi_def_cfa %esp, 4
64 ; X86-NEXT: .cfi_restore %ebp
65 ; X86-NEXT: .cfi_restore %esi
68 ; X86-NEXT: calll __morestack
70 ; X86-NEXT: jmp .LBB0_2
72 ; X64-LABEL: test_basic:
74 ; X64-NEXT: cmpq %fs:112, %rsp
75 ; X64-NEXT: jbe .LBB0_1
77 ; X64-NEXT: pushq %rbp
78 ; X64-NEXT: .cfi_def_cfa_offset 16
79 ; X64-NEXT: .cfi_offset %rbp, -16
80 ; X64-NEXT: movq %rsp, %rbp
81 ; X64-NEXT: .cfi_def_cfa_register %rbp
82 ; X64-NEXT: pushq %rbx
83 ; X64-NEXT: pushq %rax
84 ; X64-NEXT: .cfi_offset %rbx, -24
85 ; X64-NEXT: movl %edi, %ebx
86 ; X64-NEXT: movq %rsp, %rdi
87 ; X64-NEXT: movl %ebx, %eax
88 ; X64-NEXT: leaq 15(,%rax,4), %rax
89 ; X64-NEXT: andq $-16, %rax
90 ; X64-NEXT: subq %rax, %rdi
91 ; X64-NEXT: cmpq %rdi, %fs:112
92 ; X64-NEXT: jg .LBB0_4
94 ; X64-NEXT: movq %rdi, %rsp
95 ; X64-NEXT: jmp .LBB0_5
97 ; X64-NEXT: movq %rax, %rdi
98 ; X64-NEXT: callq __morestack_allocate_stack_space
99 ; X64-NEXT: movq %rax, %rdi
101 ; X64-NEXT: movl %ebx, %esi
102 ; X64-NEXT: callq dummy_use@PLT
103 ; X64-NEXT: testl %ebx, %ebx
104 ; X64-NEXT: je .LBB0_6
105 ; X64-NEXT: # %bb.8: # %false
106 ; X64-NEXT: decl %ebx
107 ; X64-NEXT: movl %ebx, %edi
108 ; X64-NEXT: callq test_basic@PLT
109 ; X64-NEXT: jmp .LBB0_7
110 ; X64-NEXT: .LBB0_6: # %true
111 ; X64-NEXT: xorl %eax, %eax
112 ; X64-NEXT: .LBB0_7: # %true
113 ; X64-NEXT: leaq -8(%rbp), %rsp
114 ; X64-NEXT: popq %rbx
115 ; X64-NEXT: popq %rbp
116 ; X64-NEXT: .cfi_def_cfa %rsp, 8
119 ; X64-NEXT: .cfi_restore %rbx
120 ; X64-NEXT: .cfi_restore %rbp
121 ; X64-NEXT: movl $24, %r10d
122 ; X64-NEXT: movl $0, %r11d
123 ; X64-NEXT: callq __morestack
125 ; X64-NEXT: jmp .LBB0_2
127 ; X32ABI-LABEL: test_basic:
129 ; X32ABI-NEXT: cmpl %fs:64, %esp
130 ; X32ABI-NEXT: jbe .LBB0_1
131 ; X32ABI-NEXT: .LBB0_2:
132 ; X32ABI-NEXT: pushq %rbp
133 ; X32ABI-NEXT: .cfi_def_cfa_offset 16
134 ; X32ABI-NEXT: .cfi_offset %rbp, -16
135 ; X32ABI-NEXT: movl %esp, %ebp
136 ; X32ABI-NEXT: .cfi_def_cfa_register %rbp
137 ; X32ABI-NEXT: pushq %rbx
138 ; X32ABI-NEXT: pushq %rax
139 ; X32ABI-NEXT: .cfi_offset %rbx, -24
140 ; X32ABI-NEXT: movl %edi, %ebx
141 ; X32ABI-NEXT: leal 15(,%rbx,4), %eax
142 ; X32ABI-NEXT: andl $-16, %eax
143 ; X32ABI-NEXT: movl %esp, %edi
144 ; X32ABI-NEXT: subl %eax, %edi
145 ; X32ABI-NEXT: cmpl %edi, %fs:64
146 ; X32ABI-NEXT: jg .LBB0_4
147 ; X32ABI-NEXT: # %bb.3:
148 ; X32ABI-NEXT: movl %edi, %esp
149 ; X32ABI-NEXT: jmp .LBB0_5
150 ; X32ABI-NEXT: .LBB0_4:
151 ; X32ABI-NEXT: movl %eax, %edi
152 ; X32ABI-NEXT: callq __morestack_allocate_stack_space
153 ; X32ABI-NEXT: movl %eax, %edi
154 ; X32ABI-NEXT: .LBB0_5:
155 ; X32ABI-NEXT: movl %ebx, %esi
156 ; X32ABI-NEXT: callq dummy_use@PLT
157 ; X32ABI-NEXT: testl %ebx, %ebx
158 ; X32ABI-NEXT: je .LBB0_6
159 ; X32ABI-NEXT: # %bb.8: # %false
160 ; X32ABI-NEXT: decl %ebx
161 ; X32ABI-NEXT: movl %ebx, %edi
162 ; X32ABI-NEXT: callq test_basic@PLT
163 ; X32ABI-NEXT: jmp .LBB0_7
164 ; X32ABI-NEXT: .LBB0_6: # %true
165 ; X32ABI-NEXT: xorl %eax, %eax
166 ; X32ABI-NEXT: .LBB0_7: # %true
167 ; X32ABI-NEXT: leal -8(%ebp), %esp
168 ; X32ABI-NEXT: popq %rbx
169 ; X32ABI-NEXT: popq %rbp
170 ; X32ABI-NEXT: .cfi_def_cfa %rsp, 8
172 ; X32ABI-NEXT: .LBB0_1:
173 ; X32ABI-NEXT: .cfi_def_cfa_register 4294967294
174 ; X32ABI-NEXT: .cfi_restore %rbx
175 ; X32ABI-NEXT: .cfi_restore %rbp
176 ; X32ABI-NEXT: movl $24, %r10d
177 ; X32ABI-NEXT: movl $0, %r11d
178 ; X32ABI-NEXT: callq __morestack
180 ; X32ABI-NEXT: jmp .LBB0_2
181 %mem = alloca i32, i32 %l
182 call void @dummy_use (ptr %mem, i32 %l)
183 %terminate = icmp eq i32 %l, 0
184 br i1 %terminate, label %true, label %false
190 %newlen = sub i32 %l, 1
191 %retvalue = call i32 @test_basic(i32 %newlen)
214 attributes #0 = { "split-stack" }