Index: src/compiler/js-typed-lowering.cc |
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc |
index 761837576b3b40401063da876012e38ecf5eb18c..56ffc5f715c27ed97c002bf5f06558beb405ed7a 100644 |
--- a/src/compiler/js-typed-lowering.cc |
+++ b/src/compiler/js-typed-lowering.cc |
@@ -198,8 +198,16 @@ class JSBinopReduction FINAL { |
if (NodeProperties::GetBounds(node).upper->Is(Type::PlainPrimitive())) { |
return lowering_->ConvertToNumber(node); |
} |
- Node* n = graph()->NewNode(javascript()->ToNumber(), node, context(), |
- effect(), control()); |
+ // TODO(jarin) This ToNumber conversion can deoptimize, but we do not really |
+ // have a frame state to deoptimize to. Either we provide such a frame state |
+ // or we exclude the values that could lead to deoptimization (e.g., by |
+ // triggering eager deopt if the value is not plain). |
+ Node* const n = FLAG_turbo_deoptimization |
+ ? graph()->NewNode( |
+ javascript()->ToNumber(), node, context(), |
+ jsgraph()->EmptyFrameState(), effect(), control()) |
+ : graph()->NewNode(javascript()->ToNumber(), node, |
+ context(), effect(), control()); |
update_effect(n); |
return n; |
} |
@@ -624,15 +632,20 @@ Reduction JSTypedLowering::ReduceJSToNumber(Node* node) { |
} |
// Remember this conversion. |
InsertConversion(node); |
- if (node->InputAt(1) != jsgraph()->NoContextConstant() || |
- node->InputAt(2) != graph()->start() || |
- node->InputAt(3) != graph()->start()) { |
+ if (NodeProperties::GetContextInput(node) != |
+ jsgraph()->NoContextConstant() || |
+ NodeProperties::GetEffectInput(node) != graph()->start() || |
+ NodeProperties::GetControlInput(node) != graph()->start()) { |
// JSToNumber(x:plain-primitive,context,effect,control) |
// => JSToNumber(x,no-context,start,start) |
RelaxEffects(node); |
- node->ReplaceInput(1, jsgraph()->NoContextConstant()); |
- node->ReplaceInput(2, graph()->start()); |
- node->ReplaceInput(3, graph()->start()); |
+ NodeProperties::ReplaceContextInput(node, jsgraph()->NoContextConstant()); |
+ NodeProperties::ReplaceControlInput(node, graph()->start()); |
+ NodeProperties::ReplaceEffectInput(node, graph()->start()); |
+ if (OperatorProperties::HasFrameStateInput(node->op())) { |
+ NodeProperties::ReplaceFrameStateInput(node, |
+ jsgraph()->EmptyFrameState()); |
+ } |
return Changed(node); |
} |
} |
@@ -752,8 +765,15 @@ Reduction JSTypedLowering::ReduceJSStoreProperty(Node* node) { |
if (number_reduction.Changed()) { |
value = number_reduction.replacement(); |
} else { |
- value = effect = graph()->NewNode(javascript()->ToNumber(), value, |
- context, effect, control); |
+ if (OperatorProperties::HasFrameStateInput( |
+ javascript()->ToNumber())) { |
+ value = effect = |
+ graph()->NewNode(javascript()->ToNumber(), value, context, |
+ jsgraph()->EmptyFrameState(), effect, control); |
+ } else { |
+ value = effect = graph()->NewNode(javascript()->ToNumber(), value, |
+ context, effect, control); |
+ } |
} |
} |
// For integer-typed arrays, convert to the integer type. |
@@ -785,8 +805,8 @@ Reduction JSTypedLowering::ReduceJSStoreProperty(Node* node) { |
node->ReplaceInput(2, length); |
node->ReplaceInput(3, value); |
node->ReplaceInput(4, effect); |
- DCHECK_EQ(control, node->InputAt(5)); |
- DCHECK_EQ(6, node->InputCount()); |
+ node->ReplaceInput(5, control); |
+ node->TrimInputCount(6); |
return Changed(node); |
} |
} |
@@ -932,9 +952,16 @@ Node* JSTypedLowering::ConvertToNumber(Node* input) { |
// Avoid inserting too many eager ToNumber() operations. |
Reduction const reduction = ReduceJSToNumberInput(input); |
if (reduction.Changed()) return reduction.replacement(); |
- Node* const conversion = graph()->NewNode(javascript()->ToNumber(), input, |
- jsgraph()->NoContextConstant(), |
- graph()->start(), graph()->start()); |
+ // TODO(jarin) Use PlainPrimitiveToNumber once we have it. |
+ Node* const conversion = |
+ FLAG_turbo_deoptimization |
+ ? graph()->NewNode(javascript()->ToNumber(), input, |
+ jsgraph()->NoContextConstant(), |
+ jsgraph()->EmptyFrameState(), graph()->start(), |
+ graph()->start()) |
+ : graph()->NewNode(javascript()->ToNumber(), input, |
+ jsgraph()->NoContextConstant(), graph()->start(), |
+ graph()->start()); |
InsertConversion(conversion); |
return conversion; |
} |