Index: src/compiler/machine-operator-reducer.cc |
diff --git a/src/compiler/machine-operator-reducer.cc b/src/compiler/machine-operator-reducer.cc |
index 9b0c2b2f34222dc9c4da0928bf6b04b784224518..b7142a5f509d52907430928c226cedfdd468ed20 100644 |
--- a/src/compiler/machine-operator-reducer.cc |
+++ b/src/compiler/machine-operator-reducer.cc |
@@ -104,8 +104,14 @@ Node* MachineOperatorReducer::Int32Div(Node* dividend, int32_t divisor) { |
Node* MachineOperatorReducer::Uint32Div(Node* dividend, uint32_t divisor) { |
DCHECK_LT(0, divisor); |
+ // If the divisor is even, we can avoid using the expensive fixup by shifting |
+ // the dividend upfront. |
+ unsigned const shift = base::bits::CountTrailingZeros32(divisor); |
+ dividend = Word32Shr(dividend, shift); |
+ divisor >>= shift; |
+ // Compute the magic number for the (shifted) divisor. |
base::MagicNumbersForDivision<uint32_t> const mag = |
- base::UnsignedDivisionByConstant(bit_cast<uint32_t>(divisor)); |
+ base::UnsignedDivisionByConstant(divisor, shift); |
Node* quotient = graph()->NewNode(machine()->Uint32MulHigh(), dividend, |
Uint32Constant(mag.multiplier)); |
if (mag.add) { |