| Index: src/compiler/js-typed-lowering.cc
|
| diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
|
| index b1ba6d21cb611d897122309492fc280d97197273..bb7095efee7456c1ca7f1c4fabb832da4bf1d756 100644
|
| --- a/src/compiler/js-typed-lowering.cc
|
| +++ b/src/compiler/js-typed-lowering.cc
|
| @@ -556,15 +556,25 @@ Reduction JSTypedLowering::ReduceJSToBooleanInput(Node* input) {
|
| Node* inv = graph()->NewNode(simplified()->BooleanNot(), cmp);
|
| return ReplaceWith(inv);
|
| }
|
| - if (input->opcode() == IrOpcode::kPhi && input_type->Is(Type::Primitive())) {
|
| - // JSToBoolean(phi(x1,...,xn):primitive)
|
| + // TODO(turbofan): We need some kinda of PrimitiveToBoolean simplified
|
| + // operator, then we can do the pushing in the SimplifiedOperatorReducer
|
| + // and do not need to protect against stack overflow (because of backedges
|
| + // in phis) below.
|
| + if (input->opcode() == IrOpcode::kPhi &&
|
| + input_type->Is(
|
| + Type::Union(Type::Boolean(), Type::OrderedNumber(), zone()))) {
|
| + // JSToBoolean(phi(x1,...,xn):ordered-number|boolean)
|
| // => phi(JSToBoolean(x1),...,JSToBoolean(xn))
|
| int input_count = input->InputCount() - 1;
|
| Node** inputs = zone()->NewArray<Node*>(input_count + 1);
|
| for (int i = 0; i < input_count; ++i) {
|
| Node* value = input->InputAt(i);
|
| + Type* value_type = NodeProperties::GetBounds(value).upper;
|
| // Recursively try to reduce the value first.
|
| - Reduction result = ReduceJSToBooleanInput(value);
|
| + Reduction result = (value_type->Is(Type::Boolean()) ||
|
| + value_type->Is(Type::OrderedNumber()))
|
| + ? ReduceJSToBooleanInput(value)
|
| + : NoChange();
|
| if (result.Changed()) {
|
| inputs[i] = result.replacement();
|
| } else {
|
|
|