@@ -1699,6 +1699,10 @@ unsigned getPredicatedOpcode(unsigned Opcode) {
16991699 case RISCV::AND: return RISCV::PseudoCCAND;
17001700 case RISCV::OR: return RISCV::PseudoCCOR;
17011701 case RISCV::XOR: return RISCV::PseudoCCXOR;
1702+ case RISCV::MAX: return RISCV::PseudoCCMAX;
1703+ case RISCV::MAXU: return RISCV::PseudoCCMAXU;
1704+ case RISCV::MIN: return RISCV::PseudoCCMIN;
1705+ case RISCV::MINU: return RISCV::PseudoCCMINU;
17021706
17031707 case RISCV::ADDI: return RISCV::PseudoCCADDI;
17041708 case RISCV::SLLI: return RISCV::PseudoCCSLLI;
@@ -1735,14 +1739,21 @@ unsigned getPredicatedOpcode(unsigned Opcode) {
17351739// / return the defining instruction.
17361740static MachineInstr *canFoldAsPredicatedOp (Register Reg,
17371741 const MachineRegisterInfo &MRI,
1738- const TargetInstrInfo *TII) {
1742+ const TargetInstrInfo *TII,
1743+ const RISCVSubtarget &STI) {
17391744 if (!Reg.isVirtual ())
17401745 return nullptr ;
17411746 if (!MRI.hasOneNonDBGUse (Reg))
17421747 return nullptr ;
17431748 MachineInstr *MI = MRI.getVRegDef (Reg);
17441749 if (!MI)
17451750 return nullptr ;
1751+
1752+ if (!STI.hasShortForwardBranchIMinMax () &&
1753+ (MI->getOpcode () == RISCV::MAX || MI->getOpcode () == RISCV::MIN ||
1754+ MI->getOpcode () == RISCV::MINU || MI->getOpcode () == RISCV::MAXU))
1755+ return nullptr ;
1756+
17461757 // Check if MI can be predicated and folded into the CCMOV.
17471758 if (getPredicatedOpcode (MI->getOpcode ()) == RISCV::INSTRUCTION_LIST_END)
17481759 return nullptr ;
@@ -1806,10 +1817,10 @@ RISCVInstrInfo::optimizeSelect(MachineInstr &MI,
18061817
18071818 MachineRegisterInfo &MRI = MI.getParent ()->getParent ()->getRegInfo ();
18081819 MachineInstr *DefMI =
1809- canFoldAsPredicatedOp (MI.getOperand (5 ).getReg (), MRI, this );
1820+ canFoldAsPredicatedOp (MI.getOperand (5 ).getReg (), MRI, this , STI );
18101821 bool Invert = !DefMI;
18111822 if (!DefMI)
1812- DefMI = canFoldAsPredicatedOp (MI.getOperand (4 ).getReg (), MRI, this );
1823+ DefMI = canFoldAsPredicatedOp (MI.getOperand (4 ).getReg (), MRI, this , STI );
18131824 if (!DefMI)
18141825 return nullptr ;
18151826
0 commit comments