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
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
9 ; Just to prevent the alloca from being optimized away
10 declare void @dummy_use(i32*, i32)
12 define void @test_basic() #0 {
13 %mem = alloca i32, i32 10
14 call void @dummy_use (i32* %mem, i32 10)
17 ; ARM-linux: test_basic:
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
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
34 ; ARM-linux: pop {r4, r5}
36 ; ARM-android: test_basic:
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
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
53 ; ARM-android: pop {r4, r5}
57 define i32 @test_nested(i32 * nest %closure, i32 %other) #0 {
58 %addend = load i32 * %closure
59 %result = add i32 %other, %addend
62 ; ARM-linux: test_nested:
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
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
79 ; ARM-linux: pop {r4, r5}
81 ; ARM-android: test_nested:
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
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
98 ; ARM-android: pop {r4, r5}
102 define void @test_large() #0 {
103 %mem = alloca i32, i32 10000
104 call void @dummy_use (i32* %mem, i32 0)
107 ; ARM-linux: test_large:
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
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
124 ; ARM-linux: pop {r4, r5}
126 ; ARM-android: test_large:
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
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
143 ; ARM-android: pop {r4, r5}
147 define fastcc void @test_fastcc() #0 {
148 %mem = alloca i32, i32 10
149 call void @dummy_use (i32* %mem, i32 10)
152 ; ARM-linux: test_fastcc:
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
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
169 ; ARM-linux: pop {r4, r5}
171 ; ARM-android: test_fastcc:
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
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
188 ; ARM-android: pop {r4, r5}
192 define fastcc void @test_fastcc_large() #0 {
193 %mem = alloca i32, i32 10000
194 call void @dummy_use (i32* %mem, i32 0)
197 ; ARM-linux: test_fastcc_large:
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
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
214 ; ARM-linux: pop {r4, r5}
216 ; ARM-android: test_fastcc_large:
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
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
233 ; ARM-android: pop {r4, r5}
237 attributes #0 = { "split-stack" }