brintos

brintos / llvm-project-archived public Read only

0
0
Text · 42.4 KiB · bd1a3f8 Raw
656 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zvfh,+zvfbfmin,+m | FileCheck --check-prefixes=CHECK,RV32 %s3; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zvfh,+zvfbfmin,+m | FileCheck --check-prefixes=CHECK,RV64 %s4; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zvfhmin,+zvfbfmin,+m | FileCheck --check-prefixes=CHECK,RV32 %s5; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zvfhmin,+zvfbfmin,+m | FileCheck --check-prefixes=CHECK,RV64 %s6 7; Integers8 9define {<vscale x 16 x i1>, <vscale x 16 x i1>} @vector_deinterleave_load_nxv16i1_nxv32i1(ptr %p) {10; CHECK-LABEL: vector_deinterleave_load_nxv16i1_nxv32i1:11; CHECK:       # %bb.0:12; CHECK-NEXT:    vsetvli a1, zero, e8, m4, ta, ma13; CHECK-NEXT:    vlm.v v8, (a0)14; CHECK-NEXT:    csrr a0, vlenb15; CHECK-NEXT:    srli a0, a0, 216; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, ma17; CHECK-NEXT:    vslidedown.vx v0, v8, a018; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma19; CHECK-NEXT:    vmv.v.i v12, 020; CHECK-NEXT:    vmerge.vim v10, v12, 1, v021; CHECK-NEXT:    vmv1r.v v0, v822; CHECK-NEXT:    vmerge.vim v8, v12, 1, v023; CHECK-NEXT:    vnsrl.wi v12, v8, 024; CHECK-NEXT:    vnsrl.wi v14, v8, 825; CHECK-NEXT:    vmsne.vi v0, v12, 026; CHECK-NEXT:    vmsne.vi v8, v14, 027; CHECK-NEXT:    ret28  %vec = load <vscale x 32 x i1>, ptr %p29  %deinterleaved.results = call {<vscale x 16 x i1>, <vscale x 16 x i1>} @llvm.vector.deinterleave2.nxv32i1(<vscale x 32 x i1> %vec)30  %t0 = extractvalue { <vscale x 16 x i1>, <vscale x 16 x i1> } %deinterleaved.results, 031  %t1 = extractvalue { <vscale x 16 x i1>, <vscale x 16 x i1> } %deinterleaved.results, 132  %res0 = insertvalue { <vscale x 16 x i1>, <vscale x 16 x i1> } poison, <vscale x 16 x i1> %t0, 033  %res1 = insertvalue { <vscale x 16 x i1>, <vscale x 16 x i1> } %res0, <vscale x 16 x i1> %t1, 134  ret {<vscale x 16 x i1>, <vscale x 16 x i1>} %res135}36 37define {<vscale x 16 x i8>, <vscale x 16 x i8>} @vector_deinterleave_load_nxv16i8_nxv32i8(ptr %p) {38; CHECK-LABEL: vector_deinterleave_load_nxv16i8_nxv32i8:39; CHECK:       # %bb.0:40; CHECK-NEXT:    vsetvli a1, zero, e8, m2, ta, ma41; CHECK-NEXT:    vlseg2e8.v v8, (a0)42; CHECK-NEXT:    ret43  %vec = load <vscale x 32 x i8>, ptr %p44  %deinterleaved.results = call {<vscale x 16 x i8>, <vscale x 16 x i8>} @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %vec)45  %t0 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.results, 046  %t1 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.results, 147  %res0 = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> %t0, 048  %res1 = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %res0, <vscale x 16 x i8> %t1, 149  ret {<vscale x 16 x i8>, <vscale x 16 x i8>} %res150}51 52define <vscale x 16 x i8> @vector_deinterleave_load_nxv16i8_nxv32i8_oneactive(ptr %p) {53; CHECK-LABEL: vector_deinterleave_load_nxv16i8_nxv32i8_oneactive:54; CHECK:       # %bb.0:55; CHECK-NEXT:    vsetvli a1, zero, e8, m2, ta, ma56; CHECK-NEXT:    vlseg2e8.v v8, (a0)57; CHECK-NEXT:    ret58  %vec = load <vscale x 32 x i8>, ptr %p59  %deinterleaved.results = call {<vscale x 16 x i8>, <vscale x 16 x i8>} @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %vec)60  %t0 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.results, 061  ret <vscale x 16 x i8> %t062}63 64define <vscale x 16 x i8> @vector_deinterleave_load_nxv16i8_nxv32i8_oneactive2(ptr %p) {65; CHECK-LABEL: vector_deinterleave_load_nxv16i8_nxv32i8_oneactive2:66; CHECK:       # %bb.0:67; CHECK-NEXT:    vsetvli a1, zero, e8, m2, ta, ma68; CHECK-NEXT:    vlseg2e8.v v6, (a0)69; CHECK-NEXT:    ret70  %vec = load <vscale x 32 x i8>, ptr %p71  %deinterleaved.results = call {<vscale x 16 x i8>, <vscale x 16 x i8>} @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %vec)72  %t1 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.results, 173  ret <vscale x 16 x i8> %t174}75 76; Shouldn't be lowered to vlseg because it's unaligned77define {<vscale x 8 x i16>, <vscale x 8 x i16>} @vector_deinterleave_load_nxv8i16_nxv16i16_align1(ptr %p) {78; CHECK-LABEL: vector_deinterleave_load_nxv8i16_nxv16i16_align1:79; CHECK:       # %bb.0:80; CHECK-NEXT:    vl4r.v v12, (a0)81; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma82; CHECK-NEXT:    vnsrl.wi v8, v12, 083; CHECK-NEXT:    vnsrl.wi v10, v12, 1684; CHECK-NEXT:    ret85  %vec = load <vscale x 16 x i16>, ptr %p, align 186  %deinterleaved.results = call {<vscale x 8 x i16>, <vscale x 8 x i16>} @llvm.vector.deinterleave2.nxv16i16(<vscale x 16 x i16> %vec)87  %t0 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %deinterleaved.results, 088  %t1 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %deinterleaved.results, 189  %res0 = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> %t0, 090  %res1 = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %res0, <vscale x 8 x i16> %t1, 191  ret {<vscale x 8 x i16>, <vscale x 8 x i16>} %res192}93 94define {<vscale x 8 x i16>, <vscale x 8 x i16>} @vector_deinterleave_load_nxv8i16_nxv16i16(ptr %p) {95; CHECK-LABEL: vector_deinterleave_load_nxv8i16_nxv16i16:96; CHECK:       # %bb.0:97; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, ma98; CHECK-NEXT:    vlseg2e16.v v8, (a0)99; CHECK-NEXT:    ret100  %vec = load <vscale x 16 x i16>, ptr %p101  %deinterleaved.results = call {<vscale x 8 x i16>, <vscale x 8 x i16>} @llvm.vector.deinterleave2.nxv16i16(<vscale x 16 x i16> %vec)102  %t0 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %deinterleaved.results, 0103  %t1 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %deinterleaved.results, 1104  %res0 = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> %t0, 0105  %res1 = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %res0, <vscale x 8 x i16> %t1, 1106  ret {<vscale x 8 x i16>, <vscale x 8 x i16>} %res1107}108 109define {<vscale x 4 x i32>, <vscale x 4 x i32>} @vector_deinterleave_load_nxv4i32_nxvv8i32(ptr %p) {110; CHECK-LABEL: vector_deinterleave_load_nxv4i32_nxvv8i32:111; CHECK:       # %bb.0:112; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, ma113; CHECK-NEXT:    vlseg2e32.v v8, (a0)114; CHECK-NEXT:    ret115  %vec = load <vscale x 8 x i32>, ptr %p116  %deinterleaved.results = call {<vscale x 4 x i32>, <vscale x 4 x i32>} @llvm.vector.deinterleave2.nxv8i32(<vscale x 8 x i32> %vec)117  %t0 = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } %deinterleaved.results, 0118  %t1 = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } %deinterleaved.results, 1119  %res0 = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> %t0, 0120  %res1 = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } %res0, <vscale x 4 x i32> %t1, 1121  ret {<vscale x 4 x i32>, <vscale x 4 x i32>} %res1122}123 124define {<vscale x 2 x i64>, <vscale x 2 x i64>} @vector_deinterleave_load_nxv2i64_nxv4i64(ptr %p) {125; CHECK-LABEL: vector_deinterleave_load_nxv2i64_nxv4i64:126; CHECK:       # %bb.0:127; CHECK-NEXT:    vsetvli a1, zero, e64, m2, ta, ma128; CHECK-NEXT:    vlseg2e64.v v8, (a0)129; CHECK-NEXT:    ret130  %vec = load <vscale x 4 x i64>, ptr %p131  %deinterleaved.results = call {<vscale x 2 x i64>, <vscale x 2 x i64>} @llvm.vector.deinterleave2.nxv4i64(<vscale x 4 x i64> %vec)132  %t0 = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } %deinterleaved.results, 0133  %t1 = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } %deinterleaved.results, 1134  %res0 = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> %t0, 0135  %res1 = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } %res0, <vscale x 2 x i64> %t1, 1136  ret {<vscale x 2 x i64>, <vscale x 2 x i64>} %res1137}138 139define {<vscale x 4 x i64>, <vscale x 4 x i64>} @vector_deinterleave_load_nxv4i64_nxv8i64(ptr %p) {140; CHECK-LABEL: vector_deinterleave_load_nxv4i64_nxv8i64:141; CHECK:       # %bb.0:142; CHECK-NEXT:    vsetvli a1, zero, e64, m4, ta, ma143; CHECK-NEXT:    vlseg2e64.v v8, (a0)144; CHECK-NEXT:    ret145  %vec = load <vscale x 8 x i64>, ptr %p146  %deinterleaved.results = call {<vscale x 4 x i64>, <vscale x 4 x i64>} @llvm.vector.deinterleave2.nxv8i64(<vscale x 8 x i64> %vec)147  %t0 = extractvalue { <vscale x 4 x i64>, <vscale x 4 x i64> } %deinterleaved.results, 0148  %t1 = extractvalue { <vscale x 4 x i64>, <vscale x 4 x i64> } %deinterleaved.results, 1149  %res0 = insertvalue { <vscale x 4 x i64>, <vscale x 4 x i64> } poison, <vscale x 4 x i64> %t0, 0150  %res1 = insertvalue { <vscale x 4 x i64>, <vscale x 4 x i64> } %res0, <vscale x 4 x i64> %t1, 1151  ret {<vscale x 4 x i64>, <vscale x 4 x i64>} %res1152}153 154; This shouldn't be lowered to a vlseg because EMUL * NFIELDS >= 8155define {<vscale x 8 x i64>, <vscale x 8 x i64>} @vector_deinterleave_load_nxv8i64_nxv16i64(ptr %p) {156; CHECK-LABEL: vector_deinterleave_load_nxv8i64_nxv16i64:157; CHECK:       # %bb.0:158; CHECK-NEXT:    addi sp, sp, -16159; CHECK-NEXT:    .cfi_def_cfa_offset 16160; CHECK-NEXT:    csrr a1, vlenb161; CHECK-NEXT:    slli a1, a1, 4162; CHECK-NEXT:    sub sp, sp, a1163; CHECK-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb164; CHECK-NEXT:    li a1, 85165; CHECK-NEXT:    vsetvli a2, zero, e8, mf8, ta, ma166; CHECK-NEXT:    vmv.v.x v16, a1167; CHECK-NEXT:    csrr a1, vlenb168; CHECK-NEXT:    vl8re64.v v24, (a0)169; CHECK-NEXT:    slli a1, a1, 3170; CHECK-NEXT:    add a0, a0, a1171; CHECK-NEXT:    li a1, 170172; CHECK-NEXT:    vl8re64.v v0, (a0)173; CHECK-NEXT:    vmv.v.x v17, a1174; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma175; CHECK-NEXT:    vcompress.vm v8, v24, v16176; CHECK-NEXT:    vmv1r.v v12, v16177; CHECK-NEXT:    vmv1r.v v13, v17178; CHECK-NEXT:    vcompress.vm v16, v24, v13179; CHECK-NEXT:    vcompress.vm v24, v0, v12180; CHECK-NEXT:    addi a0, sp, 16181; CHECK-NEXT:    vs8r.v v24, (a0) # vscale x 64-byte Folded Spill182; CHECK-NEXT:    vcompress.vm v24, v0, v13183; CHECK-NEXT:    csrr a0, vlenb184; CHECK-NEXT:    slli a0, a0, 3185; CHECK-NEXT:    add a0, sp, a0186; CHECK-NEXT:    addi a0, a0, 16187; CHECK-NEXT:    vs8r.v v24, (a0) # vscale x 64-byte Folded Spill188; CHECK-NEXT:    addi a0, sp, 16189; CHECK-NEXT:    vl8r.v v24, (a0) # vscale x 64-byte Folded Reload190; CHECK-NEXT:    vmv4r.v v12, v24191; CHECK-NEXT:    csrr a0, vlenb192; CHECK-NEXT:    slli a0, a0, 3193; CHECK-NEXT:    add a0, sp, a0194; CHECK-NEXT:    addi a0, a0, 16195; CHECK-NEXT:    vl8r.v v24, (a0) # vscale x 64-byte Folded Reload196; CHECK-NEXT:    vmv4r.v v20, v24197; CHECK-NEXT:    csrr a0, vlenb198; CHECK-NEXT:    slli a0, a0, 4199; CHECK-NEXT:    add sp, sp, a0200; CHECK-NEXT:    .cfi_def_cfa sp, 16201; CHECK-NEXT:    addi sp, sp, 16202; CHECK-NEXT:    .cfi_def_cfa_offset 0203; CHECK-NEXT:    ret204  %vec = load <vscale x 16 x i64>, ptr %p205  %deinterleaved.results = call {<vscale x 8 x i64>, <vscale x 8 x i64>} @llvm.vector.deinterleave2.nxv16i64(<vscale x 16 x i64> %vec)206  %t0 = extractvalue { <vscale x 8 x i64>, <vscale x 8 x i64> } %deinterleaved.results, 0207  %t1 = extractvalue { <vscale x 8 x i64>, <vscale x 8 x i64> } %deinterleaved.results, 1208  %res0 = insertvalue { <vscale x 8 x i64>, <vscale x 8 x i64> } poison, <vscale x 8 x i64> %t0, 0209  %res1 = insertvalue { <vscale x 8 x i64>, <vscale x 8 x i64> } %res0, <vscale x 8 x i64> %t1, 1210  ret {<vscale x 8 x i64>, <vscale x 8 x i64>} %res1211}212 213; Floats214 215define {<vscale x 2 x bfloat>, <vscale x 2 x bfloat>} @vector_deinterleave_load_nxv2bf16_nxv4bf16(ptr %p) {216; CHECK-LABEL: vector_deinterleave_load_nxv2bf16_nxv4bf16:217; CHECK:       # %bb.0:218; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma219; CHECK-NEXT:    vlseg2e16.v v8, (a0)220; CHECK-NEXT:    ret221  %vec = load <vscale x 4 x bfloat>, ptr %p222  %deinterleaved.results = call {<vscale x 2 x bfloat>, <vscale x 2 x bfloat>} @llvm.vector.deinterleave2.nxv4bf16(<vscale x 4 x bfloat> %vec)223  %t0 = extractvalue { <vscale x 2 x bfloat>, <vscale x 2 x bfloat> } %deinterleaved.results, 0224  %t1 = extractvalue { <vscale x 2 x bfloat>, <vscale x 2 x bfloat> } %deinterleaved.results, 1225  %res0 = insertvalue { <vscale x 2 x bfloat>, <vscale x 2 x bfloat> } poison, <vscale x 2 x bfloat> %t0, 0226  %res1 = insertvalue { <vscale x 2 x bfloat>, <vscale x 2 x bfloat> } %res0, <vscale x 2 x bfloat> %t1, 1227  ret {<vscale x 2 x bfloat>, <vscale x 2 x bfloat>} %res1228}229 230define {<vscale x 4 x bfloat>, <vscale x 4 x bfloat>} @vector_deinterleave_load_nxv4bf16_nxv8bf16(ptr %p) {231; CHECK-LABEL: vector_deinterleave_load_nxv4bf16_nxv8bf16:232; CHECK:       # %bb.0:233; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, ma234; CHECK-NEXT:    vlseg2e16.v v8, (a0)235; CHECK-NEXT:    ret236  %vec = load <vscale x 8 x bfloat>, ptr %p237  %deinterleaved.results = call {<vscale x 4 x bfloat>, <vscale x 4 x bfloat>} @llvm.vector.deinterleave2.nxv8bf16(<vscale x 8 x bfloat> %vec)238  %t0 = extractvalue { <vscale x 4 x bfloat>, <vscale x 4 x bfloat> } %deinterleaved.results, 0239  %t1 = extractvalue { <vscale x 4 x bfloat>, <vscale x 4 x bfloat> } %deinterleaved.results, 1240  %res0 = insertvalue { <vscale x 4 x bfloat>, <vscale x 4 x bfloat> } poison, <vscale x 4 x bfloat> %t0, 0241  %res1 = insertvalue { <vscale x 4 x bfloat>, <vscale x 4 x bfloat> } %res0, <vscale x 4 x bfloat> %t1, 1242  ret {<vscale x 4 x bfloat>, <vscale x 4 x bfloat>} %res1243}244 245define {<vscale x 2 x half>, <vscale x 2 x half>} @vector_deinterleave_load_nxv2f16_nxv4f16(ptr %p) {246; CHECK-LABEL: vector_deinterleave_load_nxv2f16_nxv4f16:247; CHECK:       # %bb.0:248; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma249; CHECK-NEXT:    vlseg2e16.v v8, (a0)250; CHECK-NEXT:    ret251  %vec = load <vscale x 4 x half>, ptr %p252  %deinterleaved.results = call {<vscale x 2 x half>, <vscale x 2 x half>} @llvm.vector.deinterleave2.nxv4f16(<vscale x 4 x half> %vec)253  %t0 = extractvalue { <vscale x 2 x half>, <vscale x 2 x half> } %deinterleaved.results, 0254  %t1 = extractvalue { <vscale x 2 x half>, <vscale x 2 x half> } %deinterleaved.results, 1255  %res0 = insertvalue { <vscale x 2 x half>, <vscale x 2 x half> } poison, <vscale x 2 x half> %t0, 0256  %res1 = insertvalue { <vscale x 2 x half>, <vscale x 2 x half> } %res0, <vscale x 2 x half> %t1, 1257  ret {<vscale x 2 x half>, <vscale x 2 x half>} %res1258}259 260define {<vscale x 4 x half>, <vscale x 4 x half>} @vector_deinterleave_load_nxv4f16_nxv8f16(ptr %p) {261; CHECK-LABEL: vector_deinterleave_load_nxv4f16_nxv8f16:262; CHECK:       # %bb.0:263; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, ma264; CHECK-NEXT:    vlseg2e16.v v8, (a0)265; CHECK-NEXT:    ret266  %vec = load <vscale x 8 x half>, ptr %p267  %deinterleaved.results = call {<vscale x 4 x half>, <vscale x 4 x half>} @llvm.vector.deinterleave2.nxv8f16(<vscale x 8 x half> %vec)268  %t0 = extractvalue { <vscale x 4 x half>, <vscale x 4 x half> } %deinterleaved.results, 0269  %t1 = extractvalue { <vscale x 4 x half>, <vscale x 4 x half> } %deinterleaved.results, 1270  %res0 = insertvalue { <vscale x 4 x half>, <vscale x 4 x half> } poison, <vscale x 4 x half> %t0, 0271  %res1 = insertvalue { <vscale x 4 x half>, <vscale x 4 x half> } %res0, <vscale x 4 x half> %t1, 1272  ret {<vscale x 4 x half>, <vscale x 4 x half>} %res1273}274 275define {<vscale x 2 x float>, <vscale x 2 x float>} @vector_deinterleave_load_nxv2f32_nxv4f32(ptr %p) {276; CHECK-LABEL: vector_deinterleave_load_nxv2f32_nxv4f32:277; CHECK:       # %bb.0:278; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, ma279; CHECK-NEXT:    vlseg2e32.v v8, (a0)280; CHECK-NEXT:    ret281  %vec = load <vscale x 4 x float>, ptr %p282  %deinterleaved.results = call {<vscale x 2 x float>, <vscale x 2 x float>} @llvm.vector.deinterleave2.nxv4f32(<vscale x 4 x float> %vec)283  %t0 = extractvalue { <vscale x 2 x float>, <vscale x 2 x float> } %deinterleaved.results, 0284  %t1 = extractvalue { <vscale x 2 x float>, <vscale x 2 x float> } %deinterleaved.results, 1285  %res0 = insertvalue { <vscale x 2 x float>, <vscale x 2 x float> } poison, <vscale x 2 x float> %t0, 0286  %res1 = insertvalue { <vscale x 2 x float>, <vscale x 2 x float> } %res0, <vscale x 2 x float> %t1, 1287  ret {<vscale x 2 x float>, <vscale x 2 x float>} %res1288}289 290define {<vscale x 8 x bfloat>, <vscale x 8 x bfloat>} @vector_deinterleave_load_nxv8bf16_nxv16bf16(ptr %p) {291; CHECK-LABEL: vector_deinterleave_load_nxv8bf16_nxv16bf16:292; CHECK:       # %bb.0:293; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, ma294; CHECK-NEXT:    vlseg2e16.v v8, (a0)295; CHECK-NEXT:    ret296  %vec = load <vscale x 16 x bfloat>, ptr %p297  %deinterleaved.results = call {<vscale x 8 x bfloat>, <vscale x 8 x bfloat>} @llvm.vector.deinterleave2.nxv16bf16(<vscale x 16 x bfloat> %vec)298  %t0 = extractvalue { <vscale x 8 x bfloat>, <vscale x 8 x bfloat> } %deinterleaved.results, 0299  %t1 = extractvalue { <vscale x 8 x bfloat>, <vscale x 8 x bfloat> } %deinterleaved.results, 1300  %res0 = insertvalue { <vscale x 8 x bfloat>, <vscale x 8 x bfloat> } poison, <vscale x 8 x bfloat> %t0, 0301  %res1 = insertvalue { <vscale x 8 x bfloat>, <vscale x 8 x bfloat> } %res0, <vscale x 8 x bfloat> %t1, 1302  ret {<vscale x 8 x bfloat>, <vscale x 8 x bfloat>} %res1303}304 305define {<vscale x 8 x half>, <vscale x 8 x half>} @vector_deinterleave_load_nxv8f16_nxv16f16(ptr %p) {306; CHECK-LABEL: vector_deinterleave_load_nxv8f16_nxv16f16:307; CHECK:       # %bb.0:308; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, ma309; CHECK-NEXT:    vlseg2e16.v v8, (a0)310; CHECK-NEXT:    ret311  %vec = load <vscale x 16 x half>, ptr %p312  %deinterleaved.results = call {<vscale x 8 x half>, <vscale x 8 x half>} @llvm.vector.deinterleave2.nxv16f16(<vscale x 16 x half> %vec)313  %t0 = extractvalue { <vscale x 8 x half>, <vscale x 8 x half> } %deinterleaved.results, 0314  %t1 = extractvalue { <vscale x 8 x half>, <vscale x 8 x half> } %deinterleaved.results, 1315  %res0 = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } poison, <vscale x 8 x half> %t0, 0316  %res1 = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } %res0, <vscale x 8 x half> %t1, 1317  ret {<vscale x 8 x half>, <vscale x 8 x half>} %res1318}319 320define {<vscale x 4 x float>, <vscale x 4 x float>} @vector_deinterleave_load_nxv4f32_nxv8f32(ptr %p) {321; CHECK-LABEL: vector_deinterleave_load_nxv4f32_nxv8f32:322; CHECK:       # %bb.0:323; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, ma324; CHECK-NEXT:    vlseg2e32.v v8, (a0)325; CHECK-NEXT:    ret326  %vec = load <vscale x 8 x float>, ptr %p327  %deinterleaved.results = call {<vscale x 4 x float>, <vscale x 4 x float>} @llvm.vector.deinterleave2.nxv8f32(<vscale x 8 x float> %vec)328  %t0 = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } %deinterleaved.results, 0329  %t1 = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } %deinterleaved.results, 1330  %res0 = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } poison, <vscale x 4 x float> %t0, 0331  %res1 = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } %res0, <vscale x 4 x float> %t1, 1332  ret {<vscale x 4 x float>, <vscale x 4 x float>} %res1333}334 335define {<vscale x 2 x double>, <vscale x 2 x double>} @vector_deinterleave_load_nxv2f64_nxv4f64(ptr %p) {336; CHECK-LABEL: vector_deinterleave_load_nxv2f64_nxv4f64:337; CHECK:       # %bb.0:338; CHECK-NEXT:    vsetvli a1, zero, e64, m2, ta, ma339; CHECK-NEXT:    vlseg2e64.v v8, (a0)340; CHECK-NEXT:    ret341  %vec = load <vscale x 4 x double>, ptr %p342  %deinterleaved.results = call {<vscale x 2 x double>, <vscale x 2 x double>} @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %vec)343  %t0 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %deinterleaved.results, 0344  %t1 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %deinterleaved.results, 1345  %res0 = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } poison, <vscale x 2 x double> %t0, 0346  %res1 = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } %res0, <vscale x 2 x double> %t1, 1347  ret {<vscale x 2 x double>, <vscale x 2 x double>} %res1348}349 350define {<vscale x 2 x ptr>, <vscale x 2 x ptr>} @vector_deinterleave_load_nxv2p0_nxv4p0(ptr %p) {351; RV32-LABEL: vector_deinterleave_load_nxv2p0_nxv4p0:352; RV32:       # %bb.0:353; RV32-NEXT:    vsetvli a1, zero, e32, m1, ta, ma354; RV32-NEXT:    vlseg2e32.v v8, (a0)355; RV32-NEXT:    ret356;357; RV64-LABEL: vector_deinterleave_load_nxv2p0_nxv4p0:358; RV64:       # %bb.0:359; RV64-NEXT:    vsetvli a1, zero, e64, m2, ta, ma360; RV64-NEXT:    vlseg2e64.v v8, (a0)361; RV64-NEXT:    ret362  %vec = load <vscale x 4 x ptr>, ptr %p363  %deinterleaved.results = call {<vscale x 2 x ptr>, <vscale x 2 x ptr>} @llvm.vector.deinterleave2.nxv4p0(<vscale x 4 x ptr> %vec)364  %t0 = extractvalue { <vscale x 2 x ptr>, <vscale x 2 x ptr> } %deinterleaved.results, 0365  %t1 = extractvalue { <vscale x 2 x ptr>, <vscale x 2 x ptr> } %deinterleaved.results, 1366  %res0 = insertvalue { <vscale x 2 x ptr>, <vscale x 2 x ptr> } poison, <vscale x 2 x ptr> %t0, 0367  %res1 = insertvalue { <vscale x 2 x ptr>, <vscale x 2 x ptr> } %res0, <vscale x 2 x ptr> %t1, 1368  ret {<vscale x 2 x ptr>, <vscale x 2 x ptr>} %res1369}370 371define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor3(ptr %p) {372; CHECK-LABEL: vector_deinterleave_load_factor3:373; CHECK:       # %bb.0:374; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma375; CHECK-NEXT:    vlseg3e8.v v8, (a0)376; CHECK-NEXT:    ret377  %vec = load <vscale x 24 x i8>, ptr %p378  %d0 = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave3(<vscale x 24 x i8> %vec)379  %t0 = extractvalue {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %d0, 0380  %t1 = extractvalue {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %d0, 1381  %t2 = extractvalue {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %d0, 2382  %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0383  %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1384  %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2385  ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2386}387 388define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor4(ptr %p) {389; CHECK-LABEL: vector_deinterleave_load_factor4:390; CHECK:       # %bb.0:391; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma392; CHECK-NEXT:    vlseg4e8.v v8, (a0)393; CHECK-NEXT:    ret394  %vec = load <vscale x 32 x i8>, ptr %p395  %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave4(<vscale x 32 x i8> %vec)396  %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0397  %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1398  %t2 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 2399  %t3 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3400  %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0401  %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1402  %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2403  %res3 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2, <vscale x 8 x i8> %t3, 3404  ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res3405}406 407define <vscale x 8 x i8> @vector_deinterleave_load_factor4_oneactive(ptr %p) {408; CHECK-LABEL: vector_deinterleave_load_factor4_oneactive:409; CHECK:       # %bb.0:410; CHECK-NEXT:    li a1, 4411; CHECK-NEXT:    vsetvli a2, zero, e8, m1, ta, ma412; CHECK-NEXT:    vlse8.v v8, (a0), a1413; CHECK-NEXT:    ret414  %vec = load <vscale x 32 x i8>, ptr %p415  %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave4(<vscale x 32 x i8> %vec)416  %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0417  ret <vscale x 8 x i8> %t0418}419 420define <vscale x 8 x i8> @vector_deinterleave_load_factor4_oneactive2(ptr %p) {421; CHECK-LABEL: vector_deinterleave_load_factor4_oneactive2:422; CHECK:       # %bb.0:423; CHECK-NEXT:    addi a0, a0, 3424; CHECK-NEXT:    li a1, 4425; CHECK-NEXT:    vsetvli a2, zero, e8, m1, ta, ma426; CHECK-NEXT:    vlse8.v v8, (a0), a1427; CHECK-NEXT:    ret428  %vec = load <vscale x 32 x i8>, ptr %p429  %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave4(<vscale x 32 x i8> %vec)430  %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3431  ret <vscale x 8 x i8> %t0432}433 434define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor4_twoactive(ptr %p) {435; CHECK-LABEL: vector_deinterleave_load_factor4_twoactive:436; CHECK:       # %bb.0:437; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma438; CHECK-NEXT:    vlseg4e8.v v8, (a0)439; CHECK-NEXT:    ret440  %vec = load <vscale x 32 x i8>, ptr %p441  %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave4(<vscale x 32 x i8> %vec)442  %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0443  %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1444  %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0445  %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1446  ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1447}448 449define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor5(ptr %p) {450; CHECK-LABEL: vector_deinterleave_load_factor5:451; CHECK:       # %bb.0:452; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma453; CHECK-NEXT:    vlseg5e8.v v8, (a0)454; CHECK-NEXT:    ret455  %vec = load <vscale x 40 x i8>, ptr %p456  %d0 = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave5(<vscale x 40 x i8> %vec)457  %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0458  %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1459  %t2 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 2460  %t3 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3461  %t4 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 4462  %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0463  %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1464  %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2465  %res3 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2, <vscale x 8 x i8> %t3, 3466  %res4 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res3, <vscale x 8 x i8> %t4, 4467  ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res4468}469 470define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor6(ptr %p) {471; CHECK-LABEL: vector_deinterleave_load_factor6:472; CHECK:       # %bb.0:473; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma474; CHECK-NEXT:    vlseg6e8.v v8, (a0)475; CHECK-NEXT:    ret476  %vec = load <vscale x 48 x i8>, ptr %p477  %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave6(<vscale x 48 x i8> %vec)478  %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0479  %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1480  %t2 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 2481  %t3 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3482  %t4 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 4483  %t5 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 5484  %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0485  %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1486  %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2487  %res3 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2, <vscale x 8 x i8> %t3, 3488  %res4 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res3, <vscale x 8 x i8> %t4, 4489  %res5 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res4, <vscale x 8 x i8> %t5, 5490  ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res5491}492 493define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor7(ptr %p) {494; CHECK-LABEL: vector_deinterleave_load_factor7:495; CHECK:       # %bb.0:496; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma497; CHECK-NEXT:    vlseg7e8.v v8, (a0)498; CHECK-NEXT:    ret499  %vec = load <vscale x 56 x i8>, ptr %p500  %d0 = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave7(<vscale x 56 x i8> %vec)501  %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0502  %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1503  %t2 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 2504  %t3 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3505  %t4 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 4506  %t5 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 5507  %t6 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 6508  %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0509  %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1510  %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2511  %res3 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2, <vscale x 8 x i8> %t3, 3512  %res4 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res3, <vscale x 8 x i8> %t4, 4513  %res5 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res4, <vscale x 8 x i8> %t5, 5514  %res6 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res5, <vscale x 8 x i8> %t6, 6515  ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res6516}517 518define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor8(ptr %p) {519; CHECK-LABEL: vector_deinterleave_load_factor8:520; CHECK:       # %bb.0:521; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma522; CHECK-NEXT:    vlseg8e8.v v8, (a0)523; CHECK-NEXT:    ret524  %vec = load <vscale x 64 x i8>, ptr %p525  %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave8(<vscale x 64 x i8> %vec)526  %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0527  %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1528  %t2 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 2529  %t3 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3530  %t4 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 4531  %t5 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 5532  %t6 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 6533  %t7 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 7534  %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0535  %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1536  %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2537  %res3 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2, <vscale x 8 x i8> %t3, 3538  %res4 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res3, <vscale x 8 x i8> %t4, 4539  %res5 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res4, <vscale x 8 x i8> %t5, 5540  %res6 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res5, <vscale x 8 x i8> %t6, 6541  %res7 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res6, <vscale x 8 x i8> %t7, 7542  ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res7543}544 545define {<vscale x 16 x i8>, <vscale x 16 x i8>} @masked_load_factor2(ptr %p) {546; CHECK-LABEL: masked_load_factor2:547; CHECK:       # %bb.0:548; CHECK-NEXT:    vsetvli a1, zero, e8, m2, ta, ma549; CHECK-NEXT:    vlseg2e8.v v8, (a0)550; CHECK-NEXT:    ret551  %vec = call <vscale x 32 x i8> @llvm.masked.load(ptr %p, i32 4, <vscale x 32 x i1> splat (i1 true), <vscale x 32 x i8> poison)552  %deinterleaved.results = call {<vscale x 16 x i8>, <vscale x 16 x i8>} @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %vec)553  ret {<vscale x 16 x i8>, <vscale x 16 x i8>} %deinterleaved.results554}555 556define {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @masked_load_factor4(ptr %p) {557; CHECK-LABEL: masked_load_factor4:558; CHECK:       # %bb.0:559; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma560; CHECK-NEXT:    vlseg4e8.v v8, (a0)561; CHECK-NEXT:    ret562  %vec = call <vscale x 32 x i8> @llvm.masked.load(ptr %p, i32 4, <vscale x 32 x i1> splat (i1 true), <vscale x 32 x i8> poison)563  %deinterleaved.results = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave4.nxv32i8(<vscale x 32 x i8> %vec)564  ret {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %deinterleaved.results565}566 567define {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @masked_load_factor4_mask(ptr %p, <vscale x 8 x i1> %mask) {568; CHECK-LABEL: masked_load_factor4_mask:569; CHECK:       # %bb.0:570; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma571; CHECK-NEXT:    vlseg4e8.v v8, (a0), v0.t572; CHECK-NEXT:    ret573  %interleaved.mask = tail call <vscale x 32 x i1> @llvm.vector.interleave4.nxv32i1(<vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask)574  %vec = call <vscale x 32 x i8> @llvm.masked.load(ptr %p, i32 4, <vscale x 32 x i1> %interleaved.mask, <vscale x 32 x i8> poison)575  %deinterleaved.results = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave4.nxv32i8(<vscale x 32 x i8> %vec)576  ret {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %deinterleaved.results577}578 579; Negative test - some of the deinterleaved elements might come from the580; passthru not the load581define {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @masked_load_factor4_passthru(ptr %p, <vscale x 8 x i1> %mask, <vscale x 32 x i8> %passthru) {582; CHECK-LABEL: masked_load_factor4_passthru:583; CHECK:       # %bb.0:584; CHECK-NEXT:    addi sp, sp, -16585; CHECK-NEXT:    .cfi_def_cfa_offset 16586; CHECK-NEXT:    csrr a1, vlenb587; CHECK-NEXT:    slli a1, a1, 3588; CHECK-NEXT:    sub sp, sp, a1589; CHECK-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb590; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma591; CHECK-NEXT:    vmv.v.i v12, 0592; CHECK-NEXT:    addi a1, sp, 16593; CHECK-NEXT:    csrr a2, vlenb594; CHECK-NEXT:    vmerge.vim v12, v12, 1, v0595; CHECK-NEXT:    add a3, a1, a2596; CHECK-NEXT:    vmv.v.v v13, v12597; CHECK-NEXT:    srli a4, a2, 2598; CHECK-NEXT:    vmv.v.v v14, v12599; CHECK-NEXT:    srli a5, a2, 3600; CHECK-NEXT:    vmv.v.v v15, v12601; CHECK-NEXT:    vsseg4e8.v v12, (a1)602; CHECK-NEXT:    vl1r.v v12, (a1)603; CHECK-NEXT:    add a1, a4, a5604; CHECK-NEXT:    vl1r.v v13, (a3)605; CHECK-NEXT:    add a3, a3, a2606; CHECK-NEXT:    add a2, a3, a2607; CHECK-NEXT:    vl1r.v v14, (a3)608; CHECK-NEXT:    vl1r.v v15, (a2)609; CHECK-NEXT:    vmsne.vi v13, v13, 0610; CHECK-NEXT:    vmsne.vi v0, v12, 0611; CHECK-NEXT:    vmsne.vi v12, v14, 0612; CHECK-NEXT:    vmsne.vi v14, v15, 0613; CHECK-NEXT:    vsetvli zero, a4, e8, mf2, tu, ma614; CHECK-NEXT:    vslideup.vx v0, v13, a5615; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, tu, ma616; CHECK-NEXT:    vslideup.vx v0, v12, a4617; CHECK-NEXT:    vsetvli a2, zero, e8, mf2, ta, ma618; CHECK-NEXT:    vslideup.vx v0, v14, a1619; CHECK-NEXT:    vsetvli a1, zero, e8, m4, ta, mu620; CHECK-NEXT:    vle8.v v8, (a0), v0.t621; CHECK-NEXT:    csrr a0, vlenb622; CHECK-NEXT:    slli a0, a0, 2623; CHECK-NEXT:    add a0, sp, a0624; CHECK-NEXT:    addi a0, a0, 16625; CHECK-NEXT:    vs4r.v v8, (a0)626; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma627; CHECK-NEXT:    vlseg4e8.v v8, (a0)628; CHECK-NEXT:    csrr a0, vlenb629; CHECK-NEXT:    slli a0, a0, 3630; CHECK-NEXT:    add sp, sp, a0631; CHECK-NEXT:    .cfi_def_cfa sp, 16632; CHECK-NEXT:    addi sp, sp, 16633; CHECK-NEXT:    .cfi_def_cfa_offset 0634; CHECK-NEXT:    ret635  %interleaved.mask = tail call <vscale x 32 x i1> @llvm.vector.interleave4.nxv32i1(<vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask)636  %vec = call <vscale x 32 x i8> @llvm.masked.load(ptr %p, i32 4, <vscale x 32 x i1> %interleaved.mask, <vscale x 32 x i8> %passthru)637  %deinterleaved.results = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave4.nxv32i8(<vscale x 32 x i8> %vec)638  ret {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %deinterleaved.results639}640 641define { <8 x float>, <8 x float> } @deinterleave_unrelated(<16 x float> %arg) {642; CHECK-LABEL: deinterleave_unrelated:643; CHECK:       # %bb.0: # %entry644; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma645; CHECK-NEXT:    vfabs.v v12, v8646; CHECK-NEXT:    li a0, 32647; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma648; CHECK-NEXT:    vnsrl.wx v10, v12, a0649; CHECK-NEXT:    vnsrl.wi v8, v12, 0650; CHECK-NEXT:    ret651entry:652  %abs = call <16 x float> @llvm.fabs(<16 x float> %arg)653  %res = call { <8 x float>, <8 x float> } @llvm.vector.deinterleave2.v16f32(<16 x float> %abs)654  ret { <8 x float>, <8 x float> } %res655}656