| 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;
|
| }
|
|
|