| Index: src/compiler/js-typed-lowering.cc
|
| diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
|
| index 668d4c0eee8909b12a18c9960b0fe6c442923894..67f4d4ed46004bba260bc5636d800d6598af122f 100644
|
| --- a/src/compiler/js-typed-lowering.cc
|
| +++ b/src/compiler/js-typed-lowering.cc
|
| @@ -436,6 +436,8 @@ JSTypedLowering::JSTypedLowering(Editor* editor,
|
| dependencies_(dependencies),
|
| flags_(flags),
|
| jsgraph_(jsgraph),
|
| + true_type_(Type::Constant(factory()->true_value(), graph()->zone())),
|
| + false_type_(Type::Constant(factory()->false_value(), graph()->zone())),
|
| the_hole_type_(
|
| Type::Constant(factory()->the_hole_value(), graph()->zone())),
|
| type_cache_(TypeCache::Get()) {
|
| @@ -708,40 +710,6 @@ Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node, bool invert) {
|
| }
|
|
|
|
|
| -Reduction JSTypedLowering::ReduceJSUnaryNot(Node* node) {
|
| - Node* const input = node->InputAt(0);
|
| - Type* const input_type = NodeProperties::GetType(input);
|
| - if (input_type->Is(Type::Boolean())) {
|
| - // JSUnaryNot(x:boolean) => BooleanNot(x)
|
| - RelaxEffectsAndControls(node);
|
| - node->TrimInputCount(1);
|
| - NodeProperties::ChangeOp(node, simplified()->BooleanNot());
|
| - return Changed(node);
|
| - } else if (input_type->Is(Type::OrderedNumber())) {
|
| - // JSUnaryNot(x:number) => NumberEqual(x,#0)
|
| - RelaxEffectsAndControls(node);
|
| - node->ReplaceInput(1, jsgraph()->ZeroConstant());
|
| - node->TrimInputCount(2);
|
| - NodeProperties::ChangeOp(node, simplified()->NumberEqual());
|
| - 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());
|
| - ReplaceWithValue(node, node, length);
|
| - node->ReplaceInput(0, length);
|
| - node->ReplaceInput(1, jsgraph()->ZeroConstant());
|
| - node->TrimInputCount(2);
|
| - NodeProperties::ChangeOp(node, simplified()->NumberEqual());
|
| - return Changed(node);
|
| - }
|
| - return NoChange();
|
| -}
|
| -
|
| -
|
| Reduction JSTypedLowering::ReduceJSToBoolean(Node* node) {
|
| Node* const input = node->InputAt(0);
|
| Type* const input_type = NodeProperties::GetType(input);
|
| @@ -2332,6 +2300,36 @@ Reduction JSTypedLowering::ReduceJSForInStep(Node* node) {
|
| }
|
|
|
|
|
| +Reduction JSTypedLowering::ReduceSelect(Node* node) {
|
| + DCHECK_EQ(IrOpcode::kSelect, node->opcode());
|
| + Node* const condition = NodeProperties::GetValueInput(node, 0);
|
| + Type* const condition_type = NodeProperties::GetType(condition);
|
| + Node* const vtrue = NodeProperties::GetValueInput(node, 1);
|
| + Type* const vtrue_type = NodeProperties::GetType(vtrue);
|
| + Node* const vfalse = NodeProperties::GetValueInput(node, 2);
|
| + Type* const vfalse_type = NodeProperties::GetType(vfalse);
|
| + if (condition_type->Is(true_type_)) {
|
| + // Select(condition:true, vtrue, vfalse) => vtrue
|
| + return Replace(vtrue);
|
| + }
|
| + if (condition_type->Is(false_type_)) {
|
| + // Select(condition:false, vtrue, vfalse) => vfalse
|
| + return Replace(vfalse);
|
| + }
|
| + if (vtrue_type->Is(true_type_) && vfalse_type->Is(false_type_)) {
|
| + // Select(condition, vtrue:true, vfalse:false) => condition
|
| + return Replace(condition);
|
| + }
|
| + if (vtrue_type->Is(false_type_) && vfalse_type->Is(true_type_)) {
|
| + // Select(condition, vtrue:false, vfalse:true) => BooleanNot(condition)
|
| + node->TrimInputCount(1);
|
| + NodeProperties::ChangeOp(node, simplified()->BooleanNot());
|
| + return Changed(node);
|
| + }
|
| + return NoChange();
|
| +}
|
| +
|
| +
|
| Reduction JSTypedLowering::Reduce(Node* node) {
|
| // Check if the output type is a singleton. In that case we already know the
|
| // result value and can simply replace the node if it's eliminable.
|
| @@ -2401,8 +2399,6 @@ Reduction JSTypedLowering::Reduce(Node* node) {
|
| return ReduceNumberBinop(node, simplified()->NumberDivide());
|
| case IrOpcode::kJSModulus:
|
| return ReduceJSModulus(node);
|
| - case IrOpcode::kJSUnaryNot:
|
| - return ReduceJSUnaryNot(node);
|
| case IrOpcode::kJSToBoolean:
|
| return ReduceJSToBoolean(node);
|
| case IrOpcode::kJSToNumber:
|
| @@ -2453,6 +2449,8 @@ Reduction JSTypedLowering::Reduce(Node* node) {
|
| return ReduceJSForInPrepare(node);
|
| case IrOpcode::kJSForInStep:
|
| return ReduceJSForInStep(node);
|
| + case IrOpcode::kSelect:
|
| + return ReduceSelect(node);
|
| default:
|
| break;
|
| }
|
|
|