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