@@ -139,13 +139,28 @@ define void @large_caller(%twenty_bytes* byval(%twenty_bytes) align 4 %a) {
139139; CHECK-NEXT: sub sp, sp, #16
140140; CHECK-NEXT: .save {r4, lr}
141141; CHECK-NEXT: push {r4, lr}
142- ; CHECK-NEXT: add r12, sp, #8
143- ; CHECK-NEXT: add lr, sp, #24
142+ ; CHECK-NEXT: .pad #20
143+ ; CHECK-NEXT: sub sp, sp, #20
144+ ; CHECK-NEXT: add r12, sp, #28
145+ ; CHECK-NEXT: add lr, sp, #44
144146; CHECK-NEXT: stm r12, {r0, r1, r2, r3}
145- ; CHECK-NEXT: add r12, sp, #8
146- ; CHECK-NEXT: add r12, r12, #16
147+ ; CHECK-NEXT: add r0, sp, #28
148+ ; CHECK-NEXT: mov r1, sp
149+ ; CHECK-NEXT: ldr r2, [r0], #4
150+ ; CHECK-NEXT: add r12, r1, #16
151+ ; CHECK-NEXT: str r2, [r1], #4
152+ ; CHECK-NEXT: ldr r2, [r0], #4
153+ ; CHECK-NEXT: str r2, [r1], #4
154+ ; CHECK-NEXT: ldr r2, [r0], #4
155+ ; CHECK-NEXT: str r2, [r1], #4
156+ ; CHECK-NEXT: ldr r2, [r0], #4
157+ ; CHECK-NEXT: str r2, [r1], #4
158+ ; CHECK-NEXT: ldr r2, [r0], #4
159+ ; CHECK-NEXT: str r2, [r1], #4
160+ ; CHECK-NEXT: ldm sp, {r0, r1, r2, r3}
147161; CHECK-NEXT: ldr r4, [r12], #4
148162; CHECK-NEXT: str r4, [lr], #4
163+ ; CHECK-NEXT: add sp, sp, #20
149164; CHECK-NEXT: pop {r4, lr}
150165; CHECK-NEXT: add sp, sp, #16
151166; CHECK-NEXT: b large_callee
@@ -163,17 +178,30 @@ define void @large_caller_check_regs(%twenty_bytes* byval(%twenty_bytes) align 4
163178; CHECK-NEXT: sub sp, sp, #16
164179; CHECK-NEXT: .save {r4, lr}
165180; CHECK-NEXT: push {r4, lr}
166- ; CHECK-NEXT: add r12, sp, #8
167- ; CHECK-NEXT: add lr, sp, #24
181+ ; CHECK-NEXT: .pad #20
182+ ; CHECK-NEXT: sub sp, sp, #20
183+ ; CHECK-NEXT: add r12, sp, #28
184+ ; CHECK-NEXT: add lr, sp, #44
168185; CHECK-NEXT: stm r12, {r0, r1, r2, r3}
169186; CHECK-NEXT: @APP
170187; CHECK-NEXT: @NO_APP
171- ; CHECK-NEXT: add r3, sp, #8
172- ; CHECK-NEXT: add r0, sp, #8
173- ; CHECK-NEXT: add r12, r0, #16
174- ; CHECK-NEXT: ldm r3, {r0, r1, r2, r3}
188+ ; CHECK-NEXT: add r0, sp, #28
189+ ; CHECK-NEXT: mov r1, sp
190+ ; CHECK-NEXT: add r12, r1, #16
191+ ; CHECK-NEXT: ldr r2, [r0], #4
192+ ; CHECK-NEXT: str r2, [r1], #4
193+ ; CHECK-NEXT: ldr r2, [r0], #4
194+ ; CHECK-NEXT: str r2, [r1], #4
195+ ; CHECK-NEXT: ldr r2, [r0], #4
196+ ; CHECK-NEXT: str r2, [r1], #4
197+ ; CHECK-NEXT: ldr r2, [r0], #4
198+ ; CHECK-NEXT: str r2, [r1], #4
199+ ; CHECK-NEXT: ldr r2, [r0], #4
200+ ; CHECK-NEXT: str r2, [r1], #4
201+ ; CHECK-NEXT: ldm sp, {r0, r1, r2, r3}
175202; CHECK-NEXT: ldr r4, [r12], #4
176203; CHECK-NEXT: str r4, [lr], #4
204+ ; CHECK-NEXT: add sp, sp, #20
177205; CHECK-NEXT: pop {r4, lr}
178206; CHECK-NEXT: add sp, sp, #16
179207; CHECK-NEXT: b large_callee
@@ -190,30 +218,44 @@ entry:
190218define void @large_caller_new_value (%twenty_bytes* byval (%twenty_bytes ) align 4 %a ) {
191219; CHECK-LABEL: large_caller_new_value:
192220; CHECK: @ %bb.0: @ %entry
193- ; CHECK-NEXT: .pad #36
194- ; CHECK-NEXT: sub sp, sp, #36
195- ; CHECK-NEXT: add r12, sp, #20
221+ ; CHECK-NEXT: .pad #16
222+ ; CHECK-NEXT: sub sp, sp, #16
223+ ; CHECK-NEXT: .save {r4, lr}
224+ ; CHECK-NEXT: push {r4, lr}
225+ ; CHECK-NEXT: .pad #40
226+ ; CHECK-NEXT: sub sp, sp, #40
227+ ; CHECK-NEXT: add r12, sp, #48
228+ ; CHECK-NEXT: add lr, sp, #64
196229; CHECK-NEXT: stm r12, {r0, r1, r2, r3}
197230; CHECK-NEXT: mov r0, #4
198- ; CHECK-NEXT: add r1, sp, #36
199- ; CHECK-NEXT: str r0, [sp, #16 ]
231+ ; CHECK-NEXT: mov r1, sp
232+ ; CHECK-NEXT: str r0, [sp, #36 ]
200233; CHECK-NEXT: mov r0, #3
201- ; CHECK-NEXT: str r0, [sp, #12 ]
234+ ; CHECK-NEXT: str r0, [sp, #32 ]
202235; CHECK-NEXT: mov r0, #2
203- ; CHECK-NEXT: str r0, [sp, #8 ]
236+ ; CHECK-NEXT: str r0, [sp, #28 ]
204237; CHECK-NEXT: mov r0, #1
205- ; CHECK-NEXT: str r0, [sp, #4 ]
238+ ; CHECK-NEXT: str r0, [sp, #24 ]
206239; CHECK-NEXT: mov r0, #0
207- ; CHECK-NEXT: str r0, [sp]
208- ; CHECK-NEXT: mov r0, sp
209- ; CHECK-NEXT: add r0, r0, #16
210- ; CHECK-NEXT: mov r3, #3
240+ ; CHECK-NEXT: str r0, [sp, #20]
241+ ; CHECK-NEXT: add r0, sp, #20
242+ ; CHECK-NEXT: add r12, r1, #16
211243; CHECK-NEXT: ldr r2, [r0], #4
212244; CHECK-NEXT: str r2, [r1], #4
213- ; CHECK-NEXT: mov r0, #0
214- ; CHECK-NEXT: mov r1, #1
215- ; CHECK-NEXT: mov r2, #2
216- ; CHECK-NEXT: add sp, sp, #36
245+ ; CHECK-NEXT: ldr r2, [r0], #4
246+ ; CHECK-NEXT: str r2, [r1], #4
247+ ; CHECK-NEXT: ldr r2, [r0], #4
248+ ; CHECK-NEXT: str r2, [r1], #4
249+ ; CHECK-NEXT: ldr r2, [r0], #4
250+ ; CHECK-NEXT: str r2, [r1], #4
251+ ; CHECK-NEXT: ldr r2, [r0], #4
252+ ; CHECK-NEXT: str r2, [r1], #4
253+ ; CHECK-NEXT: ldm sp, {r0, r1, r2, r3}
254+ ; CHECK-NEXT: ldr r4, [r12], #4
255+ ; CHECK-NEXT: str r4, [lr], #4
256+ ; CHECK-NEXT: add sp, sp, #40
257+ ; CHECK-NEXT: pop {r4, lr}
258+ ; CHECK-NEXT: add sp, sp, #16
217259; CHECK-NEXT: b large_callee
218260entry:
219261 %y = alloca %twenty_bytes , align 4
@@ -229,3 +271,67 @@ entry:
229271 musttail call void @large_callee (%twenty_bytes* byval (%twenty_bytes ) align 4 %y )
230272 ret void
231273}
274+
275+ declare void @two_byvals_callee (%twenty_bytes* byval (%twenty_bytes ) align 4 , %twenty_bytes* byval (%twenty_bytes ) align 4 )
276+ define void @swap_byvals (%twenty_bytes* byval (%twenty_bytes ) align 4 %a , %twenty_bytes* byval (%twenty_bytes ) align 4 %b ) {
277+ ; CHECK-LABEL: swap_byvals:
278+ ; CHECK: @ %bb.0: @ %entry
279+ ; CHECK-NEXT: .pad #16
280+ ; CHECK-NEXT: sub sp, sp, #16
281+ ; CHECK-NEXT: .save {r4, r5, r11, lr}
282+ ; CHECK-NEXT: push {r4, r5, r11, lr}
283+ ; CHECK-NEXT: .pad #40
284+ ; CHECK-NEXT: sub sp, sp, #40
285+ ; CHECK-NEXT: add r12, sp, #56
286+ ; CHECK-NEXT: add lr, sp, #20
287+ ; CHECK-NEXT: stm r12, {r0, r1, r2, r3}
288+ ; CHECK-NEXT: add r0, sp, #56
289+ ; CHECK-NEXT: mov r12, sp
290+ ; CHECK-NEXT: ldr r1, [r0], #4
291+ ; CHECK-NEXT: mov r2, r12
292+ ; CHECK-NEXT: str r1, [r2], #4
293+ ; CHECK-NEXT: add r3, sp, #20
294+ ; CHECK-NEXT: ldr r1, [r0], #4
295+ ; CHECK-NEXT: add r4, sp, #76
296+ ; CHECK-NEXT: str r1, [r2], #4
297+ ; CHECK-NEXT: ldr r1, [r0], #4
298+ ; CHECK-NEXT: str r1, [r2], #4
299+ ; CHECK-NEXT: ldr r1, [r0], #4
300+ ; CHECK-NEXT: str r1, [r2], #4
301+ ; CHECK-NEXT: ldr r1, [r0], #4
302+ ; CHECK-NEXT: add r0, sp, #76
303+ ; CHECK-NEXT: str r1, [r2], #4
304+ ; CHECK-NEXT: mov r2, lr
305+ ; CHECK-NEXT: ldr r1, [r0], #4
306+ ; CHECK-NEXT: str r1, [r2], #4
307+ ; CHECK-NEXT: ldr r1, [r0], #4
308+ ; CHECK-NEXT: str r1, [r2], #4
309+ ; CHECK-NEXT: ldr r1, [r0], #4
310+ ; CHECK-NEXT: str r1, [r2], #4
311+ ; CHECK-NEXT: ldr r1, [r0], #4
312+ ; CHECK-NEXT: str r1, [r2], #4
313+ ; CHECK-NEXT: ldr r1, [r0], #4
314+ ; CHECK-NEXT: str r1, [r2], #4
315+ ; CHECK-NEXT: ldm r3, {r0, r1, r2, r3}
316+ ; CHECK-NEXT: ldr r5, [r12], #4
317+ ; CHECK-NEXT: str r5, [r4], #4
318+ ; CHECK-NEXT: ldr r5, [r12], #4
319+ ; CHECK-NEXT: str r5, [r4], #4
320+ ; CHECK-NEXT: ldr r5, [r12], #4
321+ ; CHECK-NEXT: str r5, [r4], #4
322+ ; CHECK-NEXT: ldr r5, [r12], #4
323+ ; CHECK-NEXT: str r5, [r4], #4
324+ ; CHECK-NEXT: ldr r5, [r12], #4
325+ ; CHECK-NEXT: str r5, [r4], #4
326+ ; CHECK-NEXT: add r5, lr, #16
327+ ; CHECK-NEXT: add r12, sp, #72
328+ ; CHECK-NEXT: ldr r4, [r5], #4
329+ ; CHECK-NEXT: str r4, [r12], #4
330+ ; CHECK-NEXT: add sp, sp, #40
331+ ; CHECK-NEXT: pop {r4, r5, r11, lr}
332+ ; CHECK-NEXT: add sp, sp, #16
333+ ; CHECK-NEXT: b two_byvals_callee
334+ entry:
335+ musttail call void @two_byvals_callee (%twenty_bytes* byval (%twenty_bytes ) align 4 %b , %twenty_bytes* byval (%twenty_bytes ) align 4 %a )
336+ ret void
337+ }
0 commit comments