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/js-graph.h" | 5 #include "src/compiler/js-graph.h" |
6 #include "src/compiler/js-typed-lowering.h" | 6 #include "src/compiler/js-typed-lowering.h" |
7 #include "src/compiler/machine-operator.h" | 7 #include "src/compiler/machine-operator.h" |
8 #include "src/compiler/node-properties.h" | 8 #include "src/compiler/node-properties.h" |
9 #include "src/compiler/opcodes.h" | 9 #include "src/compiler/opcodes.h" |
10 #include "src/compiler/operator-properties.h" | 10 #include "src/compiler/operator-properties.h" |
(...skipping 489 matching lines...) Loading... |
500 Type::String()}; | 500 Type::String()}; |
501 | 501 |
502 for (size_t i = 0; i < arraysize(others); i++) { | 502 for (size_t i = 0; i < arraysize(others); i++) { |
503 Type* t = Type::Union(Type::Number(), others[i], R.main_zone()); | 503 Type* t = Type::Union(Type::Number(), others[i], R.main_zone()); |
504 Node* r = R.ReduceUnop(R.javascript.ToNumber(), t); | 504 Node* r = R.ReduceUnop(R.javascript.ToNumber(), t); |
505 CHECK_EQ(IrOpcode::kJSToNumber, r->opcode()); | 505 CHECK_EQ(IrOpcode::kJSToNumber, r->opcode()); |
506 } | 506 } |
507 } | 507 } |
508 | 508 |
509 | 509 |
510 TEST(JSToBoolean) { | |
511 JSTypedLoweringTester R; | |
512 const Operator* op = R.javascript.ToBoolean(); | |
513 | |
514 { // ToBoolean(undefined) | |
515 Node* r = R.ReduceUnop(op, Type::Undefined()); | |
516 R.CheckFalse(r); | |
517 } | |
518 | |
519 { // ToBoolean(null) | |
520 Node* r = R.ReduceUnop(op, Type::Null()); | |
521 R.CheckFalse(r); | |
522 } | |
523 | |
524 { // ToBoolean(boolean) | |
525 Node* r = R.ReduceUnop(op, Type::Boolean()); | |
526 CHECK_EQ(IrOpcode::kParameter, r->opcode()); | |
527 } | |
528 | |
529 { // ToBoolean(object) | |
530 Node* r = R.ReduceUnop(op, Type::DetectableObject()); | |
531 R.CheckTrue(r); | |
532 } | |
533 | |
534 { // ToBoolean(undetectable) | |
535 Node* r = R.ReduceUnop(op, Type::Undetectable()); | |
536 R.CheckFalse(r); | |
537 } | |
538 | |
539 { // ToBoolean(object) | |
540 Node* r = R.ReduceUnop(op, Type::Object()); | |
541 CHECK_EQ(IrOpcode::kAnyToBoolean, r->opcode()); | |
542 } | |
543 } | |
544 | |
545 | |
546 TEST(JSToString1) { | 510 TEST(JSToString1) { |
547 JSTypedLoweringTester R; | 511 JSTypedLoweringTester R; |
548 | 512 |
549 for (size_t i = 0; i < arraysize(kStringTypes); i++) { | 513 for (size_t i = 0; i < arraysize(kStringTypes); i++) { |
550 Node* r = R.ReduceUnop(R.javascript.ToString(), kStringTypes[i]); | 514 Node* r = R.ReduceUnop(R.javascript.ToString(), kStringTypes[i]); |
551 CHECK_EQ(IrOpcode::kParameter, r->opcode()); | 515 CHECK_EQ(IrOpcode::kParameter, r->opcode()); |
552 } | 516 } |
553 | 517 |
554 const Operator* op = R.javascript.ToString(); | 518 const Operator* op = R.javascript.ToString(); |
555 | 519 |
(...skipping 161 matching lines...) Loading... |
717 } | 681 } |
718 } else { | 682 } else { |
719 CHECK_EQ(cmp, r); // No reduction of mixed types. | 683 CHECK_EQ(cmp, r); // No reduction of mixed types. |
720 } | 684 } |
721 } | 685 } |
722 } | 686 } |
723 } | 687 } |
724 } | 688 } |
725 | 689 |
726 | 690 |
727 TEST(UnaryNot) { | |
728 JSTypedLoweringTester R; | |
729 const Operator* opnot = R.javascript.UnaryNot(); | |
730 | |
731 for (size_t i = 0; i < arraysize(kJSTypes); i++) { | |
732 Node* orig = R.Unop(opnot, R.Parameter(kJSTypes[i])); | |
733 Node* r = R.reduce(orig); | |
734 | |
735 if (r == orig && orig->opcode() == IrOpcode::kJSToBoolean) { | |
736 // The original node was turned into a ToBoolean. | |
737 CHECK_EQ(IrOpcode::kJSToBoolean, r->opcode()); | |
738 } else if (r->opcode() != IrOpcode::kHeapConstant) { | |
739 CHECK_EQ(IrOpcode::kBooleanNot, r->opcode()); | |
740 } | |
741 } | |
742 } | |
743 | |
744 | |
745 TEST(RemoveToNumberEffects) { | 691 TEST(RemoveToNumberEffects) { |
746 FLAG_turbo_deoptimization = true; | 692 FLAG_turbo_deoptimization = true; |
747 | 693 |
748 JSTypedLoweringTester R; | 694 JSTypedLoweringTester R; |
749 | 695 |
750 Node* effect_use = NULL; | 696 Node* effect_use = NULL; |
751 for (int i = 0; i < 10; i++) { | 697 for (int i = 0; i < 10; i++) { |
752 Node* p0 = R.Parameter(Type::Number()); | 698 Node* p0 = R.Parameter(Type::Number()); |
753 Node* ton = R.Unop(R.javascript.ToNumber(), p0); | 699 Node* ton = R.Unop(R.javascript.ToNumber(), p0); |
754 Node* frame_state = R.EmptyFrameState(R.context()); | 700 Node* frame_state = R.EmptyFrameState(R.context()); |
(...skipping 536 matching lines...) Loading... |
1291 CHECK_EQ(p1, r->InputAt(0)); | 1237 CHECK_EQ(p1, r->InputAt(0)); |
1292 CHECK_EQ(p0, r->InputAt(1)); | 1238 CHECK_EQ(p0, r->InputAt(1)); |
1293 } else { | 1239 } else { |
1294 CHECK_EQ(p0, r->InputAt(0)); | 1240 CHECK_EQ(p0, r->InputAt(0)); |
1295 CHECK_EQ(p1, r->InputAt(1)); | 1241 CHECK_EQ(p1, r->InputAt(1)); |
1296 } | 1242 } |
1297 } | 1243 } |
1298 } | 1244 } |
1299 } | 1245 } |
1300 } | 1246 } |
OLD | NEW |