diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index e47168e10d8dc..249dfa85ff687 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -3386,18 +3386,16 @@ static SDValue lowerBuildVectorOfConstants(SDValue Op, SelectionDAG &DAG, VID = convertFromScalableVector(VIDVT, VID, DAG, Subtarget); if ((StepOpcode == ISD::MUL && SplatStepVal != 1) || (StepOpcode == ISD::SHL && SplatStepVal != 0)) { - SDValue SplatStep = DAG.getSplatBuildVector( - VIDVT, DL, DAG.getConstant(SplatStepVal, DL, XLenVT)); + SDValue SplatStep = DAG.getConstant(SplatStepVal, DL, VIDVT); VID = DAG.getNode(StepOpcode, DL, VIDVT, VID, SplatStep); } if (StepDenominator != 1) { - SDValue SplatStep = DAG.getSplatBuildVector( - VIDVT, DL, DAG.getConstant(Log2_64(StepDenominator), DL, XLenVT)); + SDValue SplatStep = + DAG.getConstant(Log2_64(StepDenominator), DL, VIDVT); VID = DAG.getNode(ISD::SRL, DL, VIDVT, VID, SplatStep); } if (Addend != 0 || Negate) { - SDValue SplatAddend = DAG.getSplatBuildVector( - VIDVT, DL, DAG.getConstant(Addend, DL, XLenVT)); + SDValue SplatAddend = DAG.getConstant(Addend, DL, VIDVT); VID = DAG.getNode(Negate ? ISD::SUB : ISD::ADD, DL, VIDVT, SplatAddend, VID); } diff --git a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-fp-buildvec.ll b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-fp-buildvec.ll index 7593c1ab75ce4..d1ea56a1ff938 100644 --- a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-fp-buildvec.ll +++ b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-fp-buildvec.ll @@ -1083,3 +1083,132 @@ define <2 x float> @signbits() { entry: ret <2 x float> } + +define <2 x half> @vid_v2f16() { +; CHECK-LABEL: vid_v2f16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma +; CHECK-NEXT: vid.v v8 +; CHECK-NEXT: vfcvt.f.x.v v8, v8 +; CHECK-NEXT: ret + ret <2 x half> +} + +define <2 x half> @vid_addend1_v2f16() { +; CHECK-LABEL: vid_addend1_v2f16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma +; CHECK-NEXT: vid.v v8 +; CHECK-NEXT: vadd.vi v8, v8, 1 +; CHECK-NEXT: vfcvt.f.x.v v8, v8 +; CHECK-NEXT: ret + ret <2 x half> +} + +define <2 x half> @vid_denominator2_v2f16() { +; CHECK-LABEL: vid_denominator2_v2f16: +; CHECK: # %bb.0: +; CHECK-NEXT: lui a0, %hi(.LCPI27_0) +; CHECK-NEXT: addi a0, a0, %lo(.LCPI27_0) +; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma +; CHECK-NEXT: vle16.v v8, (a0) +; CHECK-NEXT: ret + ret <2 x half> +} + +define <2 x half> @vid_step2_v2f16() { +; CHECK-LABEL: vid_step2_v2f16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma +; CHECK-NEXT: vid.v v8 +; CHECK-NEXT: vadd.vv v8, v8, v8 +; CHECK-NEXT: vfcvt.f.x.v v8, v8 +; CHECK-NEXT: ret + ret <2 x half> +} + +define <2 x float> @vid_v2f32() { +; CHECK-LABEL: vid_v2f32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma +; CHECK-NEXT: vid.v v8 +; CHECK-NEXT: vfcvt.f.x.v v8, v8 +; CHECK-NEXT: ret + ret <2 x float> +} + +define <2 x float> @vid_addend1_v2f32() { +; CHECK-LABEL: vid_addend1_v2f32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma +; CHECK-NEXT: vid.v v8 +; CHECK-NEXT: vadd.vi v8, v8, 1 +; CHECK-NEXT: vfcvt.f.x.v v8, v8 +; CHECK-NEXT: ret + ret <2 x float> +} + +define <2 x float> @vid_denominator2_v2f32() { +; CHECK-LABEL: vid_denominator2_v2f32: +; CHECK: # %bb.0: +; CHECK-NEXT: lui a0, %hi(.LCPI31_0) +; CHECK-NEXT: addi a0, a0, %lo(.LCPI31_0) +; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma +; CHECK-NEXT: vle32.v v8, (a0) +; CHECK-NEXT: ret + ret <2 x float> +} + +define <2 x float> @vid_step2_v2f32() { +; CHECK-LABEL: vid_step2_v2f32: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma +; CHECK-NEXT: vid.v v8 +; CHECK-NEXT: vadd.vv v8, v8, v8 +; CHECK-NEXT: vfcvt.f.x.v v8, v8 +; CHECK-NEXT: ret + ret <2 x float> +} + +define <2 x double> @vid_v2f64() { +; CHECK-LABEL: vid_v2f64: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma +; CHECK-NEXT: vid.v v8 +; CHECK-NEXT: vfcvt.f.x.v v8, v8 +; CHECK-NEXT: ret + ret <2 x double> +} + +define <2 x double> @vid_addend1_v2f64() { +; CHECK-LABEL: vid_addend1_v2f64: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma +; CHECK-NEXT: vid.v v8 +; CHECK-NEXT: vadd.vi v8, v8, 1 +; CHECK-NEXT: vfcvt.f.x.v v8, v8 +; CHECK-NEXT: ret + ret <2 x double> +} + +define <2 x double> @vid_denominator2_v2f64() { +; CHECK-LABEL: vid_denominator2_v2f64: +; CHECK: # %bb.0: +; CHECK-NEXT: lui a0, %hi(.LCPI35_0) +; CHECK-NEXT: addi a0, a0, %lo(.LCPI35_0) +; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma +; CHECK-NEXT: vle64.v v8, (a0) +; CHECK-NEXT: ret + ret <2 x double> +} + +define <2 x double> @vid_step2_v2f64() { +; CHECK-LABEL: vid_step2_v2f64: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma +; CHECK-NEXT: vid.v v8 +; CHECK-NEXT: vadd.vv v8, v8, v8 +; CHECK-NEXT: vfcvt.f.x.v v8, v8 +; CHECK-NEXT: ret + ret <2 x double> +} diff --git a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int-buildvec.ll b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int-buildvec.ll index e95978744c408..b648420aa2e03 100644 --- a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int-buildvec.ll +++ b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int-buildvec.ll @@ -259,7 +259,7 @@ define <4 x i8> @buildvec_vid_stepn3_add3_v4i8() { ; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma ; CHECK-NEXT: vmv.v.i v9, 3 ; CHECK-NEXT: vid.v v8 -; CHECK-NEXT: li a0, -3 +; CHECK-NEXT: li a0, 253 ; CHECK-NEXT: vmadd.vx v8, a0, v9 ; CHECK-NEXT: ret ret <4 x i8>