@@ -5300,7 +5300,7 @@ bool CombinerHelper::matchSubAddSameReg(MachineInstr &MI,
5300
5300
return false ;
5301
5301
}
5302
5302
5303
- MachineInstr *CombinerHelper::buildUDivorURemUsingMul (MachineInstr &MI) const {
5303
+ MachineInstr *CombinerHelper::buildUDivOrURemUsingMul (MachineInstr &MI) const {
5304
5304
unsigned Opcode = MI.getOpcode ();
5305
5305
assert (Opcode == TargetOpcode::G_UDIV || Opcode == TargetOpcode::G_UREM);
5306
5306
auto &UDivorRem = cast<GenericMachineInstr>(MI);
@@ -5468,7 +5468,7 @@ MachineInstr *CombinerHelper::buildUDivorURemUsingMul(MachineInstr &MI) const {
5468
5468
return ret;
5469
5469
}
5470
5470
5471
- bool CombinerHelper::matchUDivorURemByConst (MachineInstr &MI) const {
5471
+ bool CombinerHelper::matchUDivOrURemByConst (MachineInstr &MI) const {
5472
5472
unsigned Opcode = MI.getOpcode ();
5473
5473
assert (Opcode == TargetOpcode::G_UDIV || Opcode == TargetOpcode::G_UREM);
5474
5474
Register Dst = MI.getOperand (0 ).getReg ();
@@ -5517,13 +5517,14 @@ bool CombinerHelper::matchUDivorURemByConst(MachineInstr &MI) const {
5517
5517
MRI, RHS, [](const Constant *C) { return C && !C->isNullValue (); });
5518
5518
}
5519
5519
5520
- void CombinerHelper::applyUDivorURemByConst (MachineInstr &MI) const {
5521
- auto *NewMI = buildUDivorURemUsingMul (MI);
5520
+ void CombinerHelper::applyUDivOrURemByConst (MachineInstr &MI) const {
5521
+ auto *NewMI = buildUDivOrURemUsingMul (MI);
5522
5522
replaceSingleDefInstWithReg (MI, NewMI->getOperand (0 ).getReg ());
5523
5523
}
5524
5524
5525
- bool CombinerHelper::matchSDivByConst (MachineInstr &MI) const {
5526
- assert (MI.getOpcode () == TargetOpcode::G_SDIV && " Expected SDIV" );
5525
+ bool CombinerHelper::matchSDivOrSRemByConst (MachineInstr &MI) const {
5526
+ unsigned Opcode = MI.getOpcode ();
5527
+ assert (Opcode == TargetOpcode::G_SDIV || Opcode == TargetOpcode::G_SREM);
5527
5528
Register Dst = MI.getOperand (0 ).getReg ();
5528
5529
Register RHS = MI.getOperand (2 ).getReg ();
5529
5530
LLT DstTy = MRI.getType (Dst);
@@ -5543,7 +5544,8 @@ bool CombinerHelper::matchSDivByConst(MachineInstr &MI) const {
5543
5544
return false ;
5544
5545
5545
5546
// If the sdiv has an 'exact' flag we can use a simpler lowering.
5546
- if (MI.getFlag (MachineInstr::MIFlag::IsExact)) {
5547
+ if (Opcode == TargetOpcode::G_SDIV &&
5548
+ MI.getFlag (MachineInstr::MIFlag::IsExact)) {
5547
5549
return matchUnaryPredicate (
5548
5550
MRI, RHS, [](const Constant *C) { return C && !C->isNullValue (); });
5549
5551
}
@@ -5559,23 +5561,28 @@ bool CombinerHelper::matchSDivByConst(MachineInstr &MI) const {
5559
5561
if (!isLegal ({TargetOpcode::G_SMULH, {DstTy}}) &&
5560
5562
!isLegalOrHasWidenScalar ({TargetOpcode::G_MUL, {WideTy, WideTy}}))
5561
5563
return false ;
5564
+ if (Opcode == TargetOpcode::G_SREM &&
5565
+ !isLegalOrBeforeLegalizer ({TargetOpcode::G_SUB, {DstTy, DstTy}}))
5566
+ return false ;
5562
5567
}
5563
5568
5564
5569
return matchUnaryPredicate (
5565
5570
MRI, RHS, [](const Constant *C) { return C && !C->isNullValue (); });
5566
5571
}
5567
5572
5568
- void CombinerHelper::applySDivByConst (MachineInstr &MI) const {
5569
- auto *NewMI = buildSDivUsingMul (MI);
5573
+ void CombinerHelper::applySDivOrSRemByConst (MachineInstr &MI) const {
5574
+ auto *NewMI = buildSDivOrSRemUsingMul (MI);
5570
5575
replaceSingleDefInstWithReg (MI, NewMI->getOperand (0 ).getReg ());
5571
5576
}
5572
5577
5573
- MachineInstr *CombinerHelper::buildSDivUsingMul (MachineInstr &MI) const {
5574
- assert (MI.getOpcode () == TargetOpcode::G_SDIV && " Expected SDIV" );
5575
- auto &SDiv = cast<GenericMachineInstr>(MI);
5576
- Register Dst = SDiv.getReg (0 );
5577
- Register LHS = SDiv.getReg (1 );
5578
- Register RHS = SDiv.getReg (2 );
5578
+ MachineInstr *CombinerHelper::buildSDivOrSRemUsingMul (MachineInstr &MI) const {
5579
+ unsigned Opcode = MI.getOpcode ();
5580
+ assert (MI.getOpcode () == TargetOpcode::G_SDIV ||
5581
+ Opcode == TargetOpcode::G_SREM);
5582
+ auto &SDivorRem = cast<GenericMachineInstr>(MI);
5583
+ Register Dst = SDivorRem.getReg (0 );
5584
+ Register LHS = SDivorRem.getReg (1 );
5585
+ Register RHS = SDivorRem.getReg (2 );
5579
5586
LLT Ty = MRI.getType (Dst);
5580
5587
LLT ScalarTy = Ty.getScalarType ();
5581
5588
const unsigned EltBits = ScalarTy.getScalarSizeInBits ();
@@ -5705,7 +5712,13 @@ MachineInstr *CombinerHelper::buildSDivUsingMul(MachineInstr &MI) const {
5705
5712
auto SignShift = MIB.buildConstant (ShiftAmtTy, EltBits - 1 );
5706
5713
auto T = MIB.buildLShr (Ty, Q, SignShift);
5707
5714
T = MIB.buildAnd (Ty, T, ShiftMask);
5708
- return MIB.buildAdd (Ty, Q, T);
5715
+ auto ret = MIB.buildAdd (Ty, Q, T);
5716
+
5717
+ if (Opcode == TargetOpcode::G_SREM) {
5718
+ auto Prod = MIB.buildMul (Ty, ret, RHS);
5719
+ return MIB.buildSub (Ty, LHS, Prod);
5720
+ }
5721
+ return ret;
5709
5722
}
5710
5723
5711
5724
bool CombinerHelper::matchDivByPow2 (MachineInstr &MI, bool IsSigned) const {
0 commit comments