[Reland][Runtimes] Merge 'compile_commands.json' files from runtimes build (#116303)
[llvm-project.git] / llvm / test / CodeGen / X86 / segmented-stacks-dynamic.ll
blobe8359cb088dc380711c5ce4312d3cf0ec4a9b2de
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:
14 ; X86:       # %bb.0:
15 ; X86-NEXT:    cmpl %gs:48, %esp
16 ; X86-NEXT:    jbe .LBB0_1
17 ; X86-NEXT:  .LBB0_2:
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
33 ; X86-NEXT:  # %bb.3:
34 ; X86-NEXT:    movl %eax, %esp
35 ; X86-NEXT:    jmp .LBB0_5
36 ; X86-NEXT:  .LBB0_4:
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
41 ; X86-NEXT:  .LBB0_5:
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
50 ; X86-NEXT:    decl %esi
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
59 ; X86-NEXT:    popl %esi
60 ; X86-NEXT:    popl %ebp
61 ; X86-NEXT:    .cfi_def_cfa %esp, 4
62 ; X86-NEXT:    retl
63 ; X86-NEXT:  .LBB0_1:
64 ; X86-NEXT:    .cfi_restore %ebp
65 ; X86-NEXT:    .cfi_restore %esi
66 ; X86-NEXT:    pushl $4
67 ; X86-NEXT:    pushl $12
68 ; X86-NEXT:    calll __morestack
69 ; X86-NEXT:    retl
70 ; X86-NEXT:    jmp .LBB0_2
72 ; X64-LABEL: test_basic:
73 ; X64:       # %bb.0:
74 ; X64-NEXT:    cmpq %fs:112, %rsp
75 ; X64-NEXT:    jbe .LBB0_1
76 ; X64-NEXT:  .LBB0_2:
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
93 ; X64-NEXT:  # %bb.3:
94 ; X64-NEXT:    movq %rdi, %rsp
95 ; X64-NEXT:    jmp .LBB0_5
96 ; X64-NEXT:  .LBB0_4:
97 ; X64-NEXT:    movq %rax, %rdi
98 ; X64-NEXT:    callq __morestack_allocate_stack_space
99 ; X64-NEXT:    movq %rax, %rdi
100 ; X64-NEXT:  .LBB0_5:
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
117 ; X64-NEXT:    retq
118 ; X64-NEXT:  .LBB0_1:
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
124 ; X64-NEXT:    retq
125 ; X64-NEXT:    jmp .LBB0_2
127 ; X32ABI-LABEL: test_basic:
128 ; X32ABI:       # %bb.0:
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
171 ; X32ABI-NEXT:    retq
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
179 ; X32ABI-NEXT:    retq
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
186 true:
187         ret i32 0
189 false:
190         %newlen = sub i32 %l, 1
191         %retvalue = call i32 @test_basic(i32 %newlen)
192         ret i32 %retvalue
214 attributes #0 = { "split-stack" }