Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/access-builder.h" | 5 #include "src/compiler/access-builder.h" |
| 6 #include "src/compiler/graph-inl.h" | 6 #include "src/compiler/graph-inl.h" |
| 7 #include "src/compiler/js-typed-lowering.h" | 7 #include "src/compiler/js-typed-lowering.h" |
| 8 #include "src/compiler/node-aux-data-inl.h" | 8 #include "src/compiler/node-aux-data-inl.h" |
| 9 #include "src/compiler/node-properties-inl.h" | 9 #include "src/compiler/node-properties-inl.h" |
| 10 #include "src/types.h" | 10 #include "src/types.h" |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 466 // Recursively try to reduce the input first. | 466 // Recursively try to reduce the input first. |
| 467 Reduction result = ReduceJSToBooleanInput(input->InputAt(0)); | 467 Reduction result = ReduceJSToBooleanInput(input->InputAt(0)); |
| 468 if (result.Changed()) { | 468 if (result.Changed()) { |
| 469 RelaxEffects(input); | 469 RelaxEffects(input); |
| 470 return result; | 470 return result; |
| 471 } | 471 } |
| 472 return Changed(input); // JSToBoolean(JSToBoolean(x)) => JSToBoolean(x) | 472 return Changed(input); // JSToBoolean(JSToBoolean(x)) => JSToBoolean(x) |
| 473 } | 473 } |
| 474 Type* input_type = NodeProperties::GetBounds(input).upper; | 474 Type* input_type = NodeProperties::GetBounds(input).upper; |
| 475 if (input_type->Is(Type::Boolean())) { | 475 if (input_type->Is(Type::Boolean())) { |
| 476 return Changed(input); // JSToBoolean(boolean) => x | 476 return Changed(input); // JSToBoolean(boolean) => x |
|
rossberg
2014/09/11 12:17:50
s/x/boolean/
Michael Starzinger
2014/09/11 12:35:59
Done, but with a slightly different notation as pe
| |
| 477 } | 477 } |
| 478 if (input_type->Is(Type::Undefined())) { | 478 if (input_type->Is(Type::Undefined())) { |
| 479 // JSToBoolean(undefined) => #false | 479 // JSToBoolean(undefined) => #false |
| 480 return ReplaceWith(jsgraph()->FalseConstant()); | 480 return ReplaceWith(jsgraph()->FalseConstant()); |
| 481 } | 481 } |
| 482 if (input_type->Is(Type::Null())) { | 482 if (input_type->Is(Type::Null())) { |
| 483 // JSToBoolean(null) => #false | 483 // JSToBoolean(null) => #false |
| 484 return ReplaceWith(jsgraph()->FalseConstant()); | 484 return ReplaceWith(jsgraph()->FalseConstant()); |
| 485 } | 485 } |
| 486 if (input_type->Is(Type::DetectableReceiver())) { | 486 if (input_type->Is(Type::DetectableReceiver())) { |
| 487 // JSToBoolean(detectable) => #true | 487 // JSToBoolean(detectable) => #true |
| 488 return ReplaceWith(jsgraph()->TrueConstant()); | 488 return ReplaceWith(jsgraph()->TrueConstant()); |
| 489 } | 489 } |
| 490 if (input_type->Is(Type::Undetectable())) { | 490 if (input_type->Is(Type::Undetectable())) { |
| 491 // JSToBoolean(undetectable) => #false | 491 // JSToBoolean(undetectable) => #false |
| 492 return ReplaceWith(jsgraph()->FalseConstant()); | 492 return ReplaceWith(jsgraph()->FalseConstant()); |
| 493 } | 493 } |
| 494 if (input_type->Is(Type::Number())) { | 494 if (input_type->Is(Type::OrderedNumber())) { |
| 495 // JSToBoolean(number) => BooleanNot(NumberEqual(x, #0)) | 495 // JSToBoolean(ordered-number) => BooleanNot(NumberEqual(x, #0)) |
|
rossberg
2014/09/11 12:17:50
s/x/ordered-number/
Michael Starzinger
2014/09/11 12:35:59
Done.
| |
| 496 Node* cmp = graph()->NewNode(simplified()->NumberEqual(), input, | 496 Node* cmp = graph()->NewNode(simplified()->NumberEqual(), input, |
| 497 jsgraph()->ZeroConstant()); | 497 jsgraph()->ZeroConstant()); |
| 498 Node* inv = graph()->NewNode(simplified()->BooleanNot(), cmp); | 498 Node* inv = graph()->NewNode(simplified()->BooleanNot(), cmp); |
| 499 return ReplaceWith(inv); | 499 return ReplaceWith(inv); |
| 500 } | 500 } |
| 501 // TODO(turbofan): js-typed-lowering of ToBoolean(string) | 501 // TODO(turbofan): js-typed-lowering of ToBoolean(string) |
| 502 return NoChange(); | 502 return NoChange(); |
| 503 } | 503 } |
| 504 | 504 |
| 505 | 505 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 622 case IrOpcode::kJSMultiply: | 622 case IrOpcode::kJSMultiply: |
| 623 return ReduceNumberBinop(node, simplified()->NumberMultiply()); | 623 return ReduceNumberBinop(node, simplified()->NumberMultiply()); |
| 624 case IrOpcode::kJSDivide: | 624 case IrOpcode::kJSDivide: |
| 625 return ReduceNumberBinop(node, simplified()->NumberDivide()); | 625 return ReduceNumberBinop(node, simplified()->NumberDivide()); |
| 626 case IrOpcode::kJSModulus: | 626 case IrOpcode::kJSModulus: |
| 627 return ReduceNumberBinop(node, simplified()->NumberModulus()); | 627 return ReduceNumberBinop(node, simplified()->NumberModulus()); |
| 628 case IrOpcode::kJSUnaryNot: { | 628 case IrOpcode::kJSUnaryNot: { |
| 629 Reduction result = ReduceJSToBooleanInput(node->InputAt(0)); | 629 Reduction result = ReduceJSToBooleanInput(node->InputAt(0)); |
| 630 Node* value; | 630 Node* value; |
| 631 if (result.Changed()) { | 631 if (result.Changed()) { |
| 632 // JSUnaryNot(x) => BooleanNot(x) | 632 // JSUnaryNot(boolean) => BooleanNot(x) |
|
rossberg
2014/09/11 12:17:50
s/x/boolean/
Michael Starzinger
2014/09/11 12:35:59
Done.
| |
| 633 value = | 633 value = |
| 634 graph()->NewNode(simplified()->BooleanNot(), result.replacement()); | 634 graph()->NewNode(simplified()->BooleanNot(), result.replacement()); |
| 635 NodeProperties::ReplaceWithValue(node, value); | 635 NodeProperties::ReplaceWithValue(node, value); |
| 636 return Changed(value); | 636 return Changed(value); |
| 637 } else { | 637 } else { |
| 638 // JSUnaryNot(x) => BooleanNot(JSToBoolean(x)) | 638 // JSUnaryNot(x) => BooleanNot(JSToBoolean(x)) |
| 639 value = graph()->NewNode(simplified()->BooleanNot(), node); | 639 value = graph()->NewNode(simplified()->BooleanNot(), node); |
| 640 node->set_op(javascript()->ToBoolean()); | 640 node->set_op(javascript()->ToBoolean()); |
| 641 NodeProperties::ReplaceWithValue(node, value, node); | 641 NodeProperties::ReplaceWithValue(node, value, node); |
| 642 // Note: ReplaceUses() smashes all uses, so smash it back here. | 642 // Note: ReplaceUses() smashes all uses, so smash it back here. |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 659 return ReduceJSStoreProperty(node); | 659 return ReduceJSStoreProperty(node); |
| 660 default: | 660 default: |
| 661 break; | 661 break; |
| 662 } | 662 } |
| 663 return NoChange(); | 663 return NoChange(); |
| 664 } | 664 } |
| 665 | 665 |
| 666 } // namespace compiler | 666 } // namespace compiler |
| 667 } // namespace internal | 667 } // namespace internal |
| 668 } // namespace v8 | 668 } // namespace v8 |
| OLD | NEW |