| Index: src/compiler/js-typed-lowering.cc
|
| diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
|
| index 9de549362166853612c6b458293d0b2f122f3236..a04a79b80b9070df14d4dec8625eb3ada6e73540 100644
|
| --- a/src/compiler/js-typed-lowering.cc
|
| +++ b/src/compiler/js-typed-lowering.cc
|
| @@ -528,40 +528,43 @@ Reduction JSTypedLowering::ReduceJSToNumber(Node* node) {
|
| return reduction;
|
| }
|
| Type* const input_type = NodeProperties::GetBounds(input).upper;
|
| - if (input->opcode() == IrOpcode::kPhi && input_type->Is(Type::Primitive())) {
|
| - Node* const context = node->InputAt(1);
|
| - // JSToNumber(phi(x1,...,xn,control):primitive)
|
| - // => phi(JSToNumber(x1),...,JSToNumber(xn),control):number
|
| + if (input_type->Is(Type::PlainPrimitive())) {
|
| + // Converting a plain primitive to a number has no observable side effects.
|
| RelaxEffects(node);
|
| - int const input_count = input->InputCount() - 1;
|
| - Node* const control = input->InputAt(input_count);
|
| - DCHECK_LE(0, input_count);
|
| - DCHECK(NodeProperties::IsControl(control));
|
| - DCHECK(NodeProperties::GetBounds(node).upper->Is(Type::Number()));
|
| - DCHECK(!NodeProperties::GetBounds(input).upper->Is(Type::Number()));
|
| - node->set_op(common()->Phi(kMachAnyTagged, input_count));
|
| - for (int i = 0; i < input_count; ++i) {
|
| - Node* value = input->InputAt(i);
|
| - // Recursively try to reduce the value first.
|
| - Reduction reduction = ReduceJSToNumberInput(value);
|
| - if (reduction.Changed()) {
|
| - value = reduction.replacement();
|
| - } else {
|
| - value = graph()->NewNode(javascript()->ToNumber(), value, context,
|
| - graph()->start(), graph()->start());
|
| + // JSToNumber(phi(x1,...,xn,control):plain-primitive,context)
|
| + // => phi(JSToNumber(x1,no-context),...,JSToNumber(xn,no-context),control)
|
| + if (input->opcode() == IrOpcode::kPhi) {
|
| + int const input_count = input->InputCount() - 1;
|
| + Node* const control = input->InputAt(input_count);
|
| + DCHECK_LE(0, input_count);
|
| + DCHECK(NodeProperties::IsControl(control));
|
| + DCHECK(NodeProperties::GetBounds(node).upper->Is(Type::Number()));
|
| + DCHECK(!NodeProperties::GetBounds(input).upper->Is(Type::Number()));
|
| + node->set_op(common()->Phi(kMachAnyTagged, input_count));
|
| + for (int i = 0; i < input_count; ++i) {
|
| + Node* value = input->InputAt(i);
|
| + // Recursively try to reduce the value first.
|
| + Reduction reduction = ReduceJSToNumberInput(value);
|
| + if (reduction.Changed()) {
|
| + value = reduction.replacement();
|
| + } else {
|
| + value = graph()->NewNode(javascript()->ToNumber(), value,
|
| + jsgraph()->NoContextConstant(),
|
| + graph()->start(), graph()->start());
|
| + }
|
| + if (i < node->InputCount()) {
|
| + node->ReplaceInput(i, value);
|
| + } else {
|
| + node->AppendInput(graph()->zone(), value);
|
| + }
|
| }
|
| - if (i < node->InputCount()) {
|
| - node->ReplaceInput(i, value);
|
| + if (input_count < node->InputCount()) {
|
| + node->ReplaceInput(input_count, control);
|
| } else {
|
| - node->AppendInput(graph()->zone(), value);
|
| + node->AppendInput(graph()->zone(), control);
|
| }
|
| + node->TrimInputCount(input_count + 1);
|
| }
|
| - if (input_count < node->InputCount()) {
|
| - node->ReplaceInput(input_count, control);
|
| - } else {
|
| - node->AppendInput(graph()->zone(), control);
|
| - }
|
| - node->TrimInputCount(input_count + 1);
|
| return Changed(node);
|
| }
|
| return NoChange();
|
|
|