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