diff --git a/llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp b/llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp index 34e5d9224f715..7ec709b76697e 100644 --- a/llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp +++ b/llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp @@ -329,8 +329,8 @@ bool RISCVVectorPeephole::convertToWholeRegister(MachineInstr &MI) const { return true; } -// Transform (VMERGE_VVM_ false, false, true, allones, vl, sew) to -// (VMV_V_V_ false, true, vl, sew). It may decrease uses of VMSET. +// Transform (VMERGE_VVM_ pt, false, true, allones, vl, sew) to +// (VMV_V_V_ pt, true, vl, sew). It may decrease uses of VMSET. bool RISCVVectorPeephole::convertVMergeToVMv(MachineInstr &MI) const { #define CASE_VMERGE_TO_VMV(lmul) \ case RISCV::PseudoVMERGE_VVM_##lmul: \ @@ -349,21 +349,12 @@ bool RISCVVectorPeephole::convertVMergeToVMv(MachineInstr &MI) const { CASE_VMERGE_TO_VMV(M8) } - Register PassthruReg = MI.getOperand(1).getReg(); - Register FalseReg = MI.getOperand(2).getReg(); - // Check passthru == false (or passthru == undef) - if (PassthruReg != RISCV::NoRegister && - TRI->lookThruCopyLike(PassthruReg, MRI) != - TRI->lookThruCopyLike(FalseReg, MRI)) - return false; - assert(MI.getOperand(4).isReg() && MI.getOperand(4).getReg() == RISCV::V0); if (!isAllOnesMask(V0Defs.lookup(&MI))) return false; MI.setDesc(TII->get(NewOpc)); - MI.removeOperand(1); // Passthru operand - MI.tieOperands(0, 1); // Tie false to dest + MI.removeOperand(2); // False operand MI.removeOperand(3); // Mask operand MI.addOperand( MachineOperand::CreateImm(RISCVII::TAIL_UNDISTURBED_MASK_UNDISTURBED)); @@ -371,7 +362,8 @@ bool RISCVVectorPeephole::convertVMergeToVMv(MachineInstr &MI) const { // vmv.v.v doesn't have a mask operand, so we may be able to inflate the // register class for the destination and passthru operands e.g. VRNoV0 -> VR MRI->recomputeRegClass(MI.getOperand(0).getReg()); - MRI->recomputeRegClass(MI.getOperand(1).getReg()); + if (MI.getOperand(1).getReg() != RISCV::NoRegister) + MRI->recomputeRegClass(MI.getOperand(1).getReg()); return true; } diff --git a/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-to-vmv.mir b/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-to-vmv.mir index 01fff3de0aa8b..1419eede6ca9d 100644 --- a/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-to-vmv.mir +++ b/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-to-vmv.mir @@ -15,7 +15,7 @@ body: | ; CHECK-NEXT: %avl:gprnox0 = COPY $x1 ; CHECK-NEXT: %mask:vmv0 = PseudoVMSET_M_B8 %avl, 5 /* e32 */ ; CHECK-NEXT: $v0 = COPY %mask - ; CHECK-NEXT: %x:vr = PseudoVMV_V_V_M1 %false, %true, %avl, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: %x:vr = PseudoVMV_V_V_M1 $noreg, %true, %avl, 5 /* e32 */, 0 /* tu, mu */ %false:vr = COPY $v8 %true:vr = COPY $v9 %avl:gprnox0 = COPY $x1 @@ -31,13 +31,13 @@ body: | ; CHECK-LABEL: name: undef_false ; CHECK: liveins: $x1, $v8, $v9 ; CHECK-NEXT: {{ $}} - ; CHECK-NEXT: %pt:vrnov0 = COPY $v8 + ; CHECK-NEXT: %pt:vr = COPY $v8 ; CHECK-NEXT: %false:vr = COPY $noreg ; CHECK-NEXT: %true:vr = COPY $v9 ; CHECK-NEXT: %avl:gprnox0 = COPY $x1 ; CHECK-NEXT: %mask:vmv0 = PseudoVMSET_M_B8 %avl, 5 /* e32 */ ; CHECK-NEXT: $v0 = COPY %mask - ; CHECK-NEXT: %x:vrnov0 = PseudoVMERGE_VVM_M1 %pt, %false, %true, $v0, %avl, 5 /* e32 */ + ; CHECK-NEXT: %x:vr = PseudoVMV_V_V_M1 %pt, %true, %avl, 5 /* e32 */, 0 /* tu, mu */ %pt:vrnov0 = COPY $v8 %false:vr = COPY $noreg %true:vr = COPY $v9 @@ -55,12 +55,12 @@ body: | ; CHECK: liveins: $x1, $v8, $v9 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %false:vr = COPY $v8 - ; CHECK-NEXT: %pt:vrnov0 = COPY $v8 + ; CHECK-NEXT: %pt:vr = COPY $v8 ; CHECK-NEXT: %true:vr = COPY $v9 ; CHECK-NEXT: %avl:gprnox0 = COPY $x1 ; CHECK-NEXT: %mask:vmv0 = PseudoVMSET_M_B8 %avl, 5 /* e32 */ ; CHECK-NEXT: $v0 = COPY %mask - ; CHECK-NEXT: %x:vr = PseudoVMV_V_V_M1 %false, %true, %avl, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: %x:vr = PseudoVMV_V_V_M1 %pt, %true, %avl, 5 /* e32 */, 0 /* tu, mu */ %false:vr = COPY $v8 %pt:vrnov0 = COPY $v8 %true:vr = COPY $v9