• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s | FileCheck %s
3target triple = "thumbv6m-unknown-unknown-eabi"
4
5define void @vla_emergency_spill(i32 %n) {
6; CHECK-LABEL: vla_emergency_spill:
7; CHECK:       @ %bb.0: @ %entry
8; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
9; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
10; CHECK-NEXT:    .setfp r7, sp, #12
11; CHECK-NEXT:    add r7, sp, #12
12; CHECK-NEXT:    ldr r6, .LCPI0_0
13; CHECK-NEXT:    .pad #4100
14; CHECK-NEXT:    add sp, r6
15; CHECK-NEXT:    mov r6, sp
16; CHECK-NEXT:    adds r0, r0, #7
17; CHECK-NEXT:    movs r1, #7
18; CHECK-NEXT:    bics r0, r1
19; CHECK-NEXT:    mov r1, sp
20; CHECK-NEXT:    subs r0, r1, r0
21; CHECK-NEXT:    mov sp, r0
22; CHECK-NEXT:    adds r1, r6, #4
23; CHECK-NEXT:    @APP
24; CHECK-NEXT:    @NO_APP
25; CHECK-NEXT:    str r0, [r6]
26; CHECK-NEXT:    ldr r0, .LCPI0_1
27; CHECK-NEXT:    str r5, [r0, r6]
28; CHECK-NEXT:    ldr r0, [r6]
29; CHECK-NEXT:    @APP
30; CHECK-NEXT:    @NO_APP
31; CHECK-NEXT:    subs r4, r7, #7
32; CHECK-NEXT:    subs r4, #5
33; CHECK-NEXT:    mov sp, r4
34; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
35; CHECK-NEXT:    .p2align 2
36; CHECK-NEXT:  @ %bb.1:
37; CHECK-NEXT:  .LCPI0_0:
38; CHECK-NEXT:    .long 4294963196 @ 0xffffeffc
39; CHECK-NEXT:  .LCPI0_1:
40; CHECK-NEXT:    .long 1024 @ 0x400
41entry:
42  %x = alloca [1024 x i32], align 4
43  %vla = alloca i8, i32 %n, align 1
44  %asm1 = call { i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},0,1,2,3,4,5"(i8* %vla, [1024 x i32]* %x, i32 undef, i32 undef, i32 undef, i32 undef)
45  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 0
46  %asmresult1 = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 1
47  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 2
48  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 3
49  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 4
50  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32 } %asm1, 5
51  %arrayidx = getelementptr inbounds [1024 x i32], [1024 x i32]* %x, i32 0, i32 255
52  store i32 %asmresult5, i32* %arrayidx, align 4
53  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5}"(i32 %asmresult, i32 %asmresult1, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5) #2
54  ret void
55}
56
57define void @simple_emergency_spill(i32 %n) {
58; CHECK-LABEL: simple_emergency_spill:
59; CHECK:       @ %bb.0: @ %entry
60; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
61; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
62; CHECK-NEXT:    ldr r7, .LCPI1_0
63; CHECK-NEXT:    .pad #8196
64; CHECK-NEXT:    add sp, r7
65; CHECK-NEXT:    add r0, sp, #4
66; CHECK-NEXT:    ldr r1, .LCPI1_2
67; CHECK-NEXT:    add r1, sp
68; CHECK-NEXT:    @APP
69; CHECK-NEXT:    @NO_APP
70; CHECK-NEXT:    str r0, [sp]
71; CHECK-NEXT:    ldr r0, .LCPI1_3
72; CHECK-NEXT:    add r0, sp
73; CHECK-NEXT:    str r5, [r0]
74; CHECK-NEXT:    ldr r0, [sp]
75; CHECK-NEXT:    @APP
76; CHECK-NEXT:    @NO_APP
77; CHECK-NEXT:    ldr r7, .LCPI1_1
78; CHECK-NEXT:    add sp, r7
79; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
80; CHECK-NEXT:    .p2align 2
81; CHECK-NEXT:  @ %bb.1:
82; CHECK-NEXT:  .LCPI1_0:
83; CHECK-NEXT:    .long 4294959100 @ 0xffffdffc
84; CHECK-NEXT:  .LCPI1_1:
85; CHECK-NEXT:    .long 8196 @ 0x2004
86; CHECK-NEXT:  .LCPI1_2:
87; CHECK-NEXT:    .long 4100 @ 0x1004
88; CHECK-NEXT:  .LCPI1_3:
89; CHECK-NEXT:    .long 5120 @ 0x1400
90entry:
91  %x = alloca [1024 x i32], align 4
92  %y = alloca [1024 x i32], align 4
93  %asm1 = call { i32, i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},={r7},0,1,2,3,4,5,6,7"([1024 x i32]* %y, [1024 x i32]* %x, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef)
94  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 0
95  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 1
96  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 2
97  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 3
98  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 4
99  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 5
100  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 6
101  %asmresult8 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 7
102  %arrayidx = getelementptr inbounds [1024 x i32], [1024 x i32]* %x, i32 0, i32 255
103  store i32 %asmresult6, i32* %arrayidx, align 4
104  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6},{r7}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7, i32 %asmresult8)
105  ret void
106}
107
108; We have some logic to try to spill registers instead of allocating an
109; emergency spill slot, but for targets where the stack alignment is 8,
110; it only triggers when there are two available registers.  (This is
111; maybe worth looking into, to improve the generated code quality.)
112;
113; The scavenger itself only cares whether a register is allocatable, not
114; whether it was actually spilled in the prologue, and r7 is first on
115; the priority list, so we use it anyway.  This is likely to confuse
116; debuggers, so maybe worth changing at some point.
117define void @simple_emergency_spill_nor7(i32 %n) {
118; CHECK-LABEL: simple_emergency_spill_nor7:
119; CHECK:       @ %bb.0: @ %entry
120; CHECK-NEXT:    .save {r4, r5, r6, lr}
121; CHECK-NEXT:    push {r4, r5, r6, lr}
122; CHECK-NEXT:    ldr r6, .LCPI2_0
123; CHECK-NEXT:    .pad #8196
124; CHECK-NEXT:    add sp, r6
125; CHECK-NEXT:    add r0, sp, #4
126; CHECK-NEXT:    ldr r1, .LCPI2_2
127; CHECK-NEXT:    add r1, sp
128; CHECK-NEXT:    @APP
129; CHECK-NEXT:    @NO_APP
130; CHECK-NEXT:    str r7, [sp]
131; CHECK-NEXT:    ldr r7, .LCPI2_3
132; CHECK-NEXT:    add r7, sp
133; CHECK-NEXT:    str r5, [r7]
134; CHECK-NEXT:    ldr r7, [sp]
135; CHECK-NEXT:    @APP
136; CHECK-NEXT:    @NO_APP
137; CHECK-NEXT:    ldr r6, .LCPI2_1
138; CHECK-NEXT:    add sp, r6
139; CHECK-NEXT:    pop {r4, r5, r6, pc}
140; CHECK-NEXT:    .p2align 2
141; CHECK-NEXT:  @ %bb.1:
142; CHECK-NEXT:  .LCPI2_0:
143; CHECK-NEXT:    .long 4294959100 @ 0xffffdffc
144; CHECK-NEXT:  .LCPI2_1:
145; CHECK-NEXT:    .long 8196 @ 0x2004
146; CHECK-NEXT:  .LCPI2_2:
147; CHECK-NEXT:    .long 4100 @ 0x1004
148; CHECK-NEXT:  .LCPI2_3:
149; CHECK-NEXT:    .long 5120 @ 0x1400
150entry:
151  %x = alloca [1024 x i32], align 4
152  %y = alloca [1024 x i32], align 4
153  %asm1 = call { i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},0,1,2,3,4,5,6"([1024 x i32]* %y, [1024 x i32]* %x, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef)
154  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 0
155  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 1
156  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 2
157  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 3
158  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 4
159  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 5
160  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 6
161  %arrayidx = getelementptr inbounds [1024 x i32], [1024 x i32]* %x, i32 0, i32 255
162  store i32 %asmresult6, i32* %arrayidx, align 4
163  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7)
164  ret void
165}
166
167define void @arg_emergency_spill(i32 %n, i32 %n2, i32 %n3, i32 %n4, [252 x i32]* byval([252 x i32]) %p) {
168; CHECK-LABEL: arg_emergency_spill:
169; CHECK:       @ %bb.0: @ %entry
170; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
171; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
172; CHECK-NEXT:    .pad #4
173; CHECK-NEXT:    sub sp, #4
174; CHECK-NEXT:    add r0, sp, #24
175; CHECK-NEXT:    @APP
176; CHECK-NEXT:    @NO_APP
177; CHECK-NEXT:    str r0, [sp]
178; CHECK-NEXT:    ldr r0, .LCPI3_0
179; CHECK-NEXT:    add r0, sp
180; CHECK-NEXT:    str r5, [r0]
181; CHECK-NEXT:    ldr r0, [sp]
182; CHECK-NEXT:    @APP
183; CHECK-NEXT:    @NO_APP
184; CHECK-NEXT:    add sp, #4
185; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
186; CHECK-NEXT:    .p2align 2
187; CHECK-NEXT:  @ %bb.1:
188; CHECK-NEXT:  .LCPI3_0:
189; CHECK-NEXT:    .long 1028 @ 0x404
190entry:
191  %pp = getelementptr inbounds [252 x i32], [252 x i32]* %p, i32 0, i32 0
192  %asm1 = call { i32, i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},={r7},0,1,2,3,4,5,6,7"(i32* %pp, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef)
193  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 0
194  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 1
195  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 2
196  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 3
197  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 4
198  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 5
199  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 6
200  %asmresult8 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 7
201  %arrayidx = getelementptr inbounds i32, i32* %pp, i32 251
202  store i32 %asmresult6, i32* %arrayidx, align 4
203  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6},{r7}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7, i32 %asmresult8)
204  ret void
205}
206
207; We currently overestimate the amount of required stack space by 16 bytes,
208; so this is the largest stack that doesn't require an emergency spill slot.
209define void @arg_no_emergency_spill(i32 %n, i32 %n2, i32 %n3, i32 %n4, [248 x i32]* byval([248 x i32]) %p) {
210; CHECK-LABEL: arg_no_emergency_spill:
211; CHECK:       @ %bb.0: @ %entry
212; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
213; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
214; CHECK-NEXT:    add r0, sp, #20
215; CHECK-NEXT:    @APP
216; CHECK-NEXT:    @NO_APP
217; CHECK-NEXT:    str r5, [sp, #1008]
218; CHECK-NEXT:    @APP
219; CHECK-NEXT:    @NO_APP
220; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
221entry:
222  %pp = getelementptr inbounds [248 x i32], [248 x i32]* %p, i32 0, i32 0
223  %asm1 = call { i32, i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},={r7},0,1,2,3,4,5,6,7"(i32* %pp, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef)
224  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 0
225  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 1
226  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 2
227  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 3
228  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 4
229  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 5
230  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 6
231  %asmresult8 = extractvalue { i32, i32, i32, i32, i32, i32, i32, i32 } %asm1, 7
232  %arrayidx = getelementptr inbounds i32, i32* %pp, i32 247
233  store i32 %asmresult6, i32* %arrayidx, align 4
234  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6},{r7}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7, i32 %asmresult8)
235  ret void
236}
237
238define void @aligned_emergency_spill(i32 %n, i32 %n2, i32 %n3, i32 %n4, [31 x i32]* byval([31 x i32]) %p) {
239; CHECK-LABEL: aligned_emergency_spill:
240; CHECK:       @ %bb.0: @ %entry
241; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
242; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
243; CHECK-NEXT:    .setfp r7, sp, #12
244; CHECK-NEXT:    add r7, sp, #12
245; CHECK-NEXT:    .pad #44
246; CHECK-NEXT:    sub sp, #44
247; CHECK-NEXT:    mov r4, sp
248; CHECK-NEXT:    lsrs r4, r4, #4
249; CHECK-NEXT:    lsls r4, r4, #4
250; CHECK-NEXT:    mov sp, r4
251; CHECK-NEXT:    add r0, sp, #16
252; CHECK-NEXT:    adds r1, r7, #7
253; CHECK-NEXT:    adds r1, #1
254; CHECK-NEXT:    @APP
255; CHECK-NEXT:    @NO_APP
256; CHECK-NEXT:    str r0, [sp, #12]
257; CHECK-NEXT:    ldr r0, .LCPI5_0
258; CHECK-NEXT:    str r5, [r0, r7]
259; CHECK-NEXT:    ldr r0, [sp, #12]
260; CHECK-NEXT:    @APP
261; CHECK-NEXT:    @NO_APP
262; CHECK-NEXT:    subs r4, r7, #7
263; CHECK-NEXT:    subs r4, #5
264; CHECK-NEXT:    mov sp, r4
265; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
266; CHECK-NEXT:    .p2align 2
267; CHECK-NEXT:  @ %bb.1:
268; CHECK-NEXT:  .LCPI5_0:
269; CHECK-NEXT:    .long 128 @ 0x80
270entry:
271  %y = alloca [4 x i32], align 16
272  %pp = getelementptr inbounds [31 x i32], [31 x i32]* %p, i32 0, i32 0
273  %asm1 = call { i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},0,1,2,3,4,5,6"([4 x i32]* %y, i32* %pp, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef) #3
274  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 0
275  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 1
276  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 2
277  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 3
278  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 4
279  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 5
280  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 6
281  %arrayidx = getelementptr inbounds i32, i32* %pp, i32 30
282  store i32 %asmresult6, i32* %arrayidx, align 4
283  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7)
284  ret void
285}
286
287; This function should have no emergency spill slot, so its stack should be
288; smaller than @aligned_emergency_spill.
289define void @aligned_no_emergency_spill(i32 %n, i32 %n2, i32 %n3, i32 %n4, [30 x i32]* byval([30 x i32]) %p) {
290; CHECK-LABEL: aligned_no_emergency_spill:
291; CHECK:       @ %bb.0: @ %entry
292; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
293; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
294; CHECK-NEXT:    .setfp r7, sp, #12
295; CHECK-NEXT:    add r7, sp, #12
296; CHECK-NEXT:    .pad #28
297; CHECK-NEXT:    sub sp, #28
298; CHECK-NEXT:    mov r4, sp
299; CHECK-NEXT:    lsrs r4, r4, #4
300; CHECK-NEXT:    lsls r4, r4, #4
301; CHECK-NEXT:    mov sp, r4
302; CHECK-NEXT:    mov r0, sp
303; CHECK-NEXT:    adds r1, r7, #7
304; CHECK-NEXT:    adds r1, #1
305; CHECK-NEXT:    @APP
306; CHECK-NEXT:    @NO_APP
307; CHECK-NEXT:    str r5, [r7, #124]
308; CHECK-NEXT:    @APP
309; CHECK-NEXT:    @NO_APP
310; CHECK-NEXT:    subs r4, r7, #7
311; CHECK-NEXT:    subs r4, #5
312; CHECK-NEXT:    mov sp, r4
313; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
314entry:
315  %y = alloca [4 x i32], align 16
316  %pp = getelementptr inbounds [30 x i32], [30 x i32]* %p, i32 0, i32 0
317  %asm1 = call { i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},0,1,2,3,4,5,6"([4 x i32]* %y, i32* %pp, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef) #3
318  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 0
319  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 1
320  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 2
321  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 3
322  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 4
323  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 5
324  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 6
325  %arrayidx = getelementptr inbounds i32, i32* %pp, i32 29
326  store i32 %asmresult6, i32* %arrayidx, align 4
327  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7)
328  ret void
329}
330
331; This function shouldn't fail to compile.  (It's UB, so it doesn't really
332; matter what it compiles to, exactly, but we need to check at some point
333; so we don't generate code that requires an emergency spill slot we never
334; allocated.  If the store gets eliminated, this testcase probably needs
335; to be rewritten.)
336define void @aligned_out_of_range_access(i32 %n, i32 %n2, i32 %n3, i32 %n4, [30 x i32]* byval([30 x i32]) %p) {
337; CHECK-LABEL: aligned_out_of_range_access:
338; CHECK:       @ %bb.0: @ %entry
339; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
340; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
341; CHECK-NEXT:    .setfp r7, sp, #12
342; CHECK-NEXT:    add r7, sp, #12
343; CHECK-NEXT:    .pad #44
344; CHECK-NEXT:    sub sp, #44
345; CHECK-NEXT:    mov r4, sp
346; CHECK-NEXT:    lsrs r4, r4, #4
347; CHECK-NEXT:    lsls r4, r4, #4
348; CHECK-NEXT:    mov sp, r4
349; CHECK-NEXT:    add r0, sp, #16
350; CHECK-NEXT:    adds r1, r7, #7
351; CHECK-NEXT:    adds r1, #1
352; CHECK-NEXT:    str r1, [sp, #12] @ 4-byte Spill
353; CHECK-NEXT:    @APP
354; CHECK-NEXT:    @NO_APP
355; CHECK-NEXT:    str r0, [sp, #8] @ 4-byte Spill
356; CHECK-NEXT:    ldr r0, [sp, #12] @ 4-byte Reload
357; CHECK-NEXT:    str r5, [r0, #120]
358; CHECK-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload
359; CHECK-NEXT:    @APP
360; CHECK-NEXT:    @NO_APP
361; CHECK-NEXT:    subs r4, r7, #7
362; CHECK-NEXT:    subs r4, #5
363; CHECK-NEXT:    mov sp, r4
364; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
365entry:
366  %y = alloca [4 x i32], align 16
367  %pp = getelementptr inbounds [30 x i32], [30 x i32]* %p, i32 0, i32 0
368  %asm1 = call { i32, i32, i32, i32, i32, i32, i32 } asm "", "={r0},={r1},={r2},={r3},={r4},={r5},={r6},0,1,2,3,4,5,6"([4 x i32]* %y, i32* %pp, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef) #3
369  %asmresult = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 0
370  %asmresult2 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 1
371  %asmresult3 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 2
372  %asmresult4 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 3
373  %asmresult5 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 4
374  %asmresult6 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 5
375  %asmresult7 = extractvalue { i32, i32, i32, i32, i32, i32, i32 } %asm1, 6
376  %arrayidx = getelementptr inbounds i32, i32* %pp, i32 30
377  store i32 %asmresult6, i32* %arrayidx, align 4
378  call void asm sideeffect "", "{r0},{r1},{r2},{r3},{r4},{r5},{r6}"(i32 %asmresult, i32 %asmresult2, i32 %asmresult3, i32 %asmresult4, i32 %asmresult5, i32 %asmresult6, i32 %asmresult7)
379  ret void
380}
381