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