Index: src/compiler/effect-control-linearizer.cc |
diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc |
index 1e36187b0d321be20eeb607b075756afc2e97004..0749db73dd46fd459522f96f8d2a017fbe8b8c13 100644 |
--- a/src/compiler/effect-control-linearizer.cc |
+++ b/src/compiler/effect-control-linearizer.cc |
@@ -1667,41 +1667,54 @@ EffectControlLinearizer::LowerCheckedTaggedToInt32(Node* node, |
EffectControlLinearizer::ValueEffectControl |
EffectControlLinearizer::BuildCheckedHeapNumberOrOddballToFloat64( |
- Node* value, Node* frame_state, Node* effect, Node* control) { |
+ CheckTaggedInputMode mode, Node* value, Node* frame_state, Node* effect, |
+ Node* control) { |
Node* value_map = effect = graph()->NewNode( |
simplified()->LoadField(AccessBuilder::ForMap()), value, effect, control); |
+ |
Node* check_number = graph()->NewNode(machine()->WordEqual(), value_map, |
jsgraph()->HeapNumberMapConstant()); |
- Node* branch = graph()->NewNode(common()->Branch(BranchHint::kTrue), |
- check_number, control); |
- |
- Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
- Node* etrue = effect; |
- |
- Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
- // For oddballs also contain the numeric value, let us just check that |
- // we have an oddball here. |
- Node* efalse = effect; |
- Node* instance_type = efalse = graph()->NewNode( |
- simplified()->LoadField(AccessBuilder::ForMapInstanceType()), value_map, |
- efalse, if_false); |
- Node* check_oddball = |
- graph()->NewNode(machine()->Word32Equal(), instance_type, |
- jsgraph()->Int32Constant(ODDBALL_TYPE)); |
- if_false = efalse = |
- graph()->NewNode(common()->DeoptimizeUnless( |
- DeoptimizeReason::kNotAHeapNumberUndefinedBoolean), |
- check_oddball, frame_state, efalse, if_false); |
- STATIC_ASSERT(HeapNumber::kValueOffset == Oddball::kToNumberRawOffset); |
- |
- control = graph()->NewNode(common()->Merge(2), if_true, if_false); |
- effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control); |
+ switch (mode) { |
+ case CheckTaggedInputMode::kNumber: { |
+ control = effect = graph()->NewNode( |
+ common()->DeoptimizeUnless(DeoptimizeReason::kNotAHeapNumber), |
+ check_number, frame_state, effect, control); |
+ break; |
+ } |
+ case CheckTaggedInputMode::kNumberOrOddball: { |
+ Node* branch = graph()->NewNode(common()->Branch(BranchHint::kTrue), |
+ check_number, control); |
+ |
+ Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
+ Node* etrue = effect; |
+ |
+ Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
+ // For oddballs also contain the numeric value, let us just check that |
+ // we have an oddball here. |
+ Node* efalse = effect; |
+ Node* instance_type = efalse = graph()->NewNode( |
+ simplified()->LoadField(AccessBuilder::ForMapInstanceType()), |
+ value_map, efalse, if_false); |
+ Node* check_oddball = |
+ graph()->NewNode(machine()->Word32Equal(), instance_type, |
+ jsgraph()->Int32Constant(ODDBALL_TYPE)); |
+ if_false = efalse = graph()->NewNode( |
+ common()->DeoptimizeUnless( |
+ DeoptimizeReason::kNotAHeapNumberUndefinedBoolean), |
+ check_oddball, frame_state, efalse, if_false); |
+ STATIC_ASSERT(HeapNumber::kValueOffset == Oddball::kToNumberRawOffset); |
+ |
+ control = graph()->NewNode(common()->Merge(2), if_true, if_false); |
+ effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control); |
+ break; |
+ } |
+ } |
- Node* result = effect = graph()->NewNode( |
+ value = effect = graph()->NewNode( |
simplified()->LoadField(AccessBuilder::ForHeapNumberValue()), value, |
effect, control); |
- return ValueEffectControl(result, effect, control); |
+ return ValueEffectControl(value, effect, control); |
} |
EffectControlLinearizer::ValueEffectControl |
@@ -1709,6 +1722,7 @@ EffectControlLinearizer::LowerCheckedTaggedToFloat64(Node* node, |
Node* frame_state, |
Node* effect, |
Node* control) { |
+ CheckTaggedInputMode mode = CheckTaggedInputModeOf(node->op()); |
Node* value = node->InputAt(0); |
Node* check = ObjectIsSmi(value); |
@@ -1724,7 +1738,7 @@ EffectControlLinearizer::LowerCheckedTaggedToFloat64(Node* node, |
// Otherwise, check heap numberness and load the number. |
Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
ValueEffectControl number_state = BuildCheckedHeapNumberOrOddballToFloat64( |
- value, frame_state, effect, if_false); |
+ mode, value, frame_state, effect, if_false); |
Node* merge = |
graph()->NewNode(common()->Merge(2), if_true, number_state.control); |
@@ -1789,7 +1803,8 @@ EffectControlLinearizer::LowerCheckedTruncateTaggedToWord32(Node* node, |
// to int32. |
Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
ValueEffectControl false_state = BuildCheckedHeapNumberOrOddballToFloat64( |
- value, frame_state, effect, if_false); |
+ CheckTaggedInputMode::kNumberOrOddball, value, frame_state, effect, |
+ if_false); |
false_state.value = |
graph()->NewNode(machine()->TruncateFloat64ToWord32(), false_state.value); |