diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h @@ -131,6 +131,7 @@ bool selectVSplatUimm5(SDValue N, SDValue &SplatVal); bool selectVSplatSimm5Plus1(SDValue N, SDValue &SplatVal); bool selectVSplatSimm5Plus1NonZero(SDValue N, SDValue &SplatVal); + bool selectExtOneUseVSplat(SDValue N, SDValue &SplatVal); bool selectFPImm(SDValue N, SDValue &Imm); bool selectRVVSimm5(SDValue N, unsigned Width, SDValue &Imm); diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -3016,6 +3016,16 @@ return true; } +bool RISCVDAGToDAGISel::selectExtOneUseVSplat(SDValue N, SDValue &SplatVal) { + if (N->getOpcode() == ISD::SIGN_EXTEND || + N->getOpcode() == ISD::ZERO_EXTEND) { + if (!N.hasOneUse()) + return false; + N = N->getOperand(0); + } + return selectVSplat(N, SplatVal); +} + bool RISCVDAGToDAGISel::selectFPImm(SDValue N, SDValue &Imm) { ConstantFPSDNode *CFP = dyn_cast(N.getNode()); if (!CFP) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -1234,6 +1234,8 @@ def zexti16 : ComplexPattern">; def zexti8 : ComplexPattern">; +def ext : PatFrags<(ops node:$A), [(sext node:$A), (zext node:$A)]>; + class binop_oneuse : PatFrag<(ops node:$A, node:$B), (operator node:$A, node:$B), [{ @@ -1259,6 +1261,7 @@ def sext_oneuse : unop_oneuse; def zext_oneuse : unop_oneuse; def anyext_oneuse : unop_oneuse; +def ext_oneuse : unop_oneuse; def fpext_oneuse : unop_oneuse; /// Simple arithmetic operations diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td @@ -569,12 +569,15 @@ // Give explicit Complexity to prefer simm5/uimm5. def SplatPat : ComplexPattern; -def SplatPat_simm5 : ComplexPattern; -def SplatPat_uimm5 : ComplexPattern; +def SplatPat_simm5 : ComplexPattern; +def SplatPat_uimm5 : ComplexPattern; def SplatPat_simm5_plus1 - : ComplexPattern; + : ComplexPattern; def SplatPat_simm5_plus1_nonzero - : ComplexPattern; + : ComplexPattern; + +def ext_oneuse_SplatPat + : ComplexPattern; def SelectFPImm : ComplexPattern; @@ -1428,7 +1431,7 @@ } } -multiclass VPatBinaryExtVL_WV_WX { +multiclass VPatBinaryExtVL_WV_WX { foreach vtiToWti = AllWidenableIntVectors in { defvar vti = vtiToWti.Vti; defvar wti = vtiToWti.Wti; @@ -1438,17 +1441,18 @@ (vti.Vector (riscv_trunc_vector_vl (op (wti.Vector wti.RegClass:$rs2), - (wti.Vector (extop (vti.Vector vti.RegClass:$rs1)))), + (wti.Vector (ext_oneuse (vti.Vector vti.RegClass:$rs1)))), (vti.Mask true_mask), VLOpFrag)), (!cast(instruction_name#"_WV_"#vti.LMul.MX) (vti.Vector (IMPLICIT_DEF)), wti.RegClass:$rs2, vti.RegClass:$rs1, GPR:$vl, vti.Log2SEW, TU_MU)>; + def : Pat< (vti.Vector (riscv_trunc_vector_vl (op (wti.Vector wti.RegClass:$rs2), - (wti.Vector (extop (vti.Vector (SplatPat (XLenVT GPR:$rs1)))))), + (wti.Vector (ext_oneuse_SplatPat (XLenVT GPR:$rs1)))), (vti.Mask true_mask), VLOpFrag)), (!cast(instruction_name#"_WX_"#vti.LMul.MX) @@ -1459,8 +1463,7 @@ } multiclass VPatBinaryVL_WV_WX_WI - : VPatBinaryExtVL_WV_WX, - VPatBinaryExtVL_WV_WX { + : VPatBinaryExtVL_WV_WX { foreach vtiToWti = AllWidenableIntVectors in { defvar vti = vtiToWti.Vti; defvar wti = vtiToWti.Wti; diff --git a/llvm/test/CodeGen/RISCV/rvv/ctlz-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/ctlz-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/ctlz-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/ctlz-sdnode.ll @@ -1056,10 +1056,7 @@ ; CHECK-D-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-D-NEXT: vfwcvt.f.xu.v v9, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v9, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-D-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v9, a0 ; CHECK-D-NEXT: li a0, 1054 ; CHECK-D-NEXT: vrsub.vx v8, v8, a0 ; CHECK-D-NEXT: li a0, 32 @@ -1167,12 +1164,9 @@ ; CHECK-D-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-D-NEXT: vfwcvt.f.xu.v v10, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v10, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-D-NEXT: vnsrl.wi v10, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v10, a0 ; CHECK-D-NEXT: li a0, 1054 -; CHECK-D-NEXT: vrsub.vx v8, v10, a0 +; CHECK-D-NEXT: vrsub.vx v8, v8, a0 ; CHECK-D-NEXT: li a0, 32 ; CHECK-D-NEXT: vminu.vx v8, v8, a0 ; CHECK-D-NEXT: ret @@ -1278,12 +1272,9 @@ ; CHECK-D-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-D-NEXT: vfwcvt.f.xu.v v12, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v12, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-D-NEXT: vnsrl.wi v12, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v12, a0 ; CHECK-D-NEXT: li a0, 1054 -; CHECK-D-NEXT: vrsub.vx v8, v12, a0 +; CHECK-D-NEXT: vrsub.vx v8, v8, a0 ; CHECK-D-NEXT: li a0, 32 ; CHECK-D-NEXT: vminu.vx v8, v8, a0 ; CHECK-D-NEXT: ret @@ -1389,12 +1380,9 @@ ; CHECK-D-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-D-NEXT: vfwcvt.f.xu.v v16, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v16, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-D-NEXT: vnsrl.wi v16, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v16, a0 ; CHECK-D-NEXT: li a0, 1054 -; CHECK-D-NEXT: vrsub.vx v8, v16, a0 +; CHECK-D-NEXT: vrsub.vx v8, v8, a0 ; CHECK-D-NEXT: li a0, 32 ; CHECK-D-NEXT: vminu.vx v8, v8, a0 ; CHECK-D-NEXT: ret @@ -3099,10 +3087,7 @@ ; CHECK-D-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-D-NEXT: vfwcvt.f.xu.v v9, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v9, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-D-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v9, a0 ; CHECK-D-NEXT: li a0, 1054 ; CHECK-D-NEXT: vrsub.vx v8, v8, a0 ; CHECK-D-NEXT: ret @@ -3205,12 +3190,9 @@ ; CHECK-D-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-D-NEXT: vfwcvt.f.xu.v v10, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v10, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-D-NEXT: vnsrl.wi v10, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v10, a0 ; CHECK-D-NEXT: li a0, 1054 -; CHECK-D-NEXT: vrsub.vx v8, v10, a0 +; CHECK-D-NEXT: vrsub.vx v8, v8, a0 ; CHECK-D-NEXT: ret ; ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv2i32: @@ -3311,12 +3293,9 @@ ; CHECK-D-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-D-NEXT: vfwcvt.f.xu.v v12, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v12, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-D-NEXT: vnsrl.wi v12, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v12, a0 ; CHECK-D-NEXT: li a0, 1054 -; CHECK-D-NEXT: vrsub.vx v8, v12, a0 +; CHECK-D-NEXT: vrsub.vx v8, v8, a0 ; CHECK-D-NEXT: ret ; ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv4i32: @@ -3417,12 +3396,9 @@ ; CHECK-D-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-D-NEXT: vfwcvt.f.xu.v v16, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v16, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-D-NEXT: vnsrl.wi v16, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v16, a0 ; CHECK-D-NEXT: li a0, 1054 -; CHECK-D-NEXT: vrsub.vx v8, v16, a0 +; CHECK-D-NEXT: vrsub.vx v8, v8, a0 ; CHECK-D-NEXT: ret ; ; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv8i32: diff --git a/llvm/test/CodeGen/RISCV/rvv/cttz-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/cttz-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/cttz-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/cttz-sdnode.ll @@ -1026,10 +1026,7 @@ ; CHECK-D-NEXT: vand.vv v9, v8, v9 ; CHECK-D-NEXT: vfwcvt.f.xu.v v10, v9 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-D-NEXT: vsrl.vx v9, v10, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-D-NEXT: vnsrl.wi v9, v9, 0 +; CHECK-D-NEXT: vnsrl.wx v9, v10, a0 ; CHECK-D-NEXT: li a0, 1023 ; CHECK-D-NEXT: vsub.vx v9, v9, a0 ; CHECK-D-NEXT: vmseq.vi v0, v8, 0 @@ -1129,10 +1126,7 @@ ; CHECK-D-NEXT: vand.vv v9, v8, v9 ; CHECK-D-NEXT: vfwcvt.f.xu.v v10, v9 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-D-NEXT: vsrl.vx v10, v10, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-D-NEXT: vnsrl.wi v9, v10, 0 +; CHECK-D-NEXT: vnsrl.wx v9, v10, a0 ; CHECK-D-NEXT: li a0, 1023 ; CHECK-D-NEXT: vsub.vx v9, v9, a0 ; CHECK-D-NEXT: vmseq.vi v0, v8, 0 @@ -1232,10 +1226,7 @@ ; CHECK-D-NEXT: vand.vv v10, v8, v10 ; CHECK-D-NEXT: vfwcvt.f.xu.v v12, v10 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-D-NEXT: vsrl.vx v12, v12, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-D-NEXT: vnsrl.wi v10, v12, 0 +; CHECK-D-NEXT: vnsrl.wx v10, v12, a0 ; CHECK-D-NEXT: li a0, 1023 ; CHECK-D-NEXT: vsub.vx v10, v10, a0 ; CHECK-D-NEXT: vmseq.vi v0, v8, 0 @@ -1335,10 +1326,7 @@ ; CHECK-D-NEXT: vand.vv v12, v8, v12 ; CHECK-D-NEXT: vfwcvt.f.xu.v v16, v12 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-D-NEXT: vsrl.vx v16, v16, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-D-NEXT: vnsrl.wi v12, v16, 0 +; CHECK-D-NEXT: vnsrl.wx v12, v16, a0 ; CHECK-D-NEXT: li a0, 1023 ; CHECK-D-NEXT: vsub.vx v12, v12, a0 ; CHECK-D-NEXT: vmseq.vi v0, v8, 0 @@ -3089,10 +3077,7 @@ ; CHECK-D-NEXT: vand.vv v8, v8, v9 ; CHECK-D-NEXT: vfwcvt.f.xu.v v9, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v9, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-D-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v9, a0 ; CHECK-D-NEXT: li a0, 1023 ; CHECK-D-NEXT: vsub.vx v8, v8, a0 ; CHECK-D-NEXT: ret @@ -3185,12 +3170,9 @@ ; CHECK-D-NEXT: vand.vv v8, v8, v9 ; CHECK-D-NEXT: vfwcvt.f.xu.v v10, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v10, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-D-NEXT: vnsrl.wi v10, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v10, a0 ; CHECK-D-NEXT: li a0, 1023 -; CHECK-D-NEXT: vsub.vx v8, v10, a0 +; CHECK-D-NEXT: vsub.vx v8, v8, a0 ; CHECK-D-NEXT: ret ; ; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv2i32: @@ -3281,12 +3263,9 @@ ; CHECK-D-NEXT: vand.vv v8, v8, v10 ; CHECK-D-NEXT: vfwcvt.f.xu.v v12, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v12, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-D-NEXT: vnsrl.wi v12, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v12, a0 ; CHECK-D-NEXT: li a0, 1023 -; CHECK-D-NEXT: vsub.vx v8, v12, a0 +; CHECK-D-NEXT: vsub.vx v8, v8, a0 ; CHECK-D-NEXT: ret ; ; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv4i32: @@ -3377,12 +3356,9 @@ ; CHECK-D-NEXT: vand.vv v8, v8, v12 ; CHECK-D-NEXT: vfwcvt.f.xu.v v16, v8 ; CHECK-D-NEXT: li a0, 52 -; CHECK-D-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-D-NEXT: vsrl.vx v8, v16, a0 -; CHECK-D-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-D-NEXT: vnsrl.wi v16, v8, 0 +; CHECK-D-NEXT: vnsrl.wx v8, v16, a0 ; CHECK-D-NEXT: li a0, 1023 -; CHECK-D-NEXT: vsub.vx v8, v16, a0 +; CHECK-D-NEXT: vsub.vx v8, v8, a0 ; CHECK-D-NEXT: ret ; ; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv8i32: diff --git a/llvm/test/CodeGen/RISCV/rvv/vnsra-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vnsra-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vnsra-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vnsra-sdnode.ll @@ -7,10 +7,8 @@ define @vnsra_wx_i64_nxv1i32( %va, i64 %b) { ; CHECK-LABEL: vnsra_wx_i64_nxv1i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e64, m1, ta, ma -; CHECK-NEXT: vsra.vx v8, v8, a0 -; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma +; CHECK-NEXT: vnsra.wx v8, v8, a0 ; CHECK-NEXT: ret %head = insertelement poison, i64 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -22,10 +20,9 @@ define @vnsra_wx_i64_nxv2i32( %va, i64 %b) { ; CHECK-LABEL: vnsra_wx_i64_nxv2i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e64, m2, ta, ma -; CHECK-NEXT: vsra.vx v10, v8, a0 -; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v10, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma +; CHECK-NEXT: vnsra.wx v10, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %head = insertelement poison, i64 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -37,10 +34,9 @@ define @vnsra_wx_i64_nxv4i32( %va, i64 %b) { ; CHECK-LABEL: vnsra_wx_i64_nxv4i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e64, m4, ta, ma -; CHECK-NEXT: vsra.vx v12, v8, a0 -; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v12, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma +; CHECK-NEXT: vnsra.wx v12, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret %head = insertelement poison, i64 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -52,10 +48,9 @@ define @vnsra_wx_i64_nxv8i32( %va, i64 %b) { ; CHECK-LABEL: vnsra_wx_i64_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e64, m8, ta, ma -; CHECK-NEXT: vsra.vx v16, v8, a0 -; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v16, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vnsra.wx v16, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v16 ; CHECK-NEXT: ret %head = insertelement poison, i64 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -93,13 +88,8 @@ define @vnsra_wx_i16_nxv1i32_sext( %va, i16 %b) { ; CHECK-LABEL: vnsra_wx_i16_nxv1i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma -; CHECK-NEXT: vmv.v.x v9, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-NEXT: vsext.vf4 v10, v9 -; CHECK-NEXT: vsra.vv v8, v8, v10 -; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma +; CHECK-NEXT: vnsra.wx v8, v8, a0 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -112,13 +102,8 @@ define @vnsra_wx_i8_nxv1i32_sext( %va, i8 %b) { ; CHECK-LABEL: vnsra_wx_i8_nxv1i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma -; CHECK-NEXT: vmv.v.x v9, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-NEXT: vsext.vf8 v10, v9 -; CHECK-NEXT: vsra.vv v8, v8, v10 -; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma +; CHECK-NEXT: vnsra.wx v8, v8, a0 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -173,13 +158,9 @@ define @vnsra_wx_i16_nxv2i32_sext( %va, i16 %b) { ; CHECK-LABEL: vnsra_wx_i16_nxv2i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma -; CHECK-NEXT: vmv.v.x v10, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-NEXT: vsext.vf4 v12, v10 -; CHECK-NEXT: vsra.vv v10, v8, v12 -; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v10, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma +; CHECK-NEXT: vnsra.wx v10, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -192,13 +173,9 @@ define @vnsra_wx_i8_nxv2i32_sext( %va, i8 %b) { ; CHECK-LABEL: vnsra_wx_i8_nxv2i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma -; CHECK-NEXT: vmv.v.x v10, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-NEXT: vsext.vf8 v12, v10 -; CHECK-NEXT: vsra.vv v10, v8, v12 -; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v10, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma +; CHECK-NEXT: vnsra.wx v10, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -254,13 +231,9 @@ define @vnsra_wx_i16_nxv4i32_sext( %va, i16 %b) { ; CHECK-LABEL: vnsra_wx_i16_nxv4i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma -; CHECK-NEXT: vmv.v.x v12, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-NEXT: vsext.vf4 v16, v12 -; CHECK-NEXT: vsra.vv v12, v8, v16 -; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v12, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma +; CHECK-NEXT: vnsra.wx v12, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -273,13 +246,9 @@ define @vnsra_wx_i8_nxv4i32_sext( %va, i8 %b) { ; CHECK-LABEL: vnsra_wx_i8_nxv4i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma -; CHECK-NEXT: vmv.v.x v12, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-NEXT: vsext.vf8 v16, v12 -; CHECK-NEXT: vsra.vv v12, v8, v16 -; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v12, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma +; CHECK-NEXT: vnsra.wx v12, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -335,13 +304,9 @@ define @vnsra_wx_i16_nxv8i32_sext( %va, i16 %b) { ; CHECK-LABEL: vnsra_wx_i16_nxv8i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma -; CHECK-NEXT: vmv.v.x v16, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-NEXT: vsext.vf4 v24, v16 -; CHECK-NEXT: vsra.vv v16, v8, v24 -; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v16, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vnsra.wx v16, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v16 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -354,13 +319,9 @@ define @vnsra_wx_i8_nxv8i32_sext( %va, i8 %b) { ; CHECK-LABEL: vnsra_wx_i8_nxv8i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma -; CHECK-NEXT: vmv.v.x v16, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-NEXT: vsext.vf8 v24, v16 -; CHECK-NEXT: vsra.vv v16, v8, v24 -; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v16, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vnsra.wx v16, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v16 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -414,13 +375,8 @@ define @vnsra_wx_i16_nxv1i32_zext( %va, i16 %b) { ; CHECK-LABEL: vnsra_wx_i16_nxv1i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma -; CHECK-NEXT: vmv.v.x v9, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-NEXT: vzext.vf4 v10, v9 -; CHECK-NEXT: vsra.vv v8, v8, v10 -; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma +; CHECK-NEXT: vnsra.wx v8, v8, a0 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -433,13 +389,8 @@ define @vnsra_wx_i8_nxv1i32_zext( %va, i8 %b) { ; CHECK-LABEL: vnsra_wx_i8_nxv1i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma -; CHECK-NEXT: vmv.v.x v9, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-NEXT: vzext.vf8 v10, v9 -; CHECK-NEXT: vsra.vv v8, v8, v10 -; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma +; CHECK-NEXT: vnsra.wx v8, v8, a0 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -494,13 +445,9 @@ define @vnsra_wx_i16_nxv2i32_zext( %va, i16 %b) { ; CHECK-LABEL: vnsra_wx_i16_nxv2i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma -; CHECK-NEXT: vmv.v.x v10, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-NEXT: vzext.vf4 v12, v10 -; CHECK-NEXT: vsra.vv v10, v8, v12 -; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v10, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma +; CHECK-NEXT: vnsra.wx v10, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -513,13 +460,9 @@ define @vnsra_wx_i8_nxv2i32_zext( %va, i8 %b) { ; CHECK-LABEL: vnsra_wx_i8_nxv2i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma -; CHECK-NEXT: vmv.v.x v10, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-NEXT: vzext.vf8 v12, v10 -; CHECK-NEXT: vsra.vv v10, v8, v12 -; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v10, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma +; CHECK-NEXT: vnsra.wx v10, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -575,13 +518,9 @@ define @vnsra_wx_i16_nxv4i32_zext( %va, i16 %b) { ; CHECK-LABEL: vnsra_wx_i16_nxv4i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma -; CHECK-NEXT: vmv.v.x v12, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-NEXT: vzext.vf4 v16, v12 -; CHECK-NEXT: vsra.vv v12, v8, v16 -; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v12, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma +; CHECK-NEXT: vnsra.wx v12, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -594,13 +533,9 @@ define @vnsra_wx_i8_nxv4i32_zext( %va, i8 %b) { ; CHECK-LABEL: vnsra_wx_i8_nxv4i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma -; CHECK-NEXT: vmv.v.x v12, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-NEXT: vzext.vf8 v16, v12 -; CHECK-NEXT: vsra.vv v12, v8, v16 -; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v12, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma +; CHECK-NEXT: vnsra.wx v12, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -656,13 +591,9 @@ define @vnsra_wx_i16_nxv8i32_zext( %va, i16 %b) { ; CHECK-LABEL: vnsra_wx_i16_nxv8i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma -; CHECK-NEXT: vmv.v.x v16, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-NEXT: vzext.vf4 v24, v16 -; CHECK-NEXT: vsra.vv v16, v8, v24 -; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v16, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vnsra.wx v16, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v16 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -675,13 +606,9 @@ define @vnsra_wx_i8_nxv8i32_zext( %va, i8 %b) { ; CHECK-LABEL: vnsra_wx_i8_nxv8i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma -; CHECK-NEXT: vmv.v.x v16, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-NEXT: vzext.vf8 v24, v16 -; CHECK-NEXT: vsra.vv v16, v8, v24 -; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v16, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vnsra.wx v16, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v16 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vnsrl-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vnsrl-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vnsrl-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vnsrl-sdnode.ll @@ -7,10 +7,8 @@ define @vnsrl_wx_i64_nxv1i32( %va, i64 %b) { ; CHECK-LABEL: vnsrl_wx_i64_nxv1i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e64, m1, ta, ma -; CHECK-NEXT: vsrl.vx v8, v8, a0 -; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma +; CHECK-NEXT: vnsrl.wx v8, v8, a0 ; CHECK-NEXT: ret %head = insertelement poison, i64 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -22,10 +20,9 @@ define @vnsrl_wx_i64_nxv2i32( %va, i64 %b) { ; CHECK-LABEL: vnsrl_wx_i64_nxv2i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e64, m2, ta, ma -; CHECK-NEXT: vsrl.vx v10, v8, a0 -; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v10, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma +; CHECK-NEXT: vnsrl.wx v10, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %head = insertelement poison, i64 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -37,10 +34,9 @@ define @vnsrl_wx_i64_nxv4i32( %va, i64 %b) { ; CHECK-LABEL: vnsrl_wx_i64_nxv4i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e64, m4, ta, ma -; CHECK-NEXT: vsrl.vx v12, v8, a0 -; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v12, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma +; CHECK-NEXT: vnsrl.wx v12, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret %head = insertelement poison, i64 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -52,10 +48,9 @@ define @vnsrl_wx_i64_nxv8i32( %va, i64 %b) { ; CHECK-LABEL: vnsrl_wx_i64_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e64, m8, ta, ma -; CHECK-NEXT: vsrl.vx v16, v8, a0 -; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v16, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vnsrl.wx v16, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v16 ; CHECK-NEXT: ret %head = insertelement poison, i64 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -93,13 +88,8 @@ define @vnsrl_wx_i16_nxv1i32_sext( %va, i16 %b) { ; CHECK-LABEL: vnsrl_wx_i16_nxv1i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma -; CHECK-NEXT: vmv.v.x v9, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-NEXT: vsext.vf4 v10, v9 -; CHECK-NEXT: vsrl.vv v8, v8, v10 -; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma +; CHECK-NEXT: vnsrl.wx v8, v8, a0 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -112,13 +102,8 @@ define @vnsrl_wx_i8_nxv1i32_sext( %va, i8 %b) { ; CHECK-LABEL: vnsrl_wx_i8_nxv1i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma -; CHECK-NEXT: vmv.v.x v9, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-NEXT: vsext.vf8 v10, v9 -; CHECK-NEXT: vsrl.vv v8, v8, v10 -; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma +; CHECK-NEXT: vnsrl.wx v8, v8, a0 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -173,13 +158,9 @@ define @vnsrl_wx_i16_nxv2i32_sext( %va, i16 %b) { ; CHECK-LABEL: vnsrl_wx_i16_nxv2i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma -; CHECK-NEXT: vmv.v.x v10, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-NEXT: vsext.vf4 v12, v10 -; CHECK-NEXT: vsrl.vv v10, v8, v12 -; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v10, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma +; CHECK-NEXT: vnsrl.wx v10, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -192,13 +173,9 @@ define @vnsrl_wx_i8_nxv2i32_sext( %va, i8 %b) { ; CHECK-LABEL: vnsrl_wx_i8_nxv2i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma -; CHECK-NEXT: vmv.v.x v10, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-NEXT: vsext.vf8 v12, v10 -; CHECK-NEXT: vsrl.vv v10, v8, v12 -; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v10, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma +; CHECK-NEXT: vnsrl.wx v10, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -254,13 +231,9 @@ define @vnsrl_wx_i16_nxv4i32_sext( %va, i16 %b) { ; CHECK-LABEL: vnsrl_wx_i16_nxv4i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma -; CHECK-NEXT: vmv.v.x v12, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-NEXT: vsext.vf4 v16, v12 -; CHECK-NEXT: vsrl.vv v12, v8, v16 -; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v12, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma +; CHECK-NEXT: vnsrl.wx v12, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -273,13 +246,9 @@ define @vnsrl_wx_i8_nxv4i32_sext( %va, i8 %b) { ; CHECK-LABEL: vnsrl_wx_i8_nxv4i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma -; CHECK-NEXT: vmv.v.x v12, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-NEXT: vsext.vf8 v16, v12 -; CHECK-NEXT: vsrl.vv v12, v8, v16 -; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v12, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma +; CHECK-NEXT: vnsrl.wx v12, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -335,13 +304,9 @@ define @vnsrl_wx_i16_nxv8i32_sext( %va, i16 %b) { ; CHECK-LABEL: vnsrl_wx_i16_nxv8i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma -; CHECK-NEXT: vmv.v.x v16, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-NEXT: vsext.vf4 v24, v16 -; CHECK-NEXT: vsrl.vv v16, v8, v24 -; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v16, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vnsrl.wx v16, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v16 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -354,13 +319,9 @@ define @vnsrl_wx_i8_nxv8i32_sext( %va, i8 %b) { ; CHECK-LABEL: vnsrl_wx_i8_nxv8i32_sext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma -; CHECK-NEXT: vmv.v.x v16, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-NEXT: vsext.vf8 v24, v16 -; CHECK-NEXT: vsrl.vv v16, v8, v24 -; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v16, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vnsrl.wx v16, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v16 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -414,13 +375,8 @@ define @vnsrl_wx_i16_nxv1i32_zext( %va, i16 %b) { ; CHECK-LABEL: vnsrl_wx_i16_nxv1i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma -; CHECK-NEXT: vmv.v.x v9, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-NEXT: vzext.vf4 v10, v9 -; CHECK-NEXT: vsrl.vv v8, v8, v10 -; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma +; CHECK-NEXT: vnsrl.wx v8, v8, a0 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -433,13 +389,8 @@ define @vnsrl_wx_i8_nxv1i32_zext( %va, i8 %b) { ; CHECK-LABEL: vnsrl_wx_i8_nxv1i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma -; CHECK-NEXT: vmv.v.x v9, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma -; CHECK-NEXT: vsext.vf8 v10, v9 -; CHECK-NEXT: vsrl.vv v8, v8, v10 -; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v8, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma +; CHECK-NEXT: vnsrl.wx v8, v8, a0 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -494,13 +445,9 @@ define @vnsrl_wx_i16_nxv2i32_zext( %va, i16 %b) { ; CHECK-LABEL: vnsrl_wx_i16_nxv2i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma -; CHECK-NEXT: vmv.v.x v10, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-NEXT: vzext.vf4 v12, v10 -; CHECK-NEXT: vsrl.vv v10, v8, v12 -; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v10, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma +; CHECK-NEXT: vnsrl.wx v10, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -513,13 +460,9 @@ define @vnsrl_wx_i8_nxv2i32_zext( %va, i8 %b) { ; CHECK-LABEL: vnsrl_wx_i8_nxv2i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma -; CHECK-NEXT: vmv.v.x v10, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma -; CHECK-NEXT: vsext.vf8 v12, v10 -; CHECK-NEXT: vsrl.vv v10, v8, v12 -; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v10, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma +; CHECK-NEXT: vnsrl.wx v10, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -575,13 +518,9 @@ define @vnsrl_wx_i16_nxv4i32_zext( %va, i16 %b) { ; CHECK-LABEL: vnsrl_wx_i16_nxv4i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma -; CHECK-NEXT: vmv.v.x v12, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-NEXT: vzext.vf4 v16, v12 -; CHECK-NEXT: vsrl.vv v12, v8, v16 -; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v12, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma +; CHECK-NEXT: vnsrl.wx v12, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -594,13 +533,9 @@ define @vnsrl_wx_i8_nxv4i32_zext( %va, i8 %b) { ; CHECK-LABEL: vnsrl_wx_i8_nxv4i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma -; CHECK-NEXT: vmv.v.x v12, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma -; CHECK-NEXT: vsext.vf8 v16, v12 -; CHECK-NEXT: vsrl.vv v12, v8, v16 -; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v12, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma +; CHECK-NEXT: vnsrl.wx v12, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -656,13 +591,9 @@ define @vnsrl_wx_i16_nxv8i32_zext( %va, i16 %b) { ; CHECK-LABEL: vnsrl_wx_i16_nxv8i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma -; CHECK-NEXT: vmv.v.x v16, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-NEXT: vzext.vf4 v24, v16 -; CHECK-NEXT: vsrl.vv v16, v8, v24 -; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v16, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vnsrl.wx v16, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v16 ; CHECK-NEXT: ret %head = insertelement poison, i16 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -675,13 +606,9 @@ define @vnsrl_wx_i8_nxv8i32_zext( %va, i8 %b) { ; CHECK-LABEL: vnsrl_wx_i8_nxv8i32_zext: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma -; CHECK-NEXT: vmv.v.x v16, a0 -; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma -; CHECK-NEXT: vsext.vf8 v24, v16 -; CHECK-NEXT: vsrl.vv v16, v8, v24 -; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma -; CHECK-NEXT: vnsrl.wi v8, v16, 0 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma +; CHECK-NEXT: vnsrl.wx v16, v8, a0 +; CHECK-NEXT: vmv.v.v v8, v16 ; CHECK-NEXT: ret %head = insertelement poison, i8 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer