| Index: src/compiler/typed-optimization.cc
|
| diff --git a/src/compiler/typed-optimization.cc b/src/compiler/typed-optimization.cc
|
| index 5ebc390c8bc6a1d5f2c7bc3807211ebb88dba30c..8149a1bee4492903d33cacaffe62ad098e633db9 100644
|
| --- a/src/compiler/typed-optimization.cc
|
| +++ b/src/compiler/typed-optimization.cc
|
| @@ -83,10 +83,11 @@ Reduction TypedOptimization::Reduce(Node* node) {
|
| case IrOpcode::kLoadField:
|
| return ReduceLoadField(node);
|
| case IrOpcode::kNumberCeil:
|
| - case IrOpcode::kNumberFloor:
|
| case IrOpcode::kNumberRound:
|
| case IrOpcode::kNumberTrunc:
|
| return ReduceNumberRoundop(node);
|
| + case IrOpcode::kNumberFloor:
|
| + return ReduceNumberFloor(node);
|
| case IrOpcode::kNumberToUint8Clamped:
|
| return ReduceNumberToUint8Clamped(node);
|
| case IrOpcode::kPhi:
|
| @@ -185,6 +186,40 @@ Reduction TypedOptimization::ReduceLoadField(Node* node) {
|
| return NoChange();
|
| }
|
|
|
| +Reduction TypedOptimization::ReduceNumberFloor(Node* node) {
|
| + Node* const input = NodeProperties::GetValueInput(node, 0);
|
| + Type* const input_type = NodeProperties::GetType(input);
|
| + if (input_type->Is(type_cache_.kIntegerOrMinusZeroOrNaN)) {
|
| + return Replace(input);
|
| + }
|
| + if (input_type->Is(Type::PlainNumber()) &&
|
| + input->opcode() == IrOpcode::kNumberDivide) {
|
| + Node* const lhs = NodeProperties::GetValueInput(input, 0);
|
| + Type* const lhs_type = NodeProperties::GetType(lhs);
|
| + Node* const rhs = NodeProperties::GetValueInput(input, 1);
|
| + Type* const rhs_type = NodeProperties::GetType(rhs);
|
| + if (lhs_type->Is(Type::Unsigned32()) && rhs_type->Is(Type::Unsigned32())) {
|
| + // We can replace
|
| + //
|
| + // NumberFloor(NumberDivide(lhs: unsigned32,
|
| + // rhs: unsigned32)): plain-number
|
| + //
|
| + // with
|
| + //
|
| + // NumberToUint32(NumberDivide(lhs, rhs))
|
| + //
|
| + // and just smash the type of the {lhs} on the {node},
|
| + // as the truncated result must be in the same range as
|
| + // {lhs} since {rhs} cannot be less than 1 (due to the
|
| + // plain-number type constraint on the {node}).
|
| + NodeProperties::ChangeOp(node, simplified()->NumberToUint32());
|
| + NodeProperties::SetType(node, lhs_type);
|
| + return Changed(node);
|
| + }
|
| + }
|
| + return NoChange();
|
| +}
|
| +
|
| Reduction TypedOptimization::ReduceNumberRoundop(Node* node) {
|
| Node* const input = NodeProperties::GetValueInput(node, 0);
|
| Type* const input_type = NodeProperties::GetType(input);
|
|
|