@@ -5179,13 +5179,9 @@ MachineInstr *CombinerHelper::buildUDivUsingMul(MachineInstr &MI) {
5179
5179
LLT ShiftAmtTy = getTargetLowering ().getPreferredShiftAmountTy (Ty);
5180
5180
LLT ScalarShiftAmtTy = ShiftAmtTy.getScalarType ();
5181
5181
5182
- unsigned KnownLeadingZeros =
5183
- KB ? KB->getKnownBits (LHS).countMinLeadingZeros () : 0 ;
5184
5182
auto &MIB = Builder;
5185
5183
5186
5184
bool UseSRL = false ;
5187
- bool UseNPQ = false ;
5188
- SmallVector<Register, 16 > PreShifts, PostShifts, MagicFactors, NPQFactors;
5189
5185
SmallVector<Register, 16 > Shifts, Factors;
5190
5186
auto *RHSDefInstr = cast<GenericMachineInstr>(getDefIgnoringCopies (RHS, MRI));
5191
5187
bool IsSplat = getIConstantSplatVal (*RHSDefInstr, MRI).has_value ();
@@ -5213,6 +5209,33 @@ MachineInstr *CombinerHelper::buildUDivUsingMul(MachineInstr &MI) {
5213
5209
return true ;
5214
5210
};
5215
5211
5212
+ if (MI.getFlag (MachineInstr::MIFlag::IsExact)) {
5213
+ // Collect all magic values from the build vector.
5214
+ if (!matchUnaryPredicate (MRI, RHS, BuildExactUDIVPattern))
5215
+ llvm_unreachable (" Expected unary predicate match to succeed" );
5216
+
5217
+ Register Shift, Factor;
5218
+ if (Ty.isVector ()) {
5219
+ Shift = MIB.buildBuildVector (ShiftAmtTy, Shifts).getReg (0 );
5220
+ Factor = MIB.buildBuildVector (Ty, Factors).getReg (0 );
5221
+ } else {
5222
+ Shift = Shifts[0 ];
5223
+ Factor = Factors[0 ];
5224
+ }
5225
+
5226
+ Register Res = LHS;
5227
+
5228
+ if (UseSRL)
5229
+ Res = MIB.buildLShr (Ty, Res, Shift, MachineInstr::IsExact).getReg (0 );
5230
+
5231
+ return MIB.buildMul (Ty, Res, Factor);
5232
+ }
5233
+
5234
+ unsigned KnownLeadingZeros =
5235
+ KB ? KB->getKnownBits (LHS).countMinLeadingZeros () : 0 ;
5236
+
5237
+ bool UseNPQ = false ;
5238
+ SmallVector<Register, 16 > PreShifts, PostShifts, MagicFactors, NPQFactors;
5216
5239
auto BuildUDIVPattern = [&](const Constant *C) {
5217
5240
auto *CI = cast<ConstantInt>(C);
5218
5241
const APInt &Divisor = CI->getValue ();
@@ -5258,29 +5281,6 @@ MachineInstr *CombinerHelper::buildUDivUsingMul(MachineInstr &MI) {
5258
5281
return true ;
5259
5282
};
5260
5283
5261
- if (MI.getFlag (MachineInstr::MIFlag::IsExact)) {
5262
- // Collect all magic values from the build vector.
5263
- bool Matched = matchUnaryPredicate (MRI, RHS, BuildExactUDIVPattern);
5264
- (void )Matched;
5265
- assert (Matched && " Expected unary predicate match to succeed" );
5266
-
5267
- Register Shift, Factor;
5268
- if (Ty.isVector ()) {
5269
- Shift = MIB.buildBuildVector (ShiftAmtTy, Shifts).getReg (0 );
5270
- Factor = MIB.buildBuildVector (Ty, Factors).getReg (0 );
5271
- } else {
5272
- Shift = Shifts[0 ];
5273
- Factor = Factors[0 ];
5274
- }
5275
-
5276
- Register Res = LHS;
5277
-
5278
- if (UseSRL)
5279
- Res = MIB.buildLShr (Ty, Res, Shift, MachineInstr::IsExact).getReg (0 );
5280
-
5281
- return MIB.buildMul (Ty, Res, Factor);
5282
- }
5283
-
5284
5284
// Collect the shifts/magic values from each element.
5285
5285
bool Matched = matchUnaryPredicate (MRI, RHS, BuildUDIVPattern);
5286
5286
(void )Matched;
0 commit comments