Index: llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp =================================================================== --- llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -2956,6 +2956,11 @@ } static SDValue findVSplat(SDValue N) { + while (N.getOpcode() == ISD::INSERT_SUBVECTOR) { + if (!N.getOperand(0).isUndef()) + return SDValue(); + N = N.getOperand(1); + } SDValue Splat = N; if ((Splat.getOpcode() != RISCVISD::VMV_V_X_VL && Splat.getOpcode() != RISCVISD::VMV_S_X_VL) || Index: llvm/lib/Target/RISCV/RISCVISelLowering.cpp =================================================================== --- llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -13963,10 +13963,9 @@ return SDValue(N, 0); // If VL is 1 and the scalar value won't benefit from immediate, we can - // use vmv.s.x. Do this only if legal to avoid breaking i64 sext(i32) - // patterns on rv32.. + // use vmv.s.x. ConstantSDNode *Const = dyn_cast(Scalar); - if (isOneConstant(VL) && EltWidth <= Subtarget.getXLen() && + if (isOneConstant(VL) && (!Const || Const->isZero() || !isInt<5>(Const->getSExtValue()))) return DAG.getNode(RISCVISD::VMV_S_X_VL, DL, VT, Passthru, Scalar, VL); Index: llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vrol.ll =================================================================== --- llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vrol.ll +++ llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vrol.ll @@ -1,8 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 -; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-RV32 -; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-RV64 -; RUN: llc -mtriple=riscv32 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB,CHECK-ZVBB32 -; RUN: llc -mtriple=riscv64 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB,CHECK-ZVBB64 +; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s +; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s +; RUN: llc -mtriple=riscv32 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB +; RUN: llc -mtriple=riscv64 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB declare <1 x i8> @llvm.fshl.v1i8(<1 x i8>, <1 x i8>, <1 x i8>) @@ -897,31 +897,18 @@ } define <1 x i64> @vrol_vx_v1i64(<1 x i64> %a, i64 %b) { -; CHECK-RV32-LABEL: vrol_vx_v1i64: -; CHECK-RV32: # %bb.0: -; CHECK-RV32-NEXT: vsetivli zero, 1, e64, m1, ta, ma -; CHECK-RV32-NEXT: vmv.v.x v9, a0 -; CHECK-RV32-NEXT: li a0, 63 -; CHECK-RV32-NEXT: vand.vx v10, v9, a0 -; CHECK-RV32-NEXT: vsll.vv v10, v8, v10 -; CHECK-RV32-NEXT: vrsub.vi v9, v9, 0 -; CHECK-RV32-NEXT: vand.vx v9, v9, a0 -; CHECK-RV32-NEXT: vsrl.vv v8, v8, v9 -; CHECK-RV32-NEXT: vor.vv v8, v10, v8 -; CHECK-RV32-NEXT: ret -; -; CHECK-RV64-LABEL: vrol_vx_v1i64: -; CHECK-RV64: # %bb.0: -; CHECK-RV64-NEXT: vsetivli zero, 1, e64, m1, ta, ma -; CHECK-RV64-NEXT: vmv.s.x v9, a0 -; CHECK-RV64-NEXT: li a0, 63 -; CHECK-RV64-NEXT: vand.vx v10, v9, a0 -; CHECK-RV64-NEXT: vsll.vv v10, v8, v10 -; CHECK-RV64-NEXT: vrsub.vi v9, v9, 0 -; CHECK-RV64-NEXT: vand.vx v9, v9, a0 -; CHECK-RV64-NEXT: vsrl.vv v8, v8, v9 -; CHECK-RV64-NEXT: vor.vv v8, v10, v8 -; CHECK-RV64-NEXT: ret +; CHECK-LABEL: vrol_vx_v1i64: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma +; CHECK-NEXT: vmv.s.x v9, a0 +; CHECK-NEXT: li a0, 63 +; CHECK-NEXT: vand.vx v10, v9, a0 +; CHECK-NEXT: vsll.vv v10, v8, v10 +; CHECK-NEXT: vrsub.vi v9, v9, 0 +; CHECK-NEXT: vand.vx v9, v9, a0 +; CHECK-NEXT: vsrl.vv v8, v8, v9 +; CHECK-NEXT: vor.vv v8, v10, v8 +; CHECK-NEXT: ret ; ; CHECK-ZVBB-LABEL: vrol_vx_v1i64: ; CHECK-ZVBB: # %bb.0: @@ -1081,6 +1068,3 @@ ret <8 x i64> %x } -;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: -; CHECK-ZVBB32: {{.*}} -; CHECK-ZVBB64: {{.*}} Index: llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vror.ll =================================================================== --- llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vror.ll +++ llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vror.ll @@ -1576,31 +1576,18 @@ } define <1 x i64> @vror_vx_v1i64(<1 x i64> %a, i64 %b) { -; CHECK-RV32-LABEL: vror_vx_v1i64: -; CHECK-RV32: # %bb.0: -; CHECK-RV32-NEXT: vsetivli zero, 1, e64, m1, ta, ma -; CHECK-RV32-NEXT: vmv.v.x v9, a0 -; CHECK-RV32-NEXT: li a0, 63 -; CHECK-RV32-NEXT: vand.vx v10, v9, a0 -; CHECK-RV32-NEXT: vsrl.vv v10, v8, v10 -; CHECK-RV32-NEXT: vrsub.vi v9, v9, 0 -; CHECK-RV32-NEXT: vand.vx v9, v9, a0 -; CHECK-RV32-NEXT: vsll.vv v8, v8, v9 -; CHECK-RV32-NEXT: vor.vv v8, v10, v8 -; CHECK-RV32-NEXT: ret -; -; CHECK-RV64-LABEL: vror_vx_v1i64: -; CHECK-RV64: # %bb.0: -; CHECK-RV64-NEXT: vsetivli zero, 1, e64, m1, ta, ma -; CHECK-RV64-NEXT: vmv.s.x v9, a0 -; CHECK-RV64-NEXT: li a0, 63 -; CHECK-RV64-NEXT: vand.vx v10, v9, a0 -; CHECK-RV64-NEXT: vsrl.vv v10, v8, v10 -; CHECK-RV64-NEXT: vrsub.vi v9, v9, 0 -; CHECK-RV64-NEXT: vand.vx v9, v9, a0 -; CHECK-RV64-NEXT: vsll.vv v8, v8, v9 -; CHECK-RV64-NEXT: vor.vv v8, v10, v8 -; CHECK-RV64-NEXT: ret +; CHECK-LABEL: vror_vx_v1i64: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma +; CHECK-NEXT: vmv.s.x v9, a0 +; CHECK-NEXT: li a0, 63 +; CHECK-NEXT: vand.vx v10, v9, a0 +; CHECK-NEXT: vsrl.vv v10, v8, v10 +; CHECK-NEXT: vrsub.vi v9, v9, 0 +; CHECK-NEXT: vand.vx v9, v9, a0 +; CHECK-NEXT: vsll.vv v8, v8, v9 +; CHECK-NEXT: vor.vv v8, v10, v8 +; CHECK-NEXT: ret ; ; CHECK-ZVBB-LABEL: vror_vx_v1i64: ; CHECK-ZVBB: # %bb.0: @@ -1622,7 +1609,7 @@ ; CHECK-RV32-NEXT: li a0, 63 ; CHECK-RV32-NEXT: vand.vx v9, v9, a0 ; CHECK-RV32-NEXT: vsll.vv v9, v8, v9 -; CHECK-RV32-NEXT: vmv.v.x v10, a0 +; CHECK-RV32-NEXT: vmv.s.x v10, a0 ; CHECK-RV32-NEXT: vand.vi v10, v10, 1 ; CHECK-RV32-NEXT: vsrl.vv v8, v8, v10 ; CHECK-RV32-NEXT: vor.vv v8, v8, v9 @@ -1655,7 +1642,7 @@ ; CHECK-RV32-NEXT: li a0, 63 ; CHECK-RV32-NEXT: vand.vx v9, v9, a0 ; CHECK-RV32-NEXT: vsrl.vv v9, v8, v9 -; CHECK-RV32-NEXT: vmv.v.x v10, a0 +; CHECK-RV32-NEXT: vmv.s.x v10, a0 ; CHECK-RV32-NEXT: vand.vi v10, v10, 1 ; CHECK-RV32-NEXT: vsll.vv v8, v8, v10 ; CHECK-RV32-NEXT: vor.vv v8, v8, v9