185 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+m,+v < %s | FileCheck %s --check-prefixes=CHECK,RV323; RUN: llc -mtriple=riscv64 -mattr=+m,+v < %s | FileCheck %s --check-prefixes=CHECK,RV644 5; Check that we correctly scale the split part indirect offsets by VSCALE.6define <vscale x 32 x i32> @callee_scalable_vector_split_indirect(<vscale x 32 x i32> %x, <vscale x 32 x i32> %y) {7; CHECK-LABEL: callee_scalable_vector_split_indirect:8; CHECK: # %bb.0:9; CHECK-NEXT: csrr a1, vlenb10; CHECK-NEXT: slli a1, a1, 311; CHECK-NEXT: add a1, a0, a112; CHECK-NEXT: vl8re32.v v24, (a0)13; CHECK-NEXT: vl8re32.v v0, (a1)14; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma15; CHECK-NEXT: vadd.vv v8, v8, v2416; CHECK-NEXT: vadd.vv v16, v16, v017; CHECK-NEXT: ret18 %a = add <vscale x 32 x i32> %x, %y19 ret <vscale x 32 x i32> %a20}21 22; Call the function above. Check that we set the arguments correctly.23define <vscale x 32 x i32> @caller_scalable_vector_split_indirect(<vscale x 32 x i32> %x) {24; RV32-LABEL: caller_scalable_vector_split_indirect:25; RV32: # %bb.0:26; RV32-NEXT: addi sp, sp, -14427; RV32-NEXT: .cfi_def_cfa_offset 14428; RV32-NEXT: sw ra, 140(sp) # 4-byte Folded Spill29; RV32-NEXT: sw s0, 136(sp) # 4-byte Folded Spill30; RV32-NEXT: .cfi_offset ra, -431; RV32-NEXT: .cfi_offset s0, -832; RV32-NEXT: addi s0, sp, 14433; RV32-NEXT: .cfi_def_cfa s0, 034; RV32-NEXT: csrr a0, vlenb35; RV32-NEXT: slli a0, a0, 436; RV32-NEXT: sub sp, sp, a037; RV32-NEXT: andi sp, sp, -12838; RV32-NEXT: addi a0, sp, 12839; RV32-NEXT: csrr a1, vlenb40; RV32-NEXT: vs8r.v v8, (a0)41; RV32-NEXT: vsetvli a2, zero, e32, m8, ta, ma42; RV32-NEXT: vmv.v.i v8, 043; RV32-NEXT: slli a1, a1, 344; RV32-NEXT: add a1, a0, a145; RV32-NEXT: addi a0, sp, 12846; RV32-NEXT: vs8r.v v16, (a1)47; RV32-NEXT: vmv.v.i v16, 048; RV32-NEXT: call callee_scalable_vector_split_indirect49; RV32-NEXT: addi sp, s0, -14450; RV32-NEXT: .cfi_def_cfa sp, 14451; RV32-NEXT: lw ra, 140(sp) # 4-byte Folded Reload52; RV32-NEXT: lw s0, 136(sp) # 4-byte Folded Reload53; RV32-NEXT: .cfi_restore ra54; RV32-NEXT: .cfi_restore s055; RV32-NEXT: addi sp, sp, 14456; RV32-NEXT: .cfi_def_cfa_offset 057; RV32-NEXT: ret58;59; RV64-LABEL: caller_scalable_vector_split_indirect:60; RV64: # %bb.0:61; RV64-NEXT: addi sp, sp, -14462; RV64-NEXT: .cfi_def_cfa_offset 14463; RV64-NEXT: sd ra, 136(sp) # 8-byte Folded Spill64; RV64-NEXT: sd s0, 128(sp) # 8-byte Folded Spill65; RV64-NEXT: .cfi_offset ra, -866; RV64-NEXT: .cfi_offset s0, -1667; RV64-NEXT: addi s0, sp, 14468; RV64-NEXT: .cfi_def_cfa s0, 069; RV64-NEXT: csrr a0, vlenb70; RV64-NEXT: slli a0, a0, 471; RV64-NEXT: sub sp, sp, a072; RV64-NEXT: andi sp, sp, -12873; RV64-NEXT: addi a0, sp, 12874; RV64-NEXT: csrr a1, vlenb75; RV64-NEXT: vs8r.v v8, (a0)76; RV64-NEXT: vsetvli a2, zero, e32, m8, ta, ma77; RV64-NEXT: vmv.v.i v8, 078; RV64-NEXT: slli a1, a1, 379; RV64-NEXT: add a1, a0, a180; RV64-NEXT: addi a0, sp, 12881; RV64-NEXT: vs8r.v v16, (a1)82; RV64-NEXT: vmv.v.i v16, 083; RV64-NEXT: call callee_scalable_vector_split_indirect84; RV64-NEXT: addi sp, s0, -14485; RV64-NEXT: .cfi_def_cfa sp, 14486; RV64-NEXT: ld ra, 136(sp) # 8-byte Folded Reload87; RV64-NEXT: ld s0, 128(sp) # 8-byte Folded Reload88; RV64-NEXT: .cfi_restore ra89; RV64-NEXT: .cfi_restore s090; RV64-NEXT: addi sp, sp, 14491; RV64-NEXT: .cfi_def_cfa_offset 092; RV64-NEXT: ret93 %c = alloca i6494 %a = call <vscale x 32 x i32> @callee_scalable_vector_split_indirect(<vscale x 32 x i32> zeroinitializer, <vscale x 32 x i32> %x)95 ret <vscale x 32 x i32> %a96}97 98define target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @caller_tuple_return() {99; RV32-LABEL: caller_tuple_return:100; RV32: # %bb.0:101; RV32-NEXT: addi sp, sp, -16102; RV32-NEXT: .cfi_def_cfa_offset 16103; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill104; RV32-NEXT: .cfi_offset ra, -4105; RV32-NEXT: call callee_tuple_return106; RV32-NEXT: vsetivli zero, 1, e8, m1, ta, ma107; RV32-NEXT: vmv2r.v v6, v8108; RV32-NEXT: vmv2r.v v8, v10109; RV32-NEXT: vmv2r.v v10, v6110; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload111; RV32-NEXT: .cfi_restore ra112; RV32-NEXT: addi sp, sp, 16113; RV32-NEXT: .cfi_def_cfa_offset 0114; RV32-NEXT: ret115;116; RV64-LABEL: caller_tuple_return:117; RV64: # %bb.0:118; RV64-NEXT: addi sp, sp, -16119; RV64-NEXT: .cfi_def_cfa_offset 16120; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill121; RV64-NEXT: .cfi_offset ra, -8122; RV64-NEXT: call callee_tuple_return123; RV64-NEXT: vsetivli zero, 1, e8, m1, ta, ma124; RV64-NEXT: vmv2r.v v6, v8125; RV64-NEXT: vmv2r.v v8, v10126; RV64-NEXT: vmv2r.v v10, v6127; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload128; RV64-NEXT: .cfi_restore ra129; RV64-NEXT: addi sp, sp, 16130; RV64-NEXT: .cfi_def_cfa_offset 0131; RV64-NEXT: ret132 %a = call target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @callee_tuple_return()133 %b = call <vscale x 4 x i32> @llvm.riscv.tuple.extract.nxv4i32.triscv.vector.tuple_nxv16i8_2t(target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %a, i32 0)134 %c = call <vscale x 4 x i32> @llvm.riscv.tuple.extract.nxv4i32.triscv.vector.tuple_nxv16i8_2t(target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %a, i32 1)135 %d = call target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv16i8_2t.nxv4i32(target("riscv.vector.tuple", <vscale x 16 x i8>, 2) poison, <vscale x 4 x i32> %c, i32 0)136 %e = call target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv16i8_2t.nxv4i32(target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %d, <vscale x 4 x i32> %b, i32 1)137 ret target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %e138}139 140declare target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @callee_tuple_return()141 142define void @caller_tuple_argument(target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %x) {143; RV32-LABEL: caller_tuple_argument:144; RV32: # %bb.0:145; RV32-NEXT: addi sp, sp, -16146; RV32-NEXT: .cfi_def_cfa_offset 16147; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill148; RV32-NEXT: .cfi_offset ra, -4149; RV32-NEXT: vsetivli zero, 1, e8, m1, ta, ma150; RV32-NEXT: vmv2r.v v6, v8151; RV32-NEXT: vmv2r.v v8, v10152; RV32-NEXT: vmv2r.v v10, v6153; RV32-NEXT: call callee_tuple_argument154; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload155; RV32-NEXT: .cfi_restore ra156; RV32-NEXT: addi sp, sp, 16157; RV32-NEXT: .cfi_def_cfa_offset 0158; RV32-NEXT: ret159;160; RV64-LABEL: caller_tuple_argument:161; RV64: # %bb.0:162; RV64-NEXT: addi sp, sp, -16163; RV64-NEXT: .cfi_def_cfa_offset 16164; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill165; RV64-NEXT: .cfi_offset ra, -8166; RV64-NEXT: vsetivli zero, 1, e8, m1, ta, ma167; RV64-NEXT: vmv2r.v v6, v8168; RV64-NEXT: vmv2r.v v8, v10169; RV64-NEXT: vmv2r.v v10, v6170; RV64-NEXT: call callee_tuple_argument171; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload172; RV64-NEXT: .cfi_restore ra173; RV64-NEXT: addi sp, sp, 16174; RV64-NEXT: .cfi_def_cfa_offset 0175; RV64-NEXT: ret176 %a = call <vscale x 4 x i32> @llvm.riscv.tuple.extract.nxv4i32.triscv.vector.tuple_nxv16i8_2t(target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %x, i32 0)177 %b = call <vscale x 4 x i32> @llvm.riscv.tuple.extract.nxv4i32.triscv.vector.tuple_nxv16i8_2t(target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %x, i32 1)178 %c = call target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv16i8_2t.nxv4i32(target("riscv.vector.tuple", <vscale x 16 x i8>, 2) poison, <vscale x 4 x i32> %b, i32 0)179 %d = call target("riscv.vector.tuple", <vscale x 16 x i8>, 2) @llvm.riscv.tuple.insert.triscv.vector.tuple_nxv16i8_2t.nxv4i32(target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %c, <vscale x 4 x i32> %a, i32 1)180 call void @callee_tuple_argument(target("riscv.vector.tuple", <vscale x 16 x i8>, 2) %d)181 ret void182}183 184declare void @callee_tuple_argument(target("riscv.vector.tuple", <vscale x 16 x i8>, 2))185