[llvm] [RISCV] Move performCombineVMergeAndVOps to RISCVVectorPeephole (PR #144076)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 13 09:10:32 PDT 2025
================
@@ -663,6 +674,133 @@ bool RISCVVectorPeephole::foldVMV_V_V(MachineInstr &MI) {
return true;
}
+/// Try to fold away VMERGE_VVM instructions into their operands:
+///
+/// %true = PseudoVADD_VV ...
+/// %x = PseudoVMERGE_VVM_M1 %false, %false, %true, %mask
+/// ->
+/// %x = PseudoVADD_VV_M1_MASK %false, ..., %mask
+///
+/// We can only fold if vmerge's passthru operand, vmerge's false operand and
+/// %true's passthru operand (if it has one) are the same. This is because we
+/// have to consolidate them into one passthru operand in the result.
+///
+/// If %true is masked, then we can use its mask instead of vmerge's if vmerge's
+/// mask is all ones.
+///
+/// The resulting VL is the minimum of the two VLs.
+///
+/// The resulting policy is the effective policy the vmerge would have had,
+/// i.e. whether or not it's passthru operand was implicit-def.
+bool RISCVVectorPeephole::foldVMergeToMask(MachineInstr &MI) const {
+ if (RISCV::getRVVMCOpcode(MI.getOpcode()) != RISCV::VMERGE_VVM)
+ return false;
+
+ Register PassthruReg = MI.getOperand(1).getReg();
+ Register FalseReg = MI.getOperand(2).getReg();
+ Register TrueReg = MI.getOperand(3).getReg();
+ if (!TrueReg.isVirtual() || !MRI->hasOneUse(TrueReg))
+ return false;
+ MachineInstr &True = *MRI->getUniqueVRegDef(TrueReg);
+ if (True.getParent() != MI.getParent())
+ return false;
+ const MachineOperand &MaskOp = MI.getOperand(4);
+ MachineInstr *Mask = MRI->getUniqueVRegDef(MaskOp.getReg());
+ assert(Mask);
+
+ const RISCV::RISCVMaskedPseudoInfo *Info =
+ RISCV::lookupMaskedIntrinsicByUnmasked(True.getOpcode());
+ if (!Info)
+ return false;
+
+ // If the EEW of True is different from vmerge's SEW, then we can't fold.
+ if (!hasSameEEW(MI, True))
+ return false;
+
+ // We require that either passthru and false are the same, or that passthru
+ // is undefined.
+ if (PassthruReg != RISCV::NoRegister &&
----------------
topperc wrote:
`TruePassthru.isValid()` or `TruePassthru`
I've slowly trying to remove the implicit conversion of Register to unsigned.
https://github.com/llvm/llvm-project/pull/144076
More information about the llvm-commits
mailing list