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/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
6 | 6 |
7 #include "src/assembler.h" | 7 #include "src/assembler.h" |
8 #include "src/base/lazy-instance.h" | 8 #include "src/base/lazy-instance.h" |
9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
10 #include "src/compiler/node.h" | 10 #include "src/compiler/node.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 return OpParameter<DeoptimizeReason>(op); | 43 return OpParameter<DeoptimizeReason>(op); |
44 } | 44 } |
45 | 45 |
46 int ValueInputCountOfReturn(Operator const* const op) { | 46 int ValueInputCountOfReturn(Operator const* const op) { |
47 DCHECK(op->opcode() == IrOpcode::kReturn); | 47 DCHECK(op->opcode() == IrOpcode::kReturn); |
48 // Return nodes have a hidden input at index 0 which we ignore in the value | 48 // Return nodes have a hidden input at index 0 which we ignore in the value |
49 // input count. | 49 // input count. |
50 return op->ValueInputCount() - 1; | 50 return op->ValueInputCount() - 1; |
51 } | 51 } |
52 | 52 |
| 53 size_t hash_value(DeoptimizeKind kind) { return static_cast<size_t>(kind); } |
| 54 |
| 55 std::ostream& operator<<(std::ostream& os, DeoptimizeKind kind) { |
| 56 switch (kind) { |
| 57 case DeoptimizeKind::kEager: |
| 58 return os << "Eager"; |
| 59 case DeoptimizeKind::kSoft: |
| 60 return os << "Soft"; |
| 61 } |
| 62 UNREACHABLE(); |
| 63 return os; |
| 64 } |
| 65 |
53 bool operator==(DeoptimizeParameters lhs, DeoptimizeParameters rhs) { | 66 bool operator==(DeoptimizeParameters lhs, DeoptimizeParameters rhs) { |
54 return lhs.kind() == rhs.kind() && lhs.reason() == rhs.reason(); | 67 return lhs.kind() == rhs.kind() && lhs.reason() == rhs.reason(); |
55 } | 68 } |
56 | 69 |
57 bool operator!=(DeoptimizeParameters lhs, DeoptimizeParameters rhs) { | 70 bool operator!=(DeoptimizeParameters lhs, DeoptimizeParameters rhs) { |
58 return !(lhs == rhs); | 71 return !(lhs == rhs); |
59 } | 72 } |
60 | 73 |
61 size_t hash_value(DeoptimizeParameters p) { | 74 size_t hash_value(DeoptimizeParameters p) { |
62 return base::hash_combine(p.kind(), p.reason()); | 75 return base::hash_combine(p.kind(), p.reason()); |
63 } | 76 } |
64 | 77 |
65 std::ostream& operator<<(std::ostream& os, DeoptimizeParameters p) { | 78 std::ostream& operator<<(std::ostream& os, DeoptimizeParameters p) { |
66 return os << p.kind() << ":" << p.reason(); | 79 return os << p.kind() << ":" << p.reason(); |
67 } | 80 } |
68 | 81 |
69 DeoptimizeParameters const& DeoptimizeParametersOf(Operator const* const op) { | 82 DeoptimizeParameters const& DeoptimizeParametersOf(Operator const* const op) { |
70 DCHECK(op->opcode() == IrOpcode::kDeoptimize || | 83 DCHECK_EQ(IrOpcode::kDeoptimize, op->opcode()); |
71 op->opcode() == IrOpcode::kDeoptimizeIf || | |
72 op->opcode() == IrOpcode::kDeoptimizeUnless); | |
73 return OpParameter<DeoptimizeParameters>(op); | 84 return OpParameter<DeoptimizeParameters>(op); |
74 } | 85 } |
75 | 86 |
76 | 87 |
77 bool operator==(SelectParameters const& lhs, SelectParameters const& rhs) { | 88 bool operator==(SelectParameters const& lhs, SelectParameters const& rhs) { |
78 return lhs.representation() == rhs.representation() && | 89 return lhs.representation() == rhs.representation() && |
79 lhs.hint() == rhs.hint(); | 90 lhs.hint() == rhs.hint(); |
80 } | 91 } |
81 | 92 |
82 | 93 |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 V(8) | 429 V(8) |
419 | 430 |
420 #define CACHED_DEOPTIMIZE_LIST(V) \ | 431 #define CACHED_DEOPTIMIZE_LIST(V) \ |
421 V(Eager, MinusZero) \ | 432 V(Eager, MinusZero) \ |
422 V(Eager, NoReason) \ | 433 V(Eager, NoReason) \ |
423 V(Eager, WrongMap) \ | 434 V(Eager, WrongMap) \ |
424 V(Soft, InsufficientTypeFeedbackForGenericKeyedAccess) \ | 435 V(Soft, InsufficientTypeFeedbackForGenericKeyedAccess) \ |
425 V(Soft, InsufficientTypeFeedbackForGenericNamedAccess) | 436 V(Soft, InsufficientTypeFeedbackForGenericNamedAccess) |
426 | 437 |
427 #define CACHED_DEOPTIMIZE_IF_LIST(V) \ | 438 #define CACHED_DEOPTIMIZE_IF_LIST(V) \ |
428 V(Eager, DivisionByZero) \ | 439 V(DivisionByZero) \ |
429 V(Eager, Hole) \ | 440 V(Hole) \ |
430 V(Eager, MinusZero) \ | 441 V(MinusZero) \ |
431 V(Eager, Overflow) \ | 442 V(Overflow) \ |
432 V(Eager, Smi) | 443 V(Smi) |
433 | 444 |
434 #define CACHED_DEOPTIMIZE_UNLESS_LIST(V) \ | 445 #define CACHED_DEOPTIMIZE_UNLESS_LIST(V) \ |
435 V(Eager, LostPrecision) \ | 446 V(LostPrecision) \ |
436 V(Eager, LostPrecisionOrNaN) \ | 447 V(LostPrecisionOrNaN) \ |
437 V(Eager, NoReason) \ | 448 V(NoReason) \ |
438 V(Eager, NotAHeapNumber) \ | 449 V(NotAHeapNumber) \ |
439 V(Eager, NotANumberOrOddball) \ | 450 V(NotANumberOrOddball) \ |
440 V(Eager, NotASmi) \ | 451 V(NotASmi) \ |
441 V(Eager, OutOfBounds) \ | 452 V(OutOfBounds) \ |
442 V(Eager, WrongInstanceType) \ | 453 V(WrongInstanceType) \ |
443 V(Eager, WrongMap) | 454 V(WrongMap) |
444 | 455 |
445 #define CACHED_TRAP_IF_LIST(V) \ | 456 #define CACHED_TRAP_IF_LIST(V) \ |
446 V(TrapDivUnrepresentable) \ | 457 V(TrapDivUnrepresentable) \ |
447 V(TrapFloatUnrepresentable) | 458 V(TrapFloatUnrepresentable) |
448 | 459 |
449 // The reason for a trap. | 460 // The reason for a trap. |
450 #define CACHED_TRAP_UNLESS_LIST(V) \ | 461 #define CACHED_TRAP_UNLESS_LIST(V) \ |
451 V(TrapUnreachable) \ | 462 V(TrapUnreachable) \ |
452 V(TrapMemOutOfBounds) \ | 463 V(TrapMemOutOfBounds) \ |
453 V(TrapDivByZero) \ | 464 V(TrapDivByZero) \ |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 "Deoptimize", // name | 628 "Deoptimize", // name |
618 1, 1, 1, 0, 0, 1, // counts | 629 1, 1, 1, 0, 0, 1, // counts |
619 DeoptimizeParameters(kKind, kReason)) {} // parameter | 630 DeoptimizeParameters(kKind, kReason)) {} // parameter |
620 }; | 631 }; |
621 #define CACHED_DEOPTIMIZE(Kind, Reason) \ | 632 #define CACHED_DEOPTIMIZE(Kind, Reason) \ |
622 DeoptimizeOperator<DeoptimizeKind::k##Kind, DeoptimizeReason::k##Reason> \ | 633 DeoptimizeOperator<DeoptimizeKind::k##Kind, DeoptimizeReason::k##Reason> \ |
623 kDeoptimize##Kind##Reason##Operator; | 634 kDeoptimize##Kind##Reason##Operator; |
624 CACHED_DEOPTIMIZE_LIST(CACHED_DEOPTIMIZE) | 635 CACHED_DEOPTIMIZE_LIST(CACHED_DEOPTIMIZE) |
625 #undef CACHED_DEOPTIMIZE | 636 #undef CACHED_DEOPTIMIZE |
626 | 637 |
627 template <DeoptimizeKind kKind, DeoptimizeReason kReason> | 638 template <DeoptimizeReason kReason> |
628 struct DeoptimizeIfOperator final : public Operator1<DeoptimizeParameters> { | 639 struct DeoptimizeIfOperator final : public Operator1<DeoptimizeReason> { |
629 DeoptimizeIfOperator() | 640 DeoptimizeIfOperator() |
630 : Operator1<DeoptimizeParameters>( // -- | 641 : Operator1<DeoptimizeReason>( // -- |
631 IrOpcode::kDeoptimizeIf, // opcode | 642 IrOpcode::kDeoptimizeIf, // opcode |
632 Operator::kFoldable | Operator::kNoThrow, // properties | 643 Operator::kFoldable | Operator::kNoThrow, // properties |
633 "DeoptimizeIf", // name | 644 "DeoptimizeIf", // name |
634 2, 1, 1, 0, 1, 1, // counts | 645 2, 1, 1, 0, 1, 1, // counts |
635 DeoptimizeParameters(kKind, kReason)) {} // parameter | 646 kReason) {} // parameter |
636 }; | 647 }; |
637 #define CACHED_DEOPTIMIZE_IF(Kind, Reason) \ | 648 #define CACHED_DEOPTIMIZE_IF(Reason) \ |
638 DeoptimizeIfOperator<DeoptimizeKind::k##Kind, DeoptimizeReason::k##Reason> \ | 649 DeoptimizeIfOperator<DeoptimizeReason::k##Reason> \ |
639 kDeoptimizeIf##Kind##Reason##Operator; | 650 kDeoptimizeIf##Reason##Operator; |
640 CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF) | 651 CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF) |
641 #undef CACHED_DEOPTIMIZE_IF | 652 #undef CACHED_DEOPTIMIZE_IF |
642 | 653 |
643 template <DeoptimizeKind kKind, DeoptimizeReason kReason> | 654 template <DeoptimizeReason kReason> |
644 struct DeoptimizeUnlessOperator final | 655 struct DeoptimizeUnlessOperator final : public Operator1<DeoptimizeReason> { |
645 : public Operator1<DeoptimizeParameters> { | |
646 DeoptimizeUnlessOperator() | 656 DeoptimizeUnlessOperator() |
647 : Operator1<DeoptimizeParameters>( // -- | 657 : Operator1<DeoptimizeReason>( // -- |
648 IrOpcode::kDeoptimizeUnless, // opcode | 658 IrOpcode::kDeoptimizeUnless, // opcode |
649 Operator::kFoldable | Operator::kNoThrow, // properties | 659 Operator::kFoldable | Operator::kNoThrow, // properties |
650 "DeoptimizeUnless", // name | 660 "DeoptimizeUnless", // name |
651 2, 1, 1, 0, 1, 1, // counts | 661 2, 1, 1, 0, 1, 1, // counts |
652 DeoptimizeParameters(kKind, kReason)) {} // parameter | 662 kReason) {} // parameter |
653 }; | 663 }; |
654 #define CACHED_DEOPTIMIZE_UNLESS(Kind, Reason) \ | 664 #define CACHED_DEOPTIMIZE_UNLESS(Reason) \ |
655 DeoptimizeUnlessOperator<DeoptimizeKind::k##Kind, \ | 665 DeoptimizeUnlessOperator<DeoptimizeReason::k##Reason> \ |
656 DeoptimizeReason::k##Reason> \ | 666 kDeoptimizeUnless##Reason##Operator; |
657 kDeoptimizeUnless##Kind##Reason##Operator; | |
658 CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS) | 667 CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS) |
659 #undef CACHED_DEOPTIMIZE_UNLESS | 668 #undef CACHED_DEOPTIMIZE_UNLESS |
660 | 669 |
661 template <int32_t trap_id> | 670 template <int32_t trap_id> |
662 struct TrapIfOperator final : public Operator1<int32_t> { | 671 struct TrapIfOperator final : public Operator1<int32_t> { |
663 TrapIfOperator() | 672 TrapIfOperator() |
664 : Operator1<int32_t>( // -- | 673 : Operator1<int32_t>( // -- |
665 IrOpcode::kTrapIf, // opcode | 674 IrOpcode::kTrapIf, // opcode |
666 Operator::kFoldable | Operator::kNoThrow, // properties | 675 Operator::kFoldable | Operator::kNoThrow, // properties |
667 "TrapIf", // name | 676 "TrapIf", // name |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
843 // Uncached | 852 // Uncached |
844 DeoptimizeParameters parameter(kind, reason); | 853 DeoptimizeParameters parameter(kind, reason); |
845 return new (zone()) Operator1<DeoptimizeParameters>( // -- | 854 return new (zone()) Operator1<DeoptimizeParameters>( // -- |
846 IrOpcode::kDeoptimize, // opcodes | 855 IrOpcode::kDeoptimize, // opcodes |
847 Operator::kFoldable | Operator::kNoThrow, // properties | 856 Operator::kFoldable | Operator::kNoThrow, // properties |
848 "Deoptimize", // name | 857 "Deoptimize", // name |
849 1, 1, 1, 0, 0, 1, // counts | 858 1, 1, 1, 0, 0, 1, // counts |
850 parameter); // parameter | 859 parameter); // parameter |
851 } | 860 } |
852 | 861 |
853 const Operator* CommonOperatorBuilder::DeoptimizeIf(DeoptimizeKind kind, | 862 const Operator* CommonOperatorBuilder::DeoptimizeIf(DeoptimizeReason reason) { |
854 DeoptimizeReason reason) { | 863 switch (reason) { |
855 #define CACHED_DEOPTIMIZE_IF(Kind, Reason) \ | 864 #define CACHED_DEOPTIMIZE_IF(Reason) \ |
856 if (kind == DeoptimizeKind::k##Kind && \ | 865 case DeoptimizeReason::k##Reason: \ |
857 reason == DeoptimizeReason::k##Reason) { \ | 866 return &cache_.kDeoptimizeIf##Reason##Operator; |
858 return &cache_.kDeoptimizeIf##Kind##Reason##Operator; \ | 867 CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF) |
| 868 #undef CACHED_DEOPTIMIZE_IF |
| 869 default: |
| 870 break; |
859 } | 871 } |
860 CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF) | |
861 #undef CACHED_DEOPTIMIZE_IF | |
862 // Uncached | 872 // Uncached |
863 DeoptimizeParameters parameter(kind, reason); | 873 return new (zone()) Operator1<DeoptimizeReason>( // -- |
864 return new (zone()) Operator1<DeoptimizeParameters>( // -- | 874 IrOpcode::kDeoptimizeIf, // opcode |
865 IrOpcode::kDeoptimizeIf, // opcode | 875 Operator::kFoldable | Operator::kNoThrow, // properties |
866 Operator::kFoldable | Operator::kNoThrow, // properties | 876 "DeoptimizeIf", // name |
867 "DeoptimizeIf", // name | 877 2, 1, 1, 0, 1, 1, // counts |
868 2, 1, 1, 0, 1, 1, // counts | 878 reason); // parameter |
869 parameter); // parameter | |
870 } | 879 } |
871 | 880 |
872 const Operator* CommonOperatorBuilder::DeoptimizeUnless( | 881 const Operator* CommonOperatorBuilder::DeoptimizeUnless( |
873 DeoptimizeKind kind, DeoptimizeReason reason) { | 882 DeoptimizeReason reason) { |
874 #define CACHED_DEOPTIMIZE_UNLESS(Kind, Reason) \ | 883 switch (reason) { |
875 if (kind == DeoptimizeKind::k##Kind && \ | 884 #define CACHED_DEOPTIMIZE_UNLESS(Reason) \ |
876 reason == DeoptimizeReason::k##Reason) { \ | 885 case DeoptimizeReason::k##Reason: \ |
877 return &cache_.kDeoptimizeUnless##Kind##Reason##Operator; \ | 886 return &cache_.kDeoptimizeUnless##Reason##Operator; |
| 887 CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS) |
| 888 #undef CACHED_DEOPTIMIZE_UNLESS |
| 889 default: |
| 890 break; |
878 } | 891 } |
879 CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS) | |
880 #undef CACHED_DEOPTIMIZE_UNLESS | |
881 // Uncached | 892 // Uncached |
882 DeoptimizeParameters parameter(kind, reason); | 893 return new (zone()) Operator1<DeoptimizeReason>( // -- |
883 return new (zone()) Operator1<DeoptimizeParameters>( // -- | 894 IrOpcode::kDeoptimizeUnless, // opcode |
884 IrOpcode::kDeoptimizeUnless, // opcode | 895 Operator::kFoldable | Operator::kNoThrow, // properties |
885 Operator::kFoldable | Operator::kNoThrow, // properties | 896 "DeoptimizeUnless", // name |
886 "DeoptimizeUnless", // name | 897 2, 1, 1, 0, 1, 1, // counts |
887 2, 1, 1, 0, 1, 1, // counts | 898 reason); // parameter |
888 parameter); // parameter | |
889 } | 899 } |
890 | 900 |
891 const Operator* CommonOperatorBuilder::TrapIf(int32_t trap_id) { | 901 const Operator* CommonOperatorBuilder::TrapIf(int32_t trap_id) { |
892 switch (trap_id) { | 902 switch (trap_id) { |
893 #define CACHED_TRAP_IF(Trap) \ | 903 #define CACHED_TRAP_IF(Trap) \ |
894 case Runtime::kThrowWasm##Trap: \ | 904 case Runtime::kThrowWasm##Trap: \ |
895 return &cache_.kTrapIf##Trap##Operator; | 905 return &cache_.kTrapIf##Trap##Operator; |
896 CACHED_TRAP_IF_LIST(CACHED_TRAP_IF) | 906 CACHED_TRAP_IF_LIST(CACHED_TRAP_IF) |
897 #undef CACHED_TRAP_IF | 907 #undef CACHED_TRAP_IF |
898 default: | 908 default: |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1354 CommonOperatorBuilder::CreateFrameStateFunctionInfo( | 1364 CommonOperatorBuilder::CreateFrameStateFunctionInfo( |
1355 FrameStateType type, int parameter_count, int local_count, | 1365 FrameStateType type, int parameter_count, int local_count, |
1356 Handle<SharedFunctionInfo> shared_info) { | 1366 Handle<SharedFunctionInfo> shared_info) { |
1357 return new (zone()->New(sizeof(FrameStateFunctionInfo))) | 1367 return new (zone()->New(sizeof(FrameStateFunctionInfo))) |
1358 FrameStateFunctionInfo(type, parameter_count, local_count, shared_info); | 1368 FrameStateFunctionInfo(type, parameter_count, local_count, shared_info); |
1359 } | 1369 } |
1360 | 1370 |
1361 } // namespace compiler | 1371 } // namespace compiler |
1362 } // namespace internal | 1372 } // namespace internal |
1363 } // namespace v8 | 1373 } // namespace v8 |
OLD | NEW |