Index: src/compiler/js-typed-lowering.cc |
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc |
index 05363f288103f747fd0f4f171c608ed9a3e20d04..244cfe2dbaadd1f8a44ab5bcf611877ab2d042bb 100644 |
--- a/src/compiler/js-typed-lowering.cc |
+++ b/src/compiler/js-typed-lowering.cc |
@@ -526,39 +526,64 @@ Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node, bool invert) { |
Reduction JSTypedLowering::ReduceJSUnaryNot(Node* node) { |
- Node* input = node->InputAt(0); |
- Type* input_type = NodeProperties::GetBounds(input).upper; |
+ Node* const input = node->InputAt(0); |
+ Type* const input_type = NodeProperties::GetBounds(input).upper; |
if (input_type->Is(Type::Boolean())) { |
- // JSUnaryNot(x:boolean,context) => BooleanNot(x) |
+ // JSUnaryNot(x:boolean) => BooleanNot(x) |
node->set_op(simplified()->BooleanNot()); |
node->TrimInputCount(1); |
return Changed(node); |
} else if (input_type->Is(Type::OrderedNumber())) { |
- // JSUnaryNot(x:number,context) => NumberEqual(x,#0) |
+ // JSUnaryNot(x:number) => NumberEqual(x,#0) |
node->set_op(simplified()->NumberEqual()); |
node->ReplaceInput(1, jsgraph()->ZeroConstant()); |
- DCHECK_EQ(2, node->InputCount()); |
+ node->TrimInputCount(2); |
+ return Changed(node); |
+ } else if (input_type->Is(Type::String())) { |
+ // JSUnaryNot(x:string) => NumberEqual(x.length,#0) |
+ FieldAccess const access = AccessBuilder::ForStringLength(); |
+ // It is safe for the load to be effect-free (i.e. not linked into effect |
+ // chain) because we assume String::length to be immutable. |
+ Node* length = graph()->NewNode(simplified()->LoadField(access), input, |
+ graph()->start(), graph()->start()); |
+ node->set_op(simplified()->NumberEqual()); |
+ node->ReplaceInput(0, length); |
+ node->ReplaceInput(1, jsgraph()->ZeroConstant()); |
+ node->TrimInputCount(2); |
+ NodeProperties::ReplaceWithValue(node, node, length); |
return Changed(node); |
} |
- // JSUnaryNot(x,context) => BooleanNot(AnyToBoolean(x)) |
- node->set_op(simplified()->BooleanNot()); |
- node->ReplaceInput(0, graph()->NewNode(simplified()->AnyToBoolean(), input)); |
- node->TrimInputCount(1); |
- return Changed(node); |
+ return NoChange(); |
} |
Reduction JSTypedLowering::ReduceJSToBoolean(Node* node) { |
- Node* input = node->InputAt(0); |
- Type* input_type = NodeProperties::GetBounds(input).upper; |
+ Node* const input = node->InputAt(0); |
+ Type* const input_type = NodeProperties::GetBounds(input).upper; |
if (input_type->Is(Type::Boolean())) { |
- // JSToBoolean(x:boolean,context) => x |
+ // JSToBoolean(x:boolean) => x |
return Replace(input); |
+ } else if (input_type->Is(Type::OrderedNumber())) { |
+ // JSToBoolean(x:ordered-number) => BooleanNot(NumberEqual(x,#0)) |
+ node->set_op(simplified()->BooleanNot()); |
+ node->ReplaceInput(0, graph()->NewNode(simplified()->NumberEqual(), input, |
+ jsgraph()->ZeroConstant())); |
+ node->TrimInputCount(1); |
+ return Changed(node); |
+ } else if (input_type->Is(Type::String())) { |
+ // JSToBoolean(x:string) => NumberLessThan(#0,x.length) |
+ FieldAccess const access = AccessBuilder::ForStringLength(); |
+ // It is safe for the load to be effect-free (i.e. not linked into effect |
+ // chain) because we assume String::length to be immutable. |
+ Node* length = graph()->NewNode(simplified()->LoadField(access), input, |
+ graph()->start(), graph()->start()); |
+ node->set_op(simplified()->NumberLessThan()); |
+ node->ReplaceInput(0, jsgraph()->ZeroConstant()); |
+ node->ReplaceInput(1, length); |
+ node->TrimInputCount(2); |
+ return Changed(node); |
} |
- // JSToBoolean(x,context) => AnyToBoolean(x) |
- node->set_op(simplified()->AnyToBoolean()); |
- node->TrimInputCount(1); |
- return Changed(node); |
+ return NoChange(); |
} |