Index: src/compiler/effect-control-linearizer.cc |
diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc |
index 8701c1923b80c8121efcb371af360bf8eb4fd21d..8f16dbcaf0231286a0f9652ad0f9038668d31866 100644 |
--- a/src/compiler/effect-control-linearizer.cc |
+++ b/src/compiler/effect-control-linearizer.cc |
@@ -1002,8 +1002,9 @@ EffectControlLinearizer::LowerCheckBounds(Node* node, Node* frame_state, |
Node* limit = node->InputAt(1); |
Node* check = graph()->NewNode(machine()->Uint32LessThan(), index, limit); |
- control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, |
- frame_state, effect, control); |
+ control = effect = graph()->NewNode( |
+ common()->DeoptimizeUnless(DeoptimizeReason::kOutOfBounds), check, |
+ frame_state, effect, control); |
return ValueEffectControl(index, effect, control); |
} |
@@ -1028,8 +1029,9 @@ EffectControlLinearizer::LowerCheckNumber(Node* node, Node* frame_state, |
value, efalse0, if_false0); |
Node* check1 = graph()->NewNode(machine()->WordEqual(), value_map, |
jsgraph()->HeapNumberMapConstant()); |
- if_false0 = efalse0 = graph()->NewNode(common()->DeoptimizeUnless(), check1, |
- frame_state, efalse0, if_false0); |
+ if_false0 = efalse0 = graph()->NewNode( |
+ common()->DeoptimizeUnless(DeoptimizeReason::kNotAHeapNumber), check1, |
+ frame_state, efalse0, if_false0); |
} |
control = graph()->NewNode(common()->Merge(2), if_true0, if_false0); |
@@ -1043,8 +1045,9 @@ EffectControlLinearizer::LowerCheckIf(Node* node, Node* frame_state, |
Node* effect, Node* control) { |
Node* value = node->InputAt(0); |
- control = effect = graph()->NewNode(common()->DeoptimizeUnless(), value, |
- frame_state, effect, control); |
+ control = effect = |
+ graph()->NewNode(common()->DeoptimizeUnless(DeoptimizeReason::kNoReason), |
+ value, frame_state, effect, control); |
return ValueEffectControl(value, effect, control); |
} |
@@ -1055,8 +1058,9 @@ EffectControlLinearizer::LowerCheckTaggedPointer(Node* node, Node* frame_state, |
Node* value = node->InputAt(0); |
Node* check = ObjectIsSmi(value); |
- control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, effect, control); |
+ control = effect = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kSmi), check, |
+ frame_state, effect, control); |
return ValueEffectControl(value, effect, control); |
} |
@@ -1067,8 +1071,9 @@ EffectControlLinearizer::LowerCheckTaggedSigned(Node* node, Node* frame_state, |
Node* value = node->InputAt(0); |
Node* check = ObjectIsSmi(value); |
- control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, |
- frame_state, effect, control); |
+ control = effect = |
+ graph()->NewNode(common()->DeoptimizeUnless(DeoptimizeReason::kNotASmi), |
+ check, frame_state, effect, control); |
return ValueEffectControl(value, effect, control); |
} |
@@ -1083,8 +1088,9 @@ EffectControlLinearizer::LowerCheckedInt32Add(Node* node, Node* frame_state, |
graph()->NewNode(machine()->Int32AddWithOverflow(), lhs, rhs, control); |
Node* check = graph()->NewNode(common()->Projection(1), value, control); |
- control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, effect, control); |
+ control = effect = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kOverflow), |
+ check, frame_state, effect, control); |
value = graph()->NewNode(common()->Projection(0), value, control); |
@@ -1101,8 +1107,9 @@ EffectControlLinearizer::LowerCheckedInt32Sub(Node* node, Node* frame_state, |
graph()->NewNode(machine()->Int32SubWithOverflow(), lhs, rhs, control); |
Node* check = graph()->NewNode(common()->Projection(1), value, control); |
- control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, effect, control); |
+ control = effect = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kOverflow), |
+ check, frame_state, effect, control); |
value = graph()->NewNode(common()->Projection(0), value, control); |
@@ -1138,13 +1145,15 @@ EffectControlLinearizer::LowerCheckedInt32Div(Node* node, Node* frame_state, |
{ |
// Check if {rhs} is zero. |
Node* check = graph()->NewNode(machine()->Word32Equal(), rhs, zero); |
- if_false0 = efalse0 = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, efalse0, if_false0); |
+ if_false0 = efalse0 = graph()->NewNode( |
+ common()->DeoptimizeIf(DeoptimizeReason::kDivisionByZero), check, |
+ frame_state, efalse0, if_false0); |
// Check if {lhs} is zero, as that would produce minus zero. |
check = graph()->NewNode(machine()->Word32Equal(), lhs, zero); |
- if_false0 = efalse0 = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, efalse0, if_false0); |
+ if_false0 = efalse0 = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kMinusZero), |
+ check, frame_state, efalse0, if_false0); |
// Check if {lhs} is kMinInt and {rhs} is -1, in which case we'd have |
// to return -kMinInt, which is not representable. |
@@ -1157,8 +1166,9 @@ EffectControlLinearizer::LowerCheckedInt32Div(Node* node, Node* frame_state, |
{ |
// Check if {rhs} is -1. |
Node* check = graph()->NewNode(machine()->Word32Equal(), rhs, minusone); |
- if_true1 = etrue1 = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, etrue1, if_true1); |
+ if_true1 = etrue1 = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kOverflow), |
+ check, frame_state, etrue1, if_true1); |
} |
Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1); |
@@ -1182,8 +1192,9 @@ EffectControlLinearizer::LowerCheckedInt32Div(Node* node, Node* frame_state, |
Node* check = |
graph()->NewNode(machine()->Word32Equal(), lhs, |
graph()->NewNode(machine()->Int32Mul(), rhs, value)); |
- control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, |
- frame_state, effect, control); |
+ control = effect = graph()->NewNode( |
+ common()->DeoptimizeUnless(DeoptimizeReason::kLostPrecision), check, |
+ frame_state, effect, control); |
return ValueEffectControl(value, effect, control); |
} |
@@ -1200,8 +1211,9 @@ EffectControlLinearizer::LowerCheckedInt32Mod(Node* node, Node* frame_state, |
// Ensure that {rhs} is not zero, otherwise we'd have to return NaN. |
Node* check = graph()->NewNode(machine()->Word32Equal(), rhs, zero); |
- control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, effect, control); |
+ control = effect = graph()->NewNode( |
+ common()->DeoptimizeIf(DeoptimizeReason::kDivisionByZero), check, |
+ frame_state, effect, control); |
// Check if {lhs} is positive or zero. |
Node* check0 = graph()->NewNode(machine()->Int32LessThanOrEqual(), zero, lhs); |
@@ -1231,8 +1243,9 @@ EffectControlLinearizer::LowerCheckedInt32Mod(Node* node, Node* frame_state, |
{ |
// Check if {rhs} is -1. |
Node* check = graph()->NewNode(machine()->Word32Equal(), rhs, minusone); |
- if_true1 = etrue1 = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, etrue1, if_true1); |
+ if_true1 = etrue1 = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kMinusZero), |
+ check, frame_state, etrue1, if_true1); |
} |
Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1); |
@@ -1248,8 +1261,9 @@ EffectControlLinearizer::LowerCheckedInt32Mod(Node* node, Node* frame_state, |
// Check if the result is zero, because in that case we'd have to return |
// -0 here since we always take the signe of the {lhs} which is negative. |
Node* check = graph()->NewNode(machine()->Word32Equal(), vfalse0, zero); |
- if_false0 = efalse0 = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, efalse0, if_false0); |
+ if_false0 = efalse0 = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kMinusZero), |
+ check, frame_state, efalse0, if_false0); |
} |
control = graph()->NewNode(common()->Merge(2), if_true0, if_false0); |
@@ -1271,8 +1285,9 @@ EffectControlLinearizer::LowerCheckedUint32Div(Node* node, Node* frame_state, |
// Ensure that {rhs} is not zero, otherwise we'd have to return NaN. |
Node* check = graph()->NewNode(machine()->Word32Equal(), rhs, zero); |
- control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, effect, control); |
+ control = effect = graph()->NewNode( |
+ common()->DeoptimizeIf(DeoptimizeReason::kDivisionByZero), check, |
+ frame_state, effect, control); |
// Perform the actual unsigned integer division. |
Node* value = graph()->NewNode(machine()->Uint32Div(), lhs, rhs, control); |
@@ -1280,8 +1295,9 @@ EffectControlLinearizer::LowerCheckedUint32Div(Node* node, Node* frame_state, |
// Check if the remainder is non-zero. |
check = graph()->NewNode(machine()->Word32Equal(), lhs, |
graph()->NewNode(machine()->Int32Mul(), rhs, value)); |
- control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check, |
- frame_state, effect, control); |
+ control = effect = graph()->NewNode( |
+ common()->DeoptimizeUnless(DeoptimizeReason::kLostPrecision), check, |
+ frame_state, effect, control); |
return ValueEffectControl(value, effect, control); |
} |
@@ -1296,8 +1312,9 @@ EffectControlLinearizer::LowerCheckedUint32Mod(Node* node, Node* frame_state, |
// Ensure that {rhs} is not zero, otherwise we'd have to return NaN. |
Node* check = graph()->NewNode(machine()->Word32Equal(), rhs, zero); |
- control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, effect, control); |
+ control = effect = graph()->NewNode( |
+ common()->DeoptimizeIf(DeoptimizeReason::kDivisionByZero), check, |
+ frame_state, effect, control); |
// Perform the actual unsigned integer modulus. |
Node* value = graph()->NewNode(machine()->Uint32Mod(), lhs, rhs, control); |
@@ -1316,8 +1333,9 @@ EffectControlLinearizer::LowerCheckedInt32Mul(Node* node, Node* frame_state, |
graph()->NewNode(machine()->Int32MulWithOverflow(), lhs, rhs, control); |
Node* check = graph()->NewNode(common()->Projection(1), projection, control); |
- control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, effect, control); |
+ control = effect = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kOverflow), |
+ check, frame_state, effect, control); |
Node* value = graph()->NewNode(common()->Projection(0), projection, control); |
@@ -1332,8 +1350,9 @@ EffectControlLinearizer::LowerCheckedInt32Mul(Node* node, Node* frame_state, |
Node* or_inputs = graph()->NewNode(machine()->Word32Or(), lhs, rhs); |
Node* check_or = |
graph()->NewNode(machine()->Int32LessThan(), or_inputs, zero); |
- if_zero = e_if_zero = graph()->NewNode(common()->DeoptimizeIf(), check_or, |
- frame_state, e_if_zero, if_zero); |
+ if_zero = e_if_zero = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kMinusZero), |
+ check_or, frame_state, e_if_zero, if_zero); |
} |
Node* if_not_zero = graph()->NewNode(common()->IfFalse(), branch_zero); |
@@ -1355,8 +1374,9 @@ EffectControlLinearizer::LowerCheckedUint32ToInt32(Node* node, |
Node* max_int = jsgraph()->Int32Constant(std::numeric_limits<int32_t>::max()); |
Node* is_safe = |
graph()->NewNode(machine()->Uint32LessThanOrEqual(), value, max_int); |
- control = effect = graph()->NewNode(common()->DeoptimizeUnless(), is_safe, |
- frame_state, effect, control); |
+ control = effect = graph()->NewNode( |
+ common()->DeoptimizeUnless(DeoptimizeReason::kLostPrecision), is_safe, |
+ frame_state, effect, control); |
return ValueEffectControl(value, effect, control); |
} |
@@ -1370,8 +1390,9 @@ EffectControlLinearizer::BuildCheckedFloat64ToInt32(Node* value, |
Node* check_same = graph()->NewNode( |
machine()->Float64Equal(), value, |
graph()->NewNode(machine()->ChangeInt32ToFloat64(), value32)); |
- control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check_same, |
- frame_state, effect, control); |
+ control = effect = graph()->NewNode( |
+ common()->DeoptimizeUnless(DeoptimizeReason::kLostPrecisionOrNaN), |
+ check_same, frame_state, effect, control); |
// Check if {value} is -0. |
Node* check_zero = graph()->NewNode(machine()->Word32Equal(), value32, |
@@ -1388,8 +1409,9 @@ EffectControlLinearizer::BuildCheckedFloat64ToInt32(Node* value, |
graph()->NewNode(machine()->Float64ExtractHighWord32(), value), |
jsgraph()->Int32Constant(0)); |
- Node* deopt_minus_zero = graph()->NewNode( |
- common()->DeoptimizeIf(), check_negative, frame_state, effect, if_zero); |
+ Node* deopt_minus_zero = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kMinusZero), |
+ check_negative, frame_state, effect, if_zero); |
Node* merge = |
graph()->NewNode(common()->Merge(2), deopt_minus_zero, if_notzero); |
@@ -1437,8 +1459,9 @@ EffectControlLinearizer::LowerCheckedTaggedToInt32(Node* node, |
value, efalse, if_false); |
Node* check = graph()->NewNode(machine()->WordEqual(), value_map, |
jsgraph()->HeapNumberMapConstant()); |
- if_false = efalse = graph()->NewNode(common()->DeoptimizeUnless(), check, |
- frame_state, efalse, if_false); |
+ if_false = efalse = graph()->NewNode( |
+ common()->DeoptimizeUnless(DeoptimizeReason::kNotAHeapNumber), check, |
+ frame_state, efalse, if_false); |
vfalse = efalse = graph()->NewNode( |
simplified()->LoadField(AccessBuilder::ForHeapNumberValue()), value, |
efalse, if_false); |
@@ -1482,8 +1505,9 @@ EffectControlLinearizer::BuildCheckedHeapNumberOrOddballToFloat64( |
graph()->NewNode(machine()->Word32Equal(), instance_type, |
jsgraph()->Int32Constant(ODDBALL_TYPE)); |
if_false = efalse = |
- graph()->NewNode(common()->DeoptimizeUnless(), check_oddball, frame_state, |
- efalse, if_false); |
+ 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); |
@@ -1882,8 +1906,9 @@ EffectControlLinearizer::LowerCheckFloat64Hole(Node* node, Node* frame_state, |
machine()->Word32Equal(), |
graph()->NewNode(machine()->Float64ExtractHighWord32(), value), |
jsgraph()->Int32Constant(kHoleNanUpper32)); |
- control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, effect, control); |
+ control = effect = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kHole), check, |
+ frame_state, effect, control); |
return ValueEffectControl(value, effect, control); |
} |
@@ -1902,8 +1927,9 @@ EffectControlLinearizer::LowerCheckTaggedHole(Node* node, Node* frame_state, |
check, jsgraph()->UndefinedConstant(), value); |
break; |
case CheckTaggedHoleMode::kNeverReturnHole: |
- control = effect = graph()->NewNode(common()->DeoptimizeIf(), check, |
- frame_state, effect, control); |
+ control = effect = |
+ graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kHole), |
+ check, frame_state, effect, control); |
break; |
} |