xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/segmented-stacks.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-linux-androideabi -verify-machineinstrs | FileCheck %s -check-prefix=ARM-android
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=ARM-linux
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; We used to crash with filetype=obj
5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-linux-androideabi -filetype=obj
6*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -filetype=obj
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; Just to prevent the alloca from being optimized away
10*9880d681SAndroid Build Coastguard Workerdeclare void @dummy_use(i32*, i32)
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine void @test_basic() #0 {
13*9880d681SAndroid Build Coastguard Worker        %mem = alloca i32, i32 10
14*9880d681SAndroid Build Coastguard Worker        call void @dummy_use (i32* %mem, i32 10)
15*9880d681SAndroid Build Coastguard Worker	ret void
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; ARM-linux:      test_basic:
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; ARM-linux:      push    {r4, r5}
20*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
21*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov     r5, sp
22*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldr     r4, [r4, #4]
23*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: cmp     r4, r5
24*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: blo     .LBB0_2
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; ARM-linux:      mov     r4, #48
27*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov     r5, #0
28*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: stmdb   sp!, {lr}
29*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bl      __morestack
30*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldm     sp!, {lr}
31*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: pop     {r4, r5}
32*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bx      lr
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker; ARM-linux:      pop     {r4, r5}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker; ARM-android:      test_basic:
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; ARM-android:      push    {r4, r5}
39*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
40*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov     r5, sp
41*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldr     r4, [r4, #252]
42*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: cmp     r4, r5
43*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: blo     .LBB0_2
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; ARM-android:      mov     r4, #48
46*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov     r5, #0
47*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: stmdb   sp!, {lr}
48*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bl      __morestack
49*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldm     sp!, {lr}
50*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: pop     {r4, r5}
51*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bx      lr
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; ARM-android:      pop     {r4, r5}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine i32 @test_nested(i32 * nest %closure, i32 %other) #0 {
58*9880d681SAndroid Build Coastguard Worker       %addend = load i32 , i32 * %closure
59*9880d681SAndroid Build Coastguard Worker       %result = add i32 %other, %addend
60*9880d681SAndroid Build Coastguard Worker       %mem = alloca i32, i32 10
61*9880d681SAndroid Build Coastguard Worker       call void @dummy_use (i32* %mem, i32 10)
62*9880d681SAndroid Build Coastguard Worker       ret i32 %result
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; ARM-linux:      test_nested:
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; ARM-linux:      push    {r4, r5}
67*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
68*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov     r5, sp
69*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldr     r4, [r4, #4]
70*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: cmp     r4, r5
71*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: blo     .LBB1_2
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; ARM-linux:      mov     r4, #56
74*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov     r5, #0
75*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: stmdb   sp!, {lr}
76*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bl      __morestack
77*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldm     sp!, {lr}
78*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: pop     {r4, r5}
79*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bx      lr
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; ARM-linux:      pop     {r4, r5}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker; ARM-android:      test_nested:
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; ARM-android:      push    {r4, r5}
86*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
87*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov     r5, sp
88*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldr     r4, [r4, #252]
89*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: cmp     r4, r5
90*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: blo     .LBB1_2
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; ARM-android:      mov     r4, #56
93*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov     r5, #0
94*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: stmdb   sp!, {lr}
95*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bl      __morestack
96*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldm     sp!, {lr}
97*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: pop     {r4, r5}
98*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bx      lr
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker; ARM-android:      pop     {r4, r5}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker}
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerdefine void @test_large() #0 {
105*9880d681SAndroid Build Coastguard Worker        %mem = alloca i32, i32 10000
106*9880d681SAndroid Build Coastguard Worker        call void @dummy_use (i32* %mem, i32 0)
107*9880d681SAndroid Build Coastguard Worker        ret void
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; ARM-linux:      test_large:
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; ARM-linux:      push    {r4, r5}
112*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
113*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: sub     r5, sp, #40192
114*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldr     r4, [r4, #4]
115*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: cmp     r4, r5
116*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: blo     .LBB2_2
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker; ARM-linux:      mov     r4, #40192
119*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov     r5, #0
120*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: stmdb   sp!, {lr}
121*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bl      __morestack
122*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldm     sp!, {lr}
123*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: pop     {r4, r5}
124*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bx      lr
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker; ARM-linux:      pop     {r4, r5}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker; ARM-android:      test_large:
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; ARM-android:      push    {r4, r5}
131*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
132*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: sub     r5, sp, #40192
133*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldr     r4, [r4, #252]
134*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: cmp     r4, r5
135*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: blo     .LBB2_2
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; ARM-android:      mov     r4, #40192
138*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov     r5, #0
139*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: stmdb   sp!, {lr}
140*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bl      __morestack
141*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldm     sp!, {lr}
142*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: pop     {r4, r5}
143*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bx      lr
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; ARM-android:      pop     {r4, r5}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker}
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine fastcc void @test_fastcc() #0 {
150*9880d681SAndroid Build Coastguard Worker        %mem = alloca i32, i32 10
151*9880d681SAndroid Build Coastguard Worker        call void @dummy_use (i32* %mem, i32 10)
152*9880d681SAndroid Build Coastguard Worker        ret void
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker; ARM-linux:      test_fastcc:
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker; ARM-linux:      push    {r4, r5}
157*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
158*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov     r5, sp
159*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldr     r4, [r4, #4]
160*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: cmp     r4, r5
161*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: blo     .LBB3_2
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker; ARM-linux:      mov     r4, #48
164*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov     r5, #0
165*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: stmdb   sp!, {lr}
166*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bl      __morestack
167*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldm     sp!, {lr}
168*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: pop     {r4, r5}
169*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bx      lr
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker; ARM-linux:      pop     {r4, r5}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker; ARM-android:      test_fastcc:
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker; ARM-android:      push    {r4, r5}
176*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
177*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov     r5, sp
178*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldr     r4, [r4, #252]
179*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: cmp     r4, r5
180*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: blo     .LBB3_2
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker; ARM-android:      mov     r4, #48
183*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov     r5, #0
184*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: stmdb   sp!, {lr}
185*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bl      __morestack
186*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldm     sp!, {lr}
187*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: pop     {r4, r5}
188*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bx      lr
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker; ARM-android:      pop     {r4, r5}
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdefine fastcc void @test_fastcc_large() #0 {
195*9880d681SAndroid Build Coastguard Worker        %mem = alloca i32, i32 10000
196*9880d681SAndroid Build Coastguard Worker        call void @dummy_use (i32* %mem, i32 0)
197*9880d681SAndroid Build Coastguard Worker        ret void
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker; ARM-linux:      test_fastcc_large:
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Worker; ARM-linux:      push    {r4, r5}
202*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
203*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: sub     r5, sp, #40192
204*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldr     r4, [r4, #4]
205*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: cmp     r4, r5
206*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: blo     .LBB4_2
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker; ARM-linux:      mov     r4, #40192
209*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov     r5, #0
210*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: stmdb   sp!, {lr}
211*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bl      __morestack
212*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldm     sp!, {lr}
213*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: pop     {r4, r5}
214*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bx      lr
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Worker; ARM-linux:      pop     {r4, r5}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker; ARM-android:      test_fastcc_large:
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker; ARM-android:      push    {r4, r5}
221*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
222*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: sub     r5, sp, #40192
223*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldr     r4, [r4, #252]
224*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: cmp     r4, r5
225*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: blo     .LBB4_2
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker; ARM-android:      mov     r4, #40192
228*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov     r5, #0
229*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: stmdb   sp!, {lr}
230*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bl      __morestack
231*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldm     sp!, {lr}
232*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: pop     {r4, r5}
233*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bx      lr
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Worker; ARM-android:      pop     {r4, r5}
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerdefine void @test_nostack() #0 {
240*9880d681SAndroid Build Coastguard Worker	ret void
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Worker; ARM-linux-LABEL: test_nostack:
243*9880d681SAndroid Build Coastguard Worker; ARM-linux-NOT:   bl __morestack
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker; ARM-android-LABEL: test_nostack:
246*9880d681SAndroid Build Coastguard Worker; ARM-android-NOT:   bl __morestack
247*9880d681SAndroid Build Coastguard Worker}
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Workerattributes #0 = { "split-stack" }
250