brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.0 KiB · c9b77a2 Raw
288 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s3 4define { <vscale x 16 x i8>, <vscale x 16 x i8> } @foo_ld2_nxv16i8(<vscale x 16 x i1> %mask, ptr %p) {5; CHECK-LABEL: foo_ld2_nxv16i8:6; CHECK:       // %bb.0:7; CHECK-NEXT:    ld2b { z0.b, z1.b }, p0/z, [x0]8; CHECK-NEXT:    ret9  %interleaved.mask = call <vscale x 32 x i1> @llvm.vector.interleave2.nxv32i1(<vscale x 16 x i1> %mask, <vscale x 16 x i1> %mask)10  %wide.masked.vec = call <vscale x 32 x i8> @llvm.masked.load.nxv32i8(ptr %p, i32 1, <vscale x 32 x i1> %interleaved.mask, <vscale x 32 x i8> poison)11  %deinterleaved.vec = call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %wide.masked.vec)12  ret { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.vec13}14 15define { <vscale x 8 x i16>, <vscale x 8 x i16> } @foo_ld2_nxv8i16(<vscale x 8 x i1> %mask, ptr %p) {16; CHECK-LABEL: foo_ld2_nxv8i16:17; CHECK:       // %bb.0:18; CHECK-NEXT:    ld2h { z0.h, z1.h }, p0/z, [x0]19; CHECK-NEXT:    ret20  %interleaved.mask = call <vscale x 16 x i1> @llvm.vector.interleave2.nxv16i1(<vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask)21  %wide.masked.vec = call <vscale x 16 x i16> @llvm.masked.load.nxv16i16.p0(ptr %p, i32 2, <vscale x 16 x i1> %interleaved.mask, <vscale x 16 x i16> poison)22  %deinterleaved.vec = call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.vector.deinterleave2.nxv16i16(<vscale x 16 x i16> %wide.masked.vec)23  ret { <vscale x 8 x i16>, <vscale x 8 x i16> } %deinterleaved.vec24}25 26define { <vscale x 4 x float>, <vscale x 4 x float> } @foo_ld2_nxv4f32(<vscale x 4 x i1> %mask, ptr %p) {27; CHECK-LABEL: foo_ld2_nxv4f32:28; CHECK:       // %bb.0:29; CHECK-NEXT:    ld2w { z0.s, z1.s }, p0/z, [x0]30; CHECK-NEXT:    ret31  %interleaved.mask = call <vscale x 8 x i1> @llvm.vector.interleave2.nxv8i1(<vscale x 4 x i1> %mask, <vscale x 4 x i1> %mask)32  %wide.masked.vec = call <vscale x 8 x float> @llvm.masked.load.nxv8f32(ptr %p, i32 4, <vscale x 8 x i1> %interleaved.mask, <vscale x 8 x float> poison)33  %deinterleaved.vec = call { <vscale x 4 x float>, <vscale x 4 x float> } @llvm.vector.deinterleave2.nxv8f32(<vscale x 8 x float> %wide.masked.vec)34  ret { <vscale x 4 x float>, <vscale x 4 x float> } %deinterleaved.vec35}36 37define { <vscale x 2 x double>, <vscale x 2 x double> } @foo_ld2_nxv2f64(<vscale x 2 x i1> %mask, ptr %p) {38; CHECK-LABEL: foo_ld2_nxv2f64:39; CHECK:       // %bb.0:40; CHECK-NEXT:    ld2d { z0.d, z1.d }, p0/z, [x0]41; CHECK-NEXT:    ret42  %interleaved.mask = call <vscale x 4 x i1> @llvm.vector.interleave2.nxv4i1(<vscale x 2 x i1> %mask, <vscale x 2 x i1> %mask)43  %wide.masked.vec = call <vscale x 4 x double> @llvm.masked.load.nxv4f64(ptr %p, i32 8, <vscale x 4 x i1> %interleaved.mask, <vscale x 4 x double> poison)44  %deinterleaved.vec = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %wide.masked.vec)45  ret { <vscale x 2 x double>, <vscale x 2 x double> } %deinterleaved.vec46}47 48define { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @foo_ld4_nxv16i8(<vscale x 16 x i1> %mask, ptr %p) {49; CHECK-LABEL: foo_ld4_nxv16i8:50; CHECK:       // %bb.0:51; CHECK-NEXT:    ld4b { z0.b - z3.b }, p0/z, [x0]52; CHECK-NEXT:    ret53  %interleaved.mask = call <vscale x 64 x i1> @llvm.vector.interleave4.nxv64i1(<vscale x 16 x i1> %mask, <vscale x 16 x i1> %mask, <vscale x 16 x i1> %mask, <vscale x 16 x i1> %mask)54  %wide.masked.vec = call <vscale x 64 x i8> @llvm.masked.load.nxv64i8(ptr %p, i32 1, <vscale x 64 x i1> %interleaved.mask, <vscale x 64 x i8> poison)55  %deinterleaved.vec = call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.vector.deinterleave4.nxv64i8(<vscale x 64 x i8> %wide.masked.vec)56  ret { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.vec57}58 59define { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @foo_ld4_nxv8i16(<vscale x 8 x i1> %mask, ptr %p) {60; CHECK-LABEL: foo_ld4_nxv8i16:61; CHECK:       // %bb.0:62; CHECK-NEXT:    ld4h { z0.h - z3.h }, p0/z, [x0]63; CHECK-NEXT:    ret64  %interleaved.mask = 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)65  %wide.masked.vec = call <vscale x 32 x i16> @llvm.masked.load.nxv32i16(ptr %p, i32 2, <vscale x 32 x i1> %interleaved.mask, <vscale x 32 x i16> poison)66  %deinterleaved.vec = call { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.vector.deinterleave4.nxv32i16(<vscale x 32 x i16> %wide.masked.vec)67  ret { <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16> } %deinterleaved.vec68}69 70define { <vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float> } @foo_ld4_nxv4f32(<vscale x 4 x i1> %mask, ptr %p) {71; CHECK-LABEL: foo_ld4_nxv4f32:72; CHECK:       // %bb.0:73; CHECK-NEXT:    ld4w { z0.s - z3.s }, p0/z, [x0]74; CHECK-NEXT:    ret75  %interleaved.mask = call <vscale x 16 x i1> @llvm.vector.interleave4.nxv16i1(<vscale x 4 x i1> %mask, <vscale x 4 x i1> %mask, <vscale x 4 x i1> %mask, <vscale x 4 x i1> %mask)76  %wide.masked.vec = call <vscale x 16 x float> @llvm.masked.load.nxv16f32(ptr %p, i32 4, <vscale x 16 x i1> %interleaved.mask, <vscale x 16 x float> poison)77  %deinterleaved.vec = call { <vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float> } @llvm.vector.deinterleave4.nxv16f32(<vscale x 16 x float> %wide.masked.vec)78  ret { <vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float> } %deinterleaved.vec79}80 81define { <vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double> } @foo_ld4_nxv2f64(<vscale x 2 x i1> %mask, ptr %p) {82; CHECK-LABEL: foo_ld4_nxv2f64:83; CHECK:       // %bb.0:84; CHECK-NEXT:    ld4d { z0.d - z3.d }, p0/z, [x0]85; CHECK-NEXT:    ret86  %interleaved.mask = call <vscale x 8 x i1> @llvm.vector.interleave4.nxv8i1(<vscale x 2 x i1> %mask, <vscale x 2 x i1> %mask, <vscale x 2 x i1> %mask, <vscale x 2 x i1> %mask)87  %wide.masked.vec = call <vscale x 8 x double> @llvm.masked.load.nxv8f64(ptr %p, i32 8, <vscale x 8 x i1> %interleaved.mask, <vscale x 8 x double> poison)88  %deinterleaved.vec = call { <vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave4.nxv8f64(<vscale x 8 x double> %wide.masked.vec)89  ret { <vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double> } %deinterleaved.vec90}91 92 93define { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @foo_ld4_nxv16i8_mul_use_of_mask(<vscale x 16 x i1> %mask, ptr %p, ptr %p2) {94; CHECK-LABEL: foo_ld4_nxv16i8_mul_use_of_mask:95; CHECK:       // %bb.0:96; CHECK-NEXT:    zip1 p2.b, p0.b, p0.b97; CHECK-NEXT:    ld4b { z0.b - z3.b }, p0/z, [x0]98; CHECK-NEXT:    zip2 p1.b, p0.b, p0.b99; CHECK-NEXT:    zip1 p3.b, p2.b, p2.b100; CHECK-NEXT:    zip2 p0.b, p1.b, p1.b101; CHECK-NEXT:    zip1 p1.b, p1.b, p1.b102; CHECK-NEXT:    zip2 p2.b, p2.b, p2.b103; CHECK-NEXT:    // fake_use: $p3104; CHECK-NEXT:    // fake_use: $p2105; CHECK-NEXT:    // fake_use: $p1106; CHECK-NEXT:    // fake_use: $p0107; CHECK-NEXT:    ret108  %interleaved.mask = call <vscale x 64 x i1> @llvm.vector.interleave4.nxv64i1(<vscale x 16 x i1> %mask, <vscale x 16 x i1> %mask, <vscale x 16 x i1> %mask, <vscale x 16 x i1> %mask)109  %wide.masked.vec = call <vscale x 64 x i8> @llvm.masked.load.nxv64i8(ptr %p, i32 4, <vscale x 64 x i1> %interleaved.mask, <vscale x 64 x i8> poison)110  %deinterleaved.vec = call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.vector.deinterleave4.nxv64i8(<vscale x 64 x i8> %wide.masked.vec)111  call void (...) @llvm.fake.use(<vscale x 64 x i1> %interleaved.mask)112  ret { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.vec113}114 115define { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @foo_ld4_nxv16i8_mask_of_interleaved_ones(ptr %p) {116; CHECK-LABEL: foo_ld4_nxv16i8_mask_of_interleaved_ones:117; CHECK:       // %bb.0:118; CHECK-NEXT:    ptrue p0.b119; CHECK-NEXT:    ld4b { z0.b - z3.b }, p0/z, [x0]120; CHECK-NEXT:    ret121  %interleaved.mask = call <vscale x 64 x i1> @llvm.vector.interleave4.nxv64i1(<vscale x 16 x i1> splat(i1 1), <vscale x 16 x i1> splat(i1 1), <vscale x 16 x i1> splat(i1 1), <vscale x 16 x i1> splat(i1 1))122  %wide.masked.vec = call <vscale x 64 x i8> @llvm.masked.load.nxv64i8(ptr %p, i32 4, <vscale x 64 x i1> %interleaved.mask, <vscale x 64 x i8> poison)123  %deinterleaved.vec = call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.vector.deinterleave4.nxv64i8(<vscale x 64 x i8> %wide.masked.vec)124  ret { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.vec125}126 127define { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @foo_ld4_nxv16i8_mask_of_ones(ptr %p) {128; CHECK-LABEL: foo_ld4_nxv16i8_mask_of_ones:129; CHECK:       // %bb.0:130; CHECK-NEXT:    ptrue p0.b131; CHECK-NEXT:    ld4b { z0.b - z3.b }, p0/z, [x0]132; CHECK-NEXT:    ret133  %wide.masked.vec = call <vscale x 64 x i8> @llvm.masked.load.nxv64i8(ptr %p, i32 4, <vscale x 64 x i1> splat(i1 1), <vscale x 64 x i8> poison)134  %deinterleaved.vec = call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.vector.deinterleave4.nxv64i8(<vscale x 64 x i8> %wide.masked.vec)135  ret { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.vec136}137 138 139; Negative tests140 141define { <vscale x 16 x i8>, <vscale x 16 x i8> } @foo_ld2_nxv16i8_mul_use_of_load(<vscale x 16 x i1> %mask, ptr %p, ptr %p2) {142; CHECK-LABEL: foo_ld2_nxv16i8_mul_use_of_load:143; CHECK:       // %bb.0:144; CHECK-NEXT:    zip1 p1.b, p0.b, p0.b145; CHECK-NEXT:    zip2 p0.b, p0.b, p0.b146; CHECK-NEXT:    ld1b { z3.b }, p1/z, [x0]147; CHECK-NEXT:    ld1b { z2.b }, p0/z, [x0, #1, mul vl]148; CHECK-NEXT:    uzp1 z0.b, z3.b, z2.b149; CHECK-NEXT:    uzp2 z1.b, z3.b, z2.b150; CHECK-NEXT:    // fake_use: $z3151; CHECK-NEXT:    // fake_use: $z2152; CHECK-NEXT:    ret153  %interleaved.mask = call <vscale x 32 x i1> @llvm.vector.interleave2.nxv32i1(<vscale x 16 x i1> %mask, <vscale x 16 x i1> %mask)154  %wide.masked.vec = call <vscale x 32 x i8> @llvm.masked.load.nxv32i8(ptr %p, i32 4, <vscale x 32 x i1> %interleaved.mask, <vscale x 32 x i8> poison)155  %deinterleaved.vec = call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %wide.masked.vec)156  call void (...) @llvm.fake.use(<vscale x 32 x i8> %wide.masked.vec)157  ret { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.vec158}159 160; Mask must be an interleave of identical masks.161define { <vscale x 16 x i8>, <vscale x 16 x i8> } @foo_ld2_nxv16i8_bad_mask(<vscale x 16 x i1> %mask, <vscale x 16 x i1> %mask2, ptr %p, ptr %p2) {162; CHECK-LABEL: foo_ld2_nxv16i8_bad_mask:163; CHECK:       // %bb.0:164; CHECK-NEXT:    zip1 p2.b, p0.b, p1.b165; CHECK-NEXT:    zip2 p0.b, p0.b, p1.b166; CHECK-NEXT:    ld1b { z2.b }, p2/z, [x0]167; CHECK-NEXT:    ld1b { z1.b }, p0/z, [x0, #1, mul vl]168; CHECK-NEXT:    uzp1 z0.b, z2.b, z1.b169; CHECK-NEXT:    uzp2 z1.b, z2.b, z1.b170; CHECK-NEXT:    ret171  %interleaved.mask = call <vscale x 32 x i1> @llvm.vector.interleave2.nxv32i1(<vscale x 16 x i1> %mask, <vscale x 16 x i1> %mask2)172  %wide.masked.vec = call <vscale x 32 x i8> @llvm.masked.load.nxv32i8(ptr %p, i32 4, <vscale x 32 x i1> %interleaved.mask, <vscale x 32 x i8> poison)173  %deinterleaved.vec = call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %wide.masked.vec)174  ret { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.vec175}176 177; Number of parts in mask interleave must match deinterleave.178define { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @foo_ld4_nxv16i8_bad_mask2(<vscale x 32 x i1> %mask, ptr %p, ptr %p2) {179; CHECK-LABEL: foo_ld4_nxv16i8_bad_mask2:180; CHECK:       // %bb.0:181; CHECK-NEXT:    zip1 p2.b, p1.b, p1.b182; CHECK-NEXT:    zip2 p1.b, p1.b, p1.b183; CHECK-NEXT:    zip2 p3.b, p0.b, p0.b184; CHECK-NEXT:    ld1b { z3.b }, p2/z, [x0, #2, mul vl]185; CHECK-NEXT:    zip1 p0.b, p0.b, p0.b186; CHECK-NEXT:    ld1b { z2.b }, p1/z, [x0, #3, mul vl]187; CHECK-NEXT:    ld1b { z0.b }, p3/z, [x0, #1, mul vl]188; CHECK-NEXT:    ld1b { z1.b }, p0/z, [x0]189; CHECK-NEXT:    uzp1 z4.b, z3.b, z2.b190; CHECK-NEXT:    uzp2 z3.b, z3.b, z2.b191; CHECK-NEXT:    uzp1 z5.b, z1.b, z0.b192; CHECK-NEXT:    uzp2 z6.b, z1.b, z0.b193; CHECK-NEXT:    uzp1 z0.b, z5.b, z4.b194; CHECK-NEXT:    uzp1 z1.b, z6.b, z3.b195; CHECK-NEXT:    uzp2 z2.b, z5.b, z4.b196; CHECK-NEXT:    uzp2 z3.b, z6.b, z3.b197; CHECK-NEXT:    ret198  %interleaved.mask = call <vscale x 64 x i1> @llvm.vector.interleave2.nxv64i1(<vscale x 32 x i1> %mask, <vscale x 32 x i1> %mask)199  %wide.masked.vec = call <vscale x 64 x i8> @llvm.masked.load.nxv64i8(ptr %p, i32 4, <vscale x 64 x i1> %interleaved.mask, <vscale x 64 x i8> poison)200  %deinterleaved.vec = call { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.vector.deinterleave4.nxv64i8(<vscale x 64 x i8> %wide.masked.vec)201  ret { <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.vec202}203 204; Mask must come from an interleave or a splat.205define { <vscale x 16 x i8>, <vscale x 16 x i8> } @foo_ld2_nxv16i8_bad_mask3(<vscale x 32 x i1> %mask, ptr %p, ptr %p2) {206; CHECK-LABEL: foo_ld2_nxv16i8_bad_mask3:207; CHECK:       // %bb.0:208; CHECK-NEXT:    ld1b { z1.b }, p1/z, [x0, #1, mul vl]209; CHECK-NEXT:    ld1b { z2.b }, p0/z, [x0]210; CHECK-NEXT:    uzp1 z0.b, z2.b, z1.b211; CHECK-NEXT:    uzp2 z1.b, z2.b, z1.b212; CHECK-NEXT:    ret213  %wide.masked.vec = call <vscale x 32 x i8> @llvm.masked.load.nxv32i8(ptr %p, i32 4, <vscale x 32 x i1> %mask, <vscale x 32 x i8> poison)214  %deinterleaved.vec = call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %wide.masked.vec)215  ret { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.vec216}217 218; Each deinterleaved vector must be exactly 128 bits.219define { <vscale x 8 x i8>, <vscale x 8 x i8> } @foo_ld2_nxv8i8(<vscale x 8 x i1> %mask, ptr %p) {220; CHECK-LABEL: foo_ld2_nxv8i8:221; CHECK:       // %bb.0:222; CHECK-NEXT:    zip2 p1.h, p0.h, p0.h223; CHECK-NEXT:    zip1 p0.h, p0.h, p0.h224; CHECK-NEXT:    uzp1 p0.b, p0.b, p1.b225; CHECK-NEXT:    ld1b { z0.b }, p0/z, [x0]226; CHECK-NEXT:    uunpkhi z1.h, z0.b227; CHECK-NEXT:    uunpklo z2.h, z0.b228; CHECK-NEXT:    uzp1 z0.h, z2.h, z1.h229; CHECK-NEXT:    uzp2 z1.h, z2.h, z1.h230; CHECK-NEXT:    ret231  %interleaved.mask = call <vscale x 16 x i1> @llvm.vector.interleave2.nxv16i1(<vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask)232  %wide.masked.vec = call <vscale x 16 x i8> @llvm.masked.load.nxv16i8(ptr %p, i32 1, <vscale x 16 x i1> %interleaved.mask, <vscale x 16 x i8> poison)233  %deinterleaved.vec = call { <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave2.nxv16i8(<vscale x 16 x i8> %wide.masked.vec)234  ret { <vscale x 8 x i8>, <vscale x 8 x i8> } %deinterleaved.vec235}236 237; Passthru must be poison or zero.238define { <vscale x 16 x i8>, <vscale x 16 x i8> } @foo_ld2_nxv16i8_bad_passthru(<vscale x 16 x i1> %mask, ptr %p) {239; CHECK-LABEL: foo_ld2_nxv16i8_bad_passthru:240; CHECK:       // %bb.0:241; CHECK-NEXT:    zip1 p1.b, p0.b, p0.b242; CHECK-NEXT:    mov z0.b, #3 // =0x3243; CHECK-NEXT:    zip2 p0.b, p0.b, p0.b244; CHECK-NEXT:    ld1b { z2.b }, p1/z, [x0]245; CHECK-NEXT:    ld1b { z1.b }, p0/z, [x0, #1, mul vl]246; CHECK-NEXT:    sel z2.b, p1, z2.b, z0.b247; CHECK-NEXT:    sel z1.b, p0, z1.b, z0.b248; CHECK-NEXT:    uzp1 z0.b, z2.b, z1.b249; CHECK-NEXT:    uzp2 z1.b, z2.b, z1.b250; CHECK-NEXT:    ret251  %interleaved.mask = call <vscale x 32 x i1> @llvm.vector.interleave2.nxv32i1(<vscale x 16 x i1> %mask, <vscale x 16 x i1> %mask)252  %wide.masked.vec = call <vscale x 32 x i8> @llvm.masked.load.nxv32i8(ptr %p, i32 1, <vscale x 32 x i1> %interleaved.mask, <vscale x 32 x i8> splat(i8 3))253  %deinterleaved.vec = call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %wide.masked.vec)254  ret { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.vec255}256 257define { <vscale x 8 x i16>, <vscale x 8 x i16> } @foo_deinterleave2_not_load(<vscale x 8 x i16> %vec1, <vscale x 8 x i16> %vec2) {258; CHECK-LABEL: foo_deinterleave2_not_load:259; CHECK:       // %bb.0:260; CHECK-NEXT:    uzp1 z2.h, z0.h, z1.h261; CHECK-NEXT:    uzp2 z1.h, z0.h, z1.h262; CHECK-NEXT:    mov z0.d, z2.d263; CHECK-NEXT:    ret264  %bad.vec.init = call <vscale x 16 x i16> @llvm.vector.insert.nxv16i16(<vscale x 16 x i16> poison, <vscale x 8 x i16> %vec1, i64 0)265  %bad.vec = call <vscale x 16 x i16> @llvm.vector.insert.nxv16i16(<vscale x 16 x i16> %bad.vec.init, <vscale x 8 x i16> %vec2, i64 8)266  %deinterleaved.vec = call { <vscale x 8 x i16>, <vscale x 8 x i16> } @llvm.vector.deinterleave2.nxv16i16(<vscale x 16 x i16> %bad.vec)267  ret { <vscale x 8 x i16>, <vscale x 8 x i16> } %deinterleaved.vec268}269 270define { <vscale x 4 x i16>, <vscale x 4 x i16> } @foo_ld2_nxv8i8_exti16(<vscale x 4 x i1> %mask, ptr %p) {271; CHECK-LABEL: foo_ld2_nxv8i8_exti16:272; CHECK:       // %bb.0:273; CHECK-NEXT:    zip2 p1.s, p0.s, p0.s274; CHECK-NEXT:    zip1 p0.s, p0.s, p0.s275; CHECK-NEXT:    uzp1 p0.h, p0.h, p1.h276; CHECK-NEXT:    ld1b { z0.h }, p0/z, [x0]277; CHECK-NEXT:    uunpkhi z1.s, z0.h278; CHECK-NEXT:    uunpklo z2.s, z0.h279; CHECK-NEXT:    uzp1 z0.s, z2.s, z1.s280; CHECK-NEXT:    uzp2 z1.s, z2.s, z1.s281; CHECK-NEXT:    ret282  %interleaved.mask = call <vscale x 8 x i1> @llvm.vector.interleave2.nxv8i1(<vscale x 4 x i1> %mask, <vscale x 4 x i1> %mask)283  %wide.masked.vec = call <vscale x 8 x i8> @llvm.masked.load.nxv8i8(ptr %p, i32 1, <vscale x 8 x i1> %interleaved.mask, <vscale x 8 x i8> poison)284  %wide.masked.vec.ext = zext <vscale x 8 x i8> %wide.masked.vec to <vscale x 8 x i16>285  %deinterleaved.vec = call { <vscale x 4 x i16>, <vscale x 4 x i16> } @llvm.vector.deinterleave2.nxv8i16(<vscale x 8 x i16> %wide.masked.vec.ext)286  ret { <vscale x 4 x i16>, <vscale x 4 x i16> } %deinterleaved.vec287}288