@@ -249,3 +249,119 @@ define <vscale x 1 x i64> @case4_2(<vscale x 1 x i64> %0, {<vscale x 8 x i64>, <
249249 %add = add <vscale x 1 x i64 > %0 , %2
250250 ret <vscale x 1 x i64 > %add
251251}
252+
253+ declare <vscale x 1 x i64 > @callee1 ()
254+ declare void @callee2 (<vscale x 1 x i64 >)
255+ declare void @callee3 (<vscale x 4 x i32 >)
256+ define void @caller () {
257+ ; RV32-LABEL: caller:
258+ ; RV32: # %bb.0:
259+ ; RV32-NEXT: addi sp, sp, -16
260+ ; RV32-NEXT: .cfi_def_cfa_offset 16
261+ ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
262+ ; RV32-NEXT: .cfi_offset ra, -4
263+ ; RV32-NEXT: call callee1
264+ ; RV32-NEXT: vsetvli a0, zero, e64, m1, ta, ma
265+ ; RV32-NEXT: vadd.vv v8, v8, v8
266+ ; RV32-NEXT: call callee2
267+ ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
268+ ; RV32-NEXT: addi sp, sp, 16
269+ ; RV32-NEXT: ret
270+ ;
271+ ; RV64-LABEL: caller:
272+ ; RV64: # %bb.0:
273+ ; RV64-NEXT: addi sp, sp, -16
274+ ; RV64-NEXT: .cfi_def_cfa_offset 16
275+ ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
276+ ; RV64-NEXT: .cfi_offset ra, -8
277+ ; RV64-NEXT: call callee1
278+ ; RV64-NEXT: vsetvli a0, zero, e64, m1, ta, ma
279+ ; RV64-NEXT: vadd.vv v8, v8, v8
280+ ; RV64-NEXT: call callee2
281+ ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
282+ ; RV64-NEXT: addi sp, sp, 16
283+ ; RV64-NEXT: ret
284+ %a = call <vscale x 1 x i64 > @callee1 ()
285+ %add = add <vscale x 1 x i64 > %a , %a
286+ call void @callee2 (<vscale x 1 x i64 > %add )
287+ ret void
288+ }
289+
290+ declare {<vscale x 4 x i32 >, <vscale x 4 x i32 >} @callee_tuple ()
291+ define void @caller_tuple () {
292+ ; RV32-LABEL: caller_tuple:
293+ ; RV32: # %bb.0:
294+ ; RV32-NEXT: addi sp, sp, -16
295+ ; RV32-NEXT: .cfi_def_cfa_offset 16
296+ ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
297+ ; RV32-NEXT: .cfi_offset ra, -4
298+ ; RV32-NEXT: call callee_tuple
299+ ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
300+ ; RV32-NEXT: vadd.vv v8, v8, v10
301+ ; RV32-NEXT: call callee3
302+ ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
303+ ; RV32-NEXT: addi sp, sp, 16
304+ ; RV32-NEXT: ret
305+ ;
306+ ; RV64-LABEL: caller_tuple:
307+ ; RV64: # %bb.0:
308+ ; RV64-NEXT: addi sp, sp, -16
309+ ; RV64-NEXT: .cfi_def_cfa_offset 16
310+ ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
311+ ; RV64-NEXT: .cfi_offset ra, -8
312+ ; RV64-NEXT: call callee_tuple
313+ ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
314+ ; RV64-NEXT: vadd.vv v8, v8, v10
315+ ; RV64-NEXT: call callee3
316+ ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
317+ ; RV64-NEXT: addi sp, sp, 16
318+ ; RV64-NEXT: ret
319+ %a = call {<vscale x 4 x i32 >, <vscale x 4 x i32 >} @callee_tuple ()
320+ %b = extractvalue {<vscale x 4 x i32 >, <vscale x 4 x i32 >} %a , 0
321+ %c = extractvalue {<vscale x 4 x i32 >, <vscale x 4 x i32 >} %a , 1
322+ %add = add <vscale x 4 x i32 > %b , %c
323+ call void @callee3 (<vscale x 4 x i32 > %add )
324+ ret void
325+ }
326+
327+ declare {<vscale x 4 x i32 >, {<vscale x 4 x i32 >, <vscale x 4 x i32 >}} @callee_nested ()
328+ define void @caller_nested () {
329+ ; RV32-LABEL: caller_nested:
330+ ; RV32: # %bb.0:
331+ ; RV32-NEXT: addi sp, sp, -16
332+ ; RV32-NEXT: .cfi_def_cfa_offset 16
333+ ; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
334+ ; RV32-NEXT: .cfi_offset ra, -4
335+ ; RV32-NEXT: call callee_nested
336+ ; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, ma
337+ ; RV32-NEXT: vadd.vv v8, v8, v10
338+ ; RV32-NEXT: vadd.vv v8, v8, v12
339+ ; RV32-NEXT: call callee3
340+ ; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
341+ ; RV32-NEXT: addi sp, sp, 16
342+ ; RV32-NEXT: ret
343+ ;
344+ ; RV64-LABEL: caller_nested:
345+ ; RV64: # %bb.0:
346+ ; RV64-NEXT: addi sp, sp, -16
347+ ; RV64-NEXT: .cfi_def_cfa_offset 16
348+ ; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
349+ ; RV64-NEXT: .cfi_offset ra, -8
350+ ; RV64-NEXT: call callee_nested
351+ ; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, ma
352+ ; RV64-NEXT: vadd.vv v8, v8, v10
353+ ; RV64-NEXT: vadd.vv v8, v8, v12
354+ ; RV64-NEXT: call callee3
355+ ; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
356+ ; RV64-NEXT: addi sp, sp, 16
357+ ; RV64-NEXT: ret
358+ %a = call {<vscale x 4 x i32 >, {<vscale x 4 x i32 >, <vscale x 4 x i32 >}} @callee_nested ()
359+ %b = extractvalue {<vscale x 4 x i32 >, {<vscale x 4 x i32 >, <vscale x 4 x i32 >}} %a , 0
360+ %c = extractvalue {<vscale x 4 x i32 >, {<vscale x 4 x i32 >, <vscale x 4 x i32 >}} %a , 1
361+ %c0 = extractvalue {<vscale x 4 x i32 >, <vscale x 4 x i32 >} %c , 0
362+ %c1 = extractvalue {<vscale x 4 x i32 >, <vscale x 4 x i32 >} %c , 1
363+ %add0 = add <vscale x 4 x i32 > %b , %c0
364+ %add1 = add <vscale x 4 x i32 > %add0 , %c1
365+ call void @callee3 (<vscale x 4 x i32 > %add1 )
366+ ret void
367+ }
0 commit comments