diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.h b/llvm/lib/Target/RISCV/RISCVISelLowering.h --- a/llvm/lib/Target/RISCV/RISCVISelLowering.h +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.h @@ -393,6 +393,9 @@ CallingConv::ID CC, EVT VT) const override; + bool shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, + EVT VT) const override; + /// Return true if the given shuffle mask can be codegen'd directly, or if it /// should be stack expanded. bool isShuffleMaskLegal(ArrayRef M, EVT VT) const override; diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -1228,6 +1228,18 @@ return C && C->getAPIntValue().ule(10); } +bool RISCVTargetLowering::shouldFoldSelectWithIdentityConstant(unsigned Opcode, + EVT VT) const { + // Only enable for rvv. + if (!VT.isVector() || !Subtarget.hasVInstructions()) + return false; + + if (VT.isFixedLengthVector() && !isTypeLegal(VT)) + return false; + + return true; +} + bool RISCVTargetLowering::shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const { assert(Ty->isIntegerTy()); diff --git a/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll @@ -894,10 +894,8 @@ define @vadd_vv_mask_nxv8i32( %va, %vb, %mask) { ; CHECK-LABEL: vadd_vv_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vadd.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = add %va, %vs @@ -907,10 +905,8 @@ define @vadd_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { ; CHECK-LABEL: vadd_vx_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -922,10 +918,8 @@ define @vadd_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vadd_vi_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vadd.vi v8, v8, 7, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 7, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll @@ -1385,10 +1385,8 @@ define @vand_vv_mask_nxv8i32( %va, %vb, %mask) { ; CHECK-LABEL: vand_vv_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v16, -1 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vand.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vand.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 -1, i32 0 %allones = shufflevector %head, poison, zeroinitializer @@ -1400,10 +1398,8 @@ define @vand_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { ; CHECK-LABEL: vand_vx_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, -1 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vand.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vand.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head1 = insertelement poison, i32 -1, i32 0 %allones = shufflevector %head1, poison, zeroinitializer @@ -1417,10 +1413,8 @@ define @vand_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vand_vi_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, -1 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vand.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vand.vi v8, v8, 7, v0.t ; CHECK-NEXT: ret %head1 = insertelement poison, i32 -1, i32 0 %allones = shufflevector %head1, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vfadd-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vfadd-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vfadd-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vfadd-sdnode.ll @@ -373,10 +373,8 @@ define @vfadd_vv_mask_nxv8f32( %va, %vb, %mask) { ; CHECK-LABEL: vfadd_vv_mask_nxv8f32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vfadd.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vfadd.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %head = insertelement poison, float 0.0, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -388,10 +386,8 @@ define @vfadd_vf_mask_nxv8f32( %va, float %b, %mask) { ; CHECK-LABEL: vfadd_vf_mask_nxv8f32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vfmerge.vfm v12, v12, fa0, v0 -; CHECK-NEXT: vfadd.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vfadd.vf v8, v8, fa0, v0.t ; CHECK-NEXT: ret %head0 = insertelement poison, float 0.0, i32 0 %splat0 = shufflevector %head0, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vfsub-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vfsub-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vfsub-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vfsub-sdnode.ll @@ -373,10 +373,8 @@ define @vfsub_vv_mask_nxv8f32( %va, %vb, %mask) { ; CHECK-LABEL: vfsub_vv_mask_nxv8f32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vfsub.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vfsub.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %head = insertelement poison, float 0.0, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -388,10 +386,8 @@ define @vfsub_vf_mask_nxv8f32( %va, float %b, %mask) { ; CHECK-LABEL: vfsub_vf_mask_nxv8f32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vfmerge.vfm v12, v12, fa0, v0 -; CHECK-NEXT: vfsub.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vfsub.vf v8, v8, fa0, v0.t ; CHECK-NEXT: ret %head0 = insertelement poison, float 0.0, i32 0 %splat0 = shufflevector %head0, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll @@ -963,10 +963,8 @@ define @vmul_vv_mask_nxv8i32( %va, %vb, %mask) { ; CHECK-LABEL: vmul_vv_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v16, 1 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vmul.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vmul.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 1, i32 0 %one = shufflevector %head, poison, zeroinitializer @@ -978,10 +976,8 @@ define @vmul_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { ; CHECK-LABEL: vmul_vx_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 1 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vmul.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head1 = insertelement poison, i32 1, i32 0 %one = shufflevector %head1, poison, zeroinitializer @@ -995,10 +991,9 @@ define @vmul_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vmul_vi_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 1 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vmul.vv v8, v8, v12 +; CHECK-NEXT: li a0, 7 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head1 = insertelement poison, i32 1, i32 0 %one = shufflevector %head1, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll @@ -1178,10 +1178,8 @@ define @vor_vv_mask_nxv8i32( %va, %vb, %mask) { ; CHECK-LABEL: vor_vv_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vor.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vor.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = or %va, %vs @@ -1191,10 +1189,8 @@ define @vor_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { ; CHECK-LABEL: vor_vx_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vor.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vor.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -1206,10 +1202,8 @@ define @vor_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vor_vi_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vor.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vor.vi v8, v8, 7, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 7, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll @@ -633,10 +633,8 @@ define @vshl_vv_mask_nxv4i32( %va, %vb, %mask) { ; CHECK-LABEL: vshl_vv_mask_nxv4i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vsll.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vsll.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = shl %va, %vs @@ -646,10 +644,8 @@ define @vshl_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { ; CHECK-LABEL: vshl_vx_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsll.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vsll.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -661,11 +657,8 @@ define @vshl_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vshl_vi_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: li a0, 31 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsll.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vsll.vi v8, v8, 31, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 31, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll @@ -805,10 +805,8 @@ define @vsra_vv_mask_nxv4i32( %va, %vb, %mask) { ; CHECK-LABEL: vsra_vv_mask_nxv4i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vsra.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vsra.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = ashr %va, %vs @@ -818,10 +816,8 @@ define @vsra_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { ; CHECK-LABEL: vsra_vx_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsra.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vsra.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -833,11 +829,8 @@ define @vsra_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vsra_vi_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: li a0, 31 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsra.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vsra.vi v8, v8, 31, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 31, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll @@ -585,10 +585,8 @@ define @vsrl_vv_mask_nxv4i32( %va, %vb, %mask) { ; CHECK-LABEL: vsrl_vv_mask_nxv4i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vsrl.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vsrl.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = lshr %va, %vs @@ -598,10 +596,8 @@ define @vsrl_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { ; CHECK-LABEL: vsrl_vx_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsrl.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vsrl.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -613,11 +609,8 @@ define @vsrl_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vsrl_vi_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: li a0, 31 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsrl.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vsrl.vi v8, v8, 31, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 31, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll @@ -872,10 +872,8 @@ define @vsub_vv_mask_nxv8i32( %va, %vb, %mask) { ; CHECK-LABEL: vsub_vv_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vsub.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer @@ -886,10 +884,8 @@ define @vsub_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { ; CHECK-LABEL: vsub_vx_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vsub.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -901,10 +897,9 @@ define @vsub_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vsub_vi_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: li a0, 7 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vsub.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 7, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll @@ -1385,10 +1385,8 @@ define @vxor_vv_mask_nxv8i32( %va, %vb, %mask) { ; CHECK-LABEL: vxor_vv_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vxor.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vxor.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = xor %va, %vs @@ -1398,10 +1396,8 @@ define @vxor_vx_mask_nxv8i32( %va, i32 signext %b, %mask) { ; CHECK-LABEL: vxor_vx_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vxor.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vxor.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -1413,10 +1409,8 @@ define @vxor_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vxor_vi_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vxor.vv v8, v8, v12 +; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu +; CHECK-NEXT: vxor.vi v8, v8, 7, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 7, i32 0 %splat = shufflevector %head, poison, zeroinitializer