@@ -5295,12 +5295,13 @@ bool CombinerHelper::matchSubAddSameReg(MachineInstr &MI,
52955295 return false ;
52965296}
52975297
5298- MachineInstr *CombinerHelper::buildUDivUsingMul (MachineInstr &MI) const {
5299- assert (MI.getOpcode () == TargetOpcode::G_UDIV);
5300- auto &UDiv = cast<GenericMachineInstr>(MI);
5301- Register Dst = UDiv.getReg (0 );
5302- Register LHS = UDiv.getReg (1 );
5303- Register RHS = UDiv.getReg (2 );
5298+ MachineInstr *CombinerHelper::buildUDivorURemUsingMul (MachineInstr &MI) const {
5299+ unsigned Opcode = MI.getOpcode ();
5300+ assert (Opcode == TargetOpcode::G_UDIV || Opcode == TargetOpcode::G_UREM);
5301+ auto &UDivorRem = cast<GenericMachineInstr>(MI);
5302+ Register Dst = UDivorRem.getReg (0 );
5303+ Register LHS = UDivorRem.getReg (1 );
5304+ Register RHS = UDivorRem.getReg (2 );
53045305 LLT Ty = MRI.getType (Dst);
53055306 LLT ScalarTy = Ty.getScalarType ();
53065307 const unsigned EltBits = ScalarTy.getScalarSizeInBits ();
@@ -5453,11 +5454,18 @@ MachineInstr *CombinerHelper::buildUDivUsingMul(MachineInstr &MI) const {
54535454 auto IsOne = MIB.buildICmp (
54545455 CmpInst::Predicate::ICMP_EQ,
54555456 Ty.isScalar () ? LLT::scalar (1 ) : Ty.changeElementSize (1 ), RHS, One);
5456- return MIB.buildSelect (Ty, IsOne, LHS, Q);
5457+ auto ret = MIB.buildSelect (Ty, IsOne, LHS, Q);
5458+
5459+ if (Opcode == TargetOpcode::G_UREM) {
5460+ auto Prod = MIB.buildMul (Ty, ret, RHS);
5461+ return MIB.buildSub (Ty, LHS, Prod);
5462+ }
5463+ return ret;
54575464}
54585465
5459- bool CombinerHelper::matchUDivByConst (MachineInstr &MI) const {
5460- assert (MI.getOpcode () == TargetOpcode::G_UDIV);
5466+ bool CombinerHelper::matchUDivorURemByConst (MachineInstr &MI) const {
5467+ unsigned Opcode = MI.getOpcode ();
5468+ assert (Opcode == TargetOpcode::G_UDIV || Opcode == TargetOpcode::G_UREM);
54615469 Register Dst = MI.getOperand (0 ).getReg ();
54625470 Register RHS = MI.getOperand (2 ).getReg ();
54635471 LLT DstTy = MRI.getType (Dst);
@@ -5474,7 +5482,8 @@ bool CombinerHelper::matchUDivByConst(MachineInstr &MI) const {
54745482 if (MF.getFunction ().hasMinSize ())
54755483 return false ;
54765484
5477- if (MI.getFlag (MachineInstr::MIFlag::IsExact)) {
5485+ if (Opcode == TargetOpcode::G_UDIV &&
5486+ MI.getFlag (MachineInstr::MIFlag::IsExact)) {
54785487 return matchUnaryPredicate (
54795488 MRI, RHS, [](const Constant *C) { return C && !C->isNullValue (); });
54805489 }
@@ -5494,14 +5503,17 @@ bool CombinerHelper::matchUDivByConst(MachineInstr &MI) const {
54945503 {DstTy.isVector () ? DstTy.changeElementSize (1 ) : LLT::scalar (1 ),
54955504 DstTy}}))
54965505 return false ;
5506+ if (Opcode == TargetOpcode::G_UREM &&
5507+ !isLegalOrBeforeLegalizer ({TargetOpcode::G_SUB, {DstTy, DstTy}}))
5508+ return false ;
54975509 }
54985510
54995511 return matchUnaryPredicate (
55005512 MRI, RHS, [](const Constant *C) { return C && !C->isNullValue (); });
55015513}
55025514
5503- void CombinerHelper::applyUDivByConst (MachineInstr &MI) const {
5504- auto *NewMI = buildUDivUsingMul (MI);
5515+ void CombinerHelper::applyUDivorURemByConst (MachineInstr &MI) const {
5516+ auto *NewMI = buildUDivorURemUsingMul (MI);
55055517 replaceSingleDefInstWithReg (MI, NewMI->getOperand (0 ).getReg ());
55065518}
55075519
0 commit comments