diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp index c48470ab707f1..089dc6c529193 100644 --- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp @@ -128,6 +128,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget() { initializeRISCVPreRAExpandPseudoPass(*PR); initializeRISCVExpandPseudoPass(*PR); initializeRISCVVectorPeepholePass(*PR); + initializeRISCVVLOptimizerPass(*PR); initializeRISCVInsertVSETVLIPass(*PR); initializeRISCVInsertReadWriteCSRPass(*PR); initializeRISCVInsertWriteVXRMPass(*PR); diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index eb1f4df4ff726..d4d66c4e1cec5 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -431,7 +431,7 @@ static OperandInfo getOperandInfo(const MachineInstr &MI, case RISCV::VWMACCSU_VV: case RISCV::VWMACCSU_VX: case RISCV::VWMACCUS_VX: { - bool IsOp1 = HasPassthru ? MO.getOperandNo() == 1 : MO.getOperandNo() == 2; + bool IsOp1 = HasPassthru ? MO.getOperandNo() == 2 : MO.getOperandNo() == 1; bool TwoTimes = IsMODef || IsOp1; unsigned Log2EEW = TwoTimes ? MILog2SEW + 1 : MILog2SEW; RISCVII::VLMUL EMUL = @@ -467,7 +467,7 @@ static OperandInfo getOperandInfo(const MachineInstr &MI, case RISCV::VNCLIP_WI: case RISCV::VNCLIP_WV: case RISCV::VNCLIP_WX: { - bool IsOp1 = HasPassthru ? MO.getOperandNo() == 1 : MO.getOperandNo() == 2; + bool IsOp1 = HasPassthru ? MO.getOperandNo() == 2 : MO.getOperandNo() == 1; bool TwoTimes = IsOp1; unsigned Log2EEW = TwoTimes ? MILog2SEW + 1 : MILog2SEW; RISCVII::VLMUL EMUL = diff --git a/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.ll b/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.ll index 6e604d200a627..1a01a9bf77cff 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.ll @@ -40,13 +40,20 @@ declare @llvm.riscv.vnsrl.nxv2i16.nxv2i32.nxv2i16( iXLen); define @intrinsic_vnsrl_wv_nxv2i16_nxv2i32_nxv2i16( %a, %b, iXLen %2, %3, %4, %z) nounwind { -; CHECK-LABEL: intrinsic_vnsrl_wv_nxv2i16_nxv2i32_nxv2i16: -; CHECK: # %bb.0: # %entry -; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma -; CHECK-NEXT: vwadd.vv v10, v8, v9 -; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma -; CHECK-NEXT: vnsrl.wv v8, v10, v12 -; CHECK-NEXT: ret +; NOVLOPT-LABEL: intrinsic_vnsrl_wv_nxv2i16_nxv2i32_nxv2i16: +; NOVLOPT: # %bb.0: # %entry +; NOVLOPT-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; NOVLOPT-NEXT: vwadd.vv v10, v8, v9 +; NOVLOPT-NEXT: vsetvli zero, a0, e16, mf2, ta, ma +; NOVLOPT-NEXT: vnsrl.wv v8, v10, v12 +; NOVLOPT-NEXT: ret +; +; VLOPT-LABEL: intrinsic_vnsrl_wv_nxv2i16_nxv2i32_nxv2i16: +; VLOPT: # %bb.0: # %entry +; VLOPT-NEXT: vsetvli zero, a0, e16, mf2, ta, ma +; VLOPT-NEXT: vwadd.vv v10, v8, v9 +; VLOPT-NEXT: vnsrl.wv v8, v10, v12 +; VLOPT-NEXT: ret entry: %c = sext %a to %d = sext %b to @@ -67,14 +74,22 @@ declare @llvm.riscv.vnclip.nxv2i16.nxv2i32.nxv2i16( iXLen, iXLen); define @vnclip( %a, %b, iXLen %2, %3, %4, %z) nounwind { -; CHECK-LABEL: vnclip: -; CHECK: # %bb.0: # %entry -; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma -; CHECK-NEXT: vwadd.vv v10, v8, v9 -; CHECK-NEXT: csrwi vxrm, 0 -; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma -; CHECK-NEXT: vnclip.wv v8, v10, v12 -; CHECK-NEXT: ret +; NOVLOPT-LABEL: vnclip: +; NOVLOPT: # %bb.0: # %entry +; NOVLOPT-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; NOVLOPT-NEXT: vwadd.vv v10, v8, v9 +; NOVLOPT-NEXT: csrwi vxrm, 0 +; NOVLOPT-NEXT: vsetvli zero, a0, e16, mf2, ta, ma +; NOVLOPT-NEXT: vnclip.wv v8, v10, v12 +; NOVLOPT-NEXT: ret +; +; VLOPT-LABEL: vnclip: +; VLOPT: # %bb.0: # %entry +; VLOPT-NEXT: vsetvli zero, a0, e16, mf2, ta, ma +; VLOPT-NEXT: vwadd.vv v10, v8, v9 +; VLOPT-NEXT: csrwi vxrm, 0 +; VLOPT-NEXT: vnclip.wv v8, v10, v12 +; VLOPT-NEXT: ret entry: %c = sext %a to %d = sext %b to @@ -88,6 +103,3 @@ entry: ret %x } -;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: -; NOVLOPT: {{.*}} -; VLOPT: {{.*}} diff --git a/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir b/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir new file mode 100644 index 0000000000000..59a472c73a462 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir @@ -0,0 +1,18 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5 +# RUN: llc %s -o - -mtriple=riscv64 -mattr=+v -run-pass=riscv-vl-optimizer -verify-machineinstrs | FileCheck %s + +--- +name: vnsrl_wv_user +body: | + bb.0: + liveins: $x1 + ; CHECK-LABEL: name: vnsrl_wv_user + ; CHECK: liveins: $x1 + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: %vl:gprnox0 = COPY $x1 + ; CHECK-NEXT: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */ + %vl:gprnox0 = COPY $x1 + %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ + %y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */ +...