Chromium Code Reviews| Index: src/compiler/simplified-lowering.cc |
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
| index e7aaf43535a54e0bf27a1361265758a28c9d7532..f19f978ef2569e7132e13e4a80206f9de4ccc411 100644 |
| --- a/src/compiler/simplified-lowering.cc |
| +++ b/src/compiler/simplified-lowering.cc |
| @@ -1101,7 +1101,17 @@ class RepresentationSelector { |
| } |
| // Try to use type feedback. |
| - BinaryOperationHints::Hint hint = BinaryOperationHintOf(node->op()); |
| + NumberOperationHint hint = NumberOperationHintOf(node->op()); |
| + if (hint == NumberOperationHint::kNone) { |
| + // TODO(turbofan): Shall we change any deopts that are caused by this |
| + // speculation to soft ones so we don't count against the deopt limit? |
| + if (TypeOf(node->InputAt(0))->Maybe(Type::Signed32()) && |
| + TypeOf(node->InputAt(1))->Maybe(Type::Signed32())) { |
| + hint = NumberOperationHint::kSigned32; |
| + } else { |
| + hint = NumberOperationHint::kNumberOrOddball; |
|
Jarin
2016/07/26 09:39:21
I doubt this helps anything - if the type cannot b
|
| + } |
| + } |
| // Handle the case when no int32 checks on inputs are necessary |
| // (but an overflow check is needed on the output). |
| @@ -1109,8 +1119,7 @@ class RepresentationSelector { |
| (BothInputsAre(node, type_cache_.kSigned32OrMinusZero) && |
| NodeProperties::GetType(node)->Is(type_cache_.kSafeInteger))) { |
| // If both the inputs the feedback are int32, use the overflow op. |
| - if (hint == BinaryOperationHints::kSignedSmall || |
| - hint == BinaryOperationHints::kSigned32) { |
| + if (hint == NumberOperationHint::kSigned32) { |
| VisitBinop(node, UseInfo::TruncatingWord32(), |
| MachineRepresentation::kWord32, Type::Signed32()); |
| if (lower()) ChangeToInt32OverflowOp(node); |
| @@ -1118,8 +1127,7 @@ class RepresentationSelector { |
| } |
| } |
| - if (hint == BinaryOperationHints::kSignedSmall || |
| - hint == BinaryOperationHints::kSigned32) { |
| + if (hint == NumberOperationHint::kSigned32) { |
| VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), |
| MachineRepresentation::kWord32, Type::Signed32()); |
| if (lower()) ChangeToInt32OverflowOp(node); |
| @@ -1127,6 +1135,7 @@ class RepresentationSelector { |
| } |
| // default case => Float64Add/Sub |
| + DCHECK_EQ(NumberOperationHint::kNumberOrOddball, hint); |
| VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), |
| MachineRepresentation::kFloat64, Type::Number()); |
| if (lower()) { |
| @@ -1296,16 +1305,26 @@ class RepresentationSelector { |
| return; |
| } |
| // Try to use type feedback. |
| - CompareOperationHints::Hint hint = CompareOperationHintOf(node->op()); |
| + NumberOperationHint hint = NumberOperationHintOf(node->op()); |
| + if (hint == NumberOperationHint::kNone) { |
| + // TODO(turbofan): Shall we change any deopts that are caused by this |
| + // speculation to soft ones so we don't count against the deopt limit? |
| + if (TypeOf(node->InputAt(0))->Maybe(Type::Signed32()) && |
| + TypeOf(node->InputAt(1))->Maybe(Type::Signed32())) { |
| + hint = NumberOperationHint::kSigned32; |
| + } else { |
| + hint = NumberOperationHint::kNumberOrOddball; |
| + } |
| + } |
| - if (hint == CompareOperationHints::kSignedSmall) { |
| + if (hint == NumberOperationHint::kSigned32) { |
| VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), |
| MachineRepresentation::kBit); |
| if (lower()) ChangeToPureOp(node, Int32Op(node)); |
| return; |
| } |
| - DCHECK_EQ(CompareOperationHints::kNumberOrOddball, hint); |
| // default case => Float64 comparison |
| + DCHECK_EQ(NumberOperationHint::kNumberOrOddball, hint); |
| VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), |
| MachineRepresentation::kBit); |
| if (lower()) ChangeToPureOp(node, Float64Op(node)); |
| @@ -1358,7 +1377,17 @@ class RepresentationSelector { |
| return; |
| } |
| // Try to use type feedback. |
| - BinaryOperationHints::Hint hint = BinaryOperationHintOf(node->op()); |
| + NumberOperationHint hint = NumberOperationHintOf(node->op()); |
| + if (hint == NumberOperationHint::kNone) { |
| + // TODO(turbofan): Shall we change any deopts that are caused by this |
| + // speculation to soft ones so we don't count against the deopt limit? |
| + if (TypeOf(node->InputAt(0))->Maybe(Type::Signed32()) && |
| + TypeOf(node->InputAt(1))->Maybe(Type::Signed32())) { |
| + hint = NumberOperationHint::kSigned32; |
| + } else { |
| + hint = NumberOperationHint::kNumberOrOddball; |
| + } |
| + } |
| Type* input0_type = TypeOf(node->InputAt(0)); |
| Type* input1_type = TypeOf(node->InputAt(1)); |
| @@ -1366,8 +1395,7 @@ class RepresentationSelector { |
| // (but an overflow check is needed on the output). |
| if (BothInputsAre(node, Type::Signed32())) { |
| // If both the inputs the feedback are int32, use the overflow op. |
| - if (hint == BinaryOperationHints::kSignedSmall || |
| - hint == BinaryOperationHints::kSigned32) { |
| + if (hint == NumberOperationHint::kSigned32) { |
| VisitBinop(node, UseInfo::TruncatingWord32(), |
| MachineRepresentation::kWord32, Type::Signed32()); |
| if (lower()) { |
| @@ -1378,8 +1406,7 @@ class RepresentationSelector { |
| } |
| } |
| - if (hint == BinaryOperationHints::kSignedSmall || |
| - hint == BinaryOperationHints::kSigned32) { |
| + if (hint == NumberOperationHint::kSigned32) { |
| VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), |
| MachineRepresentation::kWord32, Type::Signed32()); |
| if (lower()) { |
| @@ -1389,6 +1416,7 @@ class RepresentationSelector { |
| } |
| // Checked float64 x float64 => float64 |
| + DCHECK_EQ(NumberOperationHint::kNumberOrOddball, hint); |
| VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), |
| MachineRepresentation::kFloat64, Type::Number()); |
| if (lower()) ChangeToPureOp(node, Float64Op(node)); |
| @@ -1445,13 +1473,22 @@ class RepresentationSelector { |
| } |
| // Try to use type feedback. |
| - BinaryOperationHints::Hint hint = BinaryOperationHintOf(node->op()); |
| + NumberOperationHint hint = NumberOperationHintOf(node->op()); |
| + if (hint == NumberOperationHint::kNone) { |
| + // TODO(turbofan): Shall we change any deopts that are caused by this |
| + // speculation to soft ones so we don't count against the deopt limit? |
| + if (TypeOf(node->InputAt(0))->Maybe(Type::Signed32()) && |
| + TypeOf(node->InputAt(1))->Maybe(Type::Signed32())) { |
| + hint = NumberOperationHint::kSigned32; |
| + } else { |
| + hint = NumberOperationHint::kNumberOrOddball; |
| + } |
| + } |
| // Handle the case when no uint32 checks on inputs are necessary |
| // (but an overflow check is needed on the output). |
| if (BothInputsAreUnsigned32(node)) { |
| - if (hint == BinaryOperationHints::kSignedSmall || |
| - hint == BinaryOperationHints::kSigned32) { |
| + if (hint == NumberOperationHint::kSigned32) { |
| VisitBinop(node, UseInfo::TruncatingWord32(), |
| MachineRepresentation::kWord32, Type::Unsigned32()); |
| if (lower()) ChangeToUint32OverflowOp(node); |
| @@ -1463,8 +1500,7 @@ class RepresentationSelector { |
| // (but an overflow check is needed on the output). |
| if (BothInputsAreSigned32(node)) { |
| // If both the inputs the feedback are int32, use the overflow op. |
| - if (hint == BinaryOperationHints::kSignedSmall || |
| - hint == BinaryOperationHints::kSigned32) { |
| + if (hint == NumberOperationHint::kSigned32) { |
| VisitBinop(node, UseInfo::TruncatingWord32(), |
| MachineRepresentation::kWord32, Type::Signed32()); |
| if (lower()) ChangeToInt32OverflowOp(node); |
| @@ -1472,8 +1508,7 @@ class RepresentationSelector { |
| } |
| } |
| - if (hint == BinaryOperationHints::kSignedSmall || |
| - hint == BinaryOperationHints::kSigned32) { |
| + if (hint == NumberOperationHint::kSigned32) { |
| // If the result is truncated, we only need to check the inputs. |
| if (truncation.IsUsedAsWord32()) { |
| VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), |
| @@ -1488,6 +1523,7 @@ class RepresentationSelector { |
| } |
| // default case => Float64Div |
| + DCHECK_EQ(NumberOperationHint::kNumberOrOddball, hint); |
| VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), |
| MachineRepresentation::kFloat64, Type::Number()); |
| if (lower()) ChangeToPureOp(node, Float64Op(node)); |
| @@ -1557,13 +1593,22 @@ class RepresentationSelector { |
| } |
| // Try to use type feedback. |
| - BinaryOperationHints::Hint hint = BinaryOperationHintOf(node->op()); |
| + NumberOperationHint hint = NumberOperationHintOf(node->op()); |
| + if (hint == NumberOperationHint::kNone) { |
| + // TODO(turbofan): Shall we change any deopts that are caused by this |
| + // speculation to soft ones so we don't count against the deopt limit? |
| + if (TypeOf(node->InputAt(0))->Maybe(Type::Signed32()) && |
| + TypeOf(node->InputAt(1))->Maybe(Type::Signed32())) { |
| + hint = NumberOperationHint::kSigned32; |
| + } else { |
| + hint = NumberOperationHint::kNumberOrOddball; |
| + } |
| + } |
| // Handle the case when no uint32 checks on inputs are necessary |
| // (but an overflow check is needed on the output). |
| if (BothInputsAreUnsigned32(node)) { |
| - if (hint == BinaryOperationHints::kSignedSmall || |
| - hint == BinaryOperationHints::kSigned32) { |
| + if (hint == NumberOperationHint::kSigned32) { |
| VisitBinop(node, UseInfo::TruncatingWord32(), |
| MachineRepresentation::kWord32, Type::Unsigned32()); |
| if (lower()) ChangeToUint32OverflowOp(node); |
| @@ -1575,8 +1620,7 @@ class RepresentationSelector { |
| // (but an overflow check is needed on the output). |
| if (BothInputsAre(node, Type::Signed32())) { |
| // If both the inputs the feedback are int32, use the overflow op. |
| - if (hint == BinaryOperationHints::kSignedSmall || |
| - hint == BinaryOperationHints::kSigned32) { |
| + if (hint == NumberOperationHint::kSigned32) { |
| VisitBinop(node, UseInfo::TruncatingWord32(), |
| MachineRepresentation::kWord32, Type::Signed32()); |
| if (lower()) ChangeToInt32OverflowOp(node); |
| @@ -1584,8 +1628,7 @@ class RepresentationSelector { |
| } |
| } |
| - if (hint == BinaryOperationHints::kSignedSmall || |
| - hint == BinaryOperationHints::kSigned32) { |
| + if (hint == NumberOperationHint::kSigned32) { |
| // If the result is truncated, we only need to check the inputs. |
| if (truncation.IsUsedAsWord32()) { |
| VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), |
| @@ -1600,6 +1643,7 @@ class RepresentationSelector { |
| } |
| // default case => Float64Mod |
| + DCHECK_EQ(NumberOperationHint::kNumberOrOddball, hint); |
| VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), |
| MachineRepresentation::kFloat64, Type::Number()); |
| if (lower()) ChangeToPureOp(node, Float64Op(node)); |
| @@ -1665,9 +1709,18 @@ class RepresentationSelector { |
| } |
| return; |
| } |
| - BinaryOperationHints::Hint hint = BinaryOperationHintOf(node->op()); |
| - if (hint == BinaryOperationHints::kSignedSmall || |
| - hint == BinaryOperationHints::kSigned32) { |
| + NumberOperationHint hint = NumberOperationHintOf(node->op()); |
| + if (hint == NumberOperationHint::kNone) { |
| + // TODO(turbofan): Shall we change any deopts that are caused by this |
| + // speculation to soft ones so we don't count against the deopt limit? |
| + if (TypeOf(node->InputAt(0))->Maybe(Type::Signed32()) && |
| + TypeOf(node->InputAt(1))->Maybe(Type::Signed32())) { |
| + hint = NumberOperationHint::kSigned32; |
| + } else { |
| + hint = NumberOperationHint::kNumberOrOddball; |
| + } |
| + } |
| + if (hint == NumberOperationHint::kSigned32) { |
| Type* rhs_type = GetUpperBound(node->InputAt(1)); |
| if (truncation.IsUsedAsWord32()) { |
| VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), |