diff options
Diffstat (limited to 'deps/v8/src/compiler/common-operator.cc')
-rw-r--r-- | deps/v8/src/compiler/common-operator.cc | 150 |
1 files changed, 91 insertions, 59 deletions
diff --git a/deps/v8/src/compiler/common-operator.cc b/deps/v8/src/compiler/common-operator.cc index 587eb578ec..5800021708 100644 --- a/deps/v8/src/compiler/common-operator.cc +++ b/deps/v8/src/compiler/common-operator.cc @@ -67,8 +67,7 @@ int ValueInputCountOfReturn(Operator const* const op) { } bool operator==(DeoptimizeParameters lhs, DeoptimizeParameters rhs) { - return lhs.kind() == rhs.kind() && lhs.reason() == rhs.reason() && - lhs.feedback() == rhs.feedback(); + return lhs.reason() == rhs.reason() && lhs.feedback() == rhs.feedback(); } bool operator!=(DeoptimizeParameters lhs, DeoptimizeParameters rhs) { @@ -77,11 +76,11 @@ bool operator!=(DeoptimizeParameters lhs, DeoptimizeParameters rhs) { size_t hash_value(DeoptimizeParameters p) { FeedbackSource::Hash feebdack_hash; - return base::hash_combine(p.kind(), p.reason(), feebdack_hash(p.feedback())); + return base::hash_combine(p.reason(), feebdack_hash(p.feedback())); } std::ostream& operator<<(std::ostream& os, DeoptimizeParameters p) { - return os << p.kind() << ", " << p.reason() << ", " << p.feedback(); + return os << p.reason() << ", " << p.feedback(); } DeoptimizeParameters const& DeoptimizeParametersOf(Operator const* const op) { @@ -408,6 +407,39 @@ IfValueParameters const& IfValueParametersOf(const Operator* op) { return OpParameter<IfValueParameters>(op); } +V8_EXPORT_PRIVATE bool operator==(const SLVerifierHintParameters& p1, + const SLVerifierHintParameters& p2) { + return p1.semantics() == p2.semantics() && + p1.override_output_type() == p2.override_output_type(); +} + +size_t hash_value(const SLVerifierHintParameters& p) { + return base::hash_combine( + p.semantics(), + p.override_output_type() ? hash_value(*p.override_output_type()) : 0); +} + +V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& out, + const SLVerifierHintParameters& p) { + if (p.semantics()) { + p.semantics()->PrintTo(out); + } else { + out << "nullptr"; + } + out << ", "; + if (const auto& t = p.override_output_type()) { + t->PrintTo(out); + } else { + out << ", nullopt"; + } + return out; +} + +const SLVerifierHintParameters& SLVerifierHintParametersOf(const Operator* op) { + DCHECK_EQ(op->opcode(), IrOpcode::kSLVerifierHint); + return OpParameter<SLVerifierHintParameters>(op); +} + #define COMMON_CACHED_OP_LIST(V) \ V(Plug, Operator::kNoProperties, 0, 0, 0, 1, 0, 0) \ V(Dead, Operator::kFoldable, 0, 0, 0, 1, 1, 1) \ @@ -477,28 +509,28 @@ IfValueParameters const& IfValueParametersOf(const Operator* op) { V(7) \ V(8) -#define CACHED_DEOPTIMIZE_LIST(V) \ - V(Eager, MinusZero) \ - V(Eager, WrongMap) \ - V(Soft, InsufficientTypeFeedbackForGenericKeyedAccess) \ - V(Soft, InsufficientTypeFeedbackForGenericNamedAccess) +#define CACHED_DEOPTIMIZE_LIST(V) \ + V(MinusZero) \ + V(WrongMap) \ + V(InsufficientTypeFeedbackForGenericKeyedAccess) \ + V(InsufficientTypeFeedbackForGenericNamedAccess) #define CACHED_DEOPTIMIZE_IF_LIST(V) \ - V(Eager, DivisionByZero) \ - V(Eager, Hole) \ - V(Eager, MinusZero) \ - V(Eager, Overflow) \ - V(Eager, Smi) + V(DivisionByZero) \ + V(Hole) \ + V(MinusZero) \ + V(Overflow) \ + V(Smi) #define CACHED_DEOPTIMIZE_UNLESS_LIST(V) \ - V(Eager, LostPrecision) \ - V(Eager, LostPrecisionOrNaN) \ - V(Eager, NotAHeapNumber) \ - V(Eager, NotANumberOrOddball) \ - V(Eager, NotASmi) \ - V(Eager, OutOfBounds) \ - V(Eager, WrongInstanceType) \ - V(Eager, WrongMap) + V(LostPrecision) \ + V(LostPrecisionOrNaN) \ + V(NotAHeapNumber) \ + V(NotANumberOrOddball) \ + V(NotASmi) \ + V(OutOfBounds) \ + V(WrongInstanceType) \ + V(WrongMap) #define CACHED_TRAP_IF_LIST(V) \ V(TrapDivUnrepresentable) \ @@ -680,7 +712,7 @@ struct CommonOperatorGlobalCache final { CACHED_LOOP_EXIT_VALUE_LIST(CACHED_LOOP_EXIT_VALUE) #undef CACHED_LOOP_EXIT_VALUE - template <DeoptimizeKind kKind, DeoptimizeReason kReason> + template <DeoptimizeReason kReason> struct DeoptimizeOperator final : public Operator1<DeoptimizeParameters> { DeoptimizeOperator() : Operator1<DeoptimizeParameters>( // -- @@ -688,15 +720,14 @@ struct CommonOperatorGlobalCache final { Operator::kFoldable | Operator::kNoThrow, // properties "Deoptimize", // name 1, 1, 1, 0, 0, 1, // counts - DeoptimizeParameters(kKind, kReason, FeedbackSource())) {} + DeoptimizeParameters(kReason, FeedbackSource())) {} }; -#define CACHED_DEOPTIMIZE(Kind, Reason) \ - DeoptimizeOperator<DeoptimizeKind::k##Kind, DeoptimizeReason::k##Reason> \ - kDeoptimize##Kind##Reason##Operator; +#define CACHED_DEOPTIMIZE(Reason) \ + DeoptimizeOperator<DeoptimizeReason::k##Reason> kDeoptimize##Reason##Operator; CACHED_DEOPTIMIZE_LIST(CACHED_DEOPTIMIZE) #undef CACHED_DEOPTIMIZE - template <DeoptimizeKind kKind, DeoptimizeReason kReason> + template <DeoptimizeReason kReason> struct DeoptimizeIfOperator final : public Operator1<DeoptimizeParameters> { DeoptimizeIfOperator() : Operator1<DeoptimizeParameters>( // -- @@ -704,15 +735,15 @@ struct CommonOperatorGlobalCache final { Operator::kFoldable | Operator::kNoThrow, // properties "DeoptimizeIf", // name 2, 1, 1, 0, 1, 1, // counts - DeoptimizeParameters(kKind, kReason, FeedbackSource())) {} + DeoptimizeParameters(kReason, FeedbackSource())) {} }; -#define CACHED_DEOPTIMIZE_IF(Kind, Reason) \ - DeoptimizeIfOperator<DeoptimizeKind::k##Kind, DeoptimizeReason::k##Reason> \ - kDeoptimizeIf##Kind##Reason##Operator; +#define CACHED_DEOPTIMIZE_IF(Reason) \ + DeoptimizeIfOperator<DeoptimizeReason::k##Reason> \ + kDeoptimizeIf##Reason##Operator; CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF) #undef CACHED_DEOPTIMIZE_IF - template <DeoptimizeKind kKind, DeoptimizeReason kReason> + template <DeoptimizeReason kReason> struct DeoptimizeUnlessOperator final : public Operator1<DeoptimizeParameters> { DeoptimizeUnlessOperator() @@ -721,12 +752,11 @@ struct CommonOperatorGlobalCache final { Operator::kFoldable | Operator::kNoThrow, // properties "DeoptimizeUnless", // name 2, 1, 1, 0, 1, 1, // counts - DeoptimizeParameters(kKind, kReason, FeedbackSource())) {} + DeoptimizeParameters(kReason, FeedbackSource())) {} }; -#define CACHED_DEOPTIMIZE_UNLESS(Kind, Reason) \ - DeoptimizeUnlessOperator<DeoptimizeKind::k##Kind, \ - DeoptimizeReason::k##Reason> \ - kDeoptimizeUnless##Kind##Reason##Operator; +#define CACHED_DEOPTIMIZE_UNLESS(Reason) \ + DeoptimizeUnlessOperator<DeoptimizeReason::k##Reason> \ + kDeoptimizeUnless##Reason##Operator; CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS) #undef CACHED_DEOPTIMIZE_UNLESS @@ -892,6 +922,14 @@ const Operator* CommonOperatorBuilder::StaticAssert(const char* source) { 1, 0, source); } +const Operator* CommonOperatorBuilder::SLVerifierHint( + const Operator* semantics, + const base::Optional<Type>& override_output_type) { + return zone()->New<Operator1<SLVerifierHintParameters>>( + IrOpcode::kSLVerifierHint, Operator::kNoProperties, "SLVerifierHint", 1, + 0, 0, 1, 0, 0, SLVerifierHintParameters(semantics, override_output_type)); +} + const Operator* CommonOperatorBuilder::Branch(BranchHint hint) { #define CACHED_BRANCH(Hint) \ if (hint == BranchHint::k##Hint) { \ @@ -903,17 +941,15 @@ const Operator* CommonOperatorBuilder::Branch(BranchHint hint) { } const Operator* CommonOperatorBuilder::Deoptimize( - DeoptimizeKind kind, DeoptimizeReason reason, - FeedbackSource const& feedback) { -#define CACHED_DEOPTIMIZE(Kind, Reason) \ - if (kind == DeoptimizeKind::k##Kind && \ - reason == DeoptimizeReason::k##Reason && !feedback.IsValid()) { \ - return &cache_.kDeoptimize##Kind##Reason##Operator; \ + DeoptimizeReason reason, FeedbackSource const& feedback) { +#define CACHED_DEOPTIMIZE(Reason) \ + if (reason == DeoptimizeReason::k##Reason && !feedback.IsValid()) { \ + return &cache_.kDeoptimize##Reason##Operator; \ } CACHED_DEOPTIMIZE_LIST(CACHED_DEOPTIMIZE) #undef CACHED_DEOPTIMIZE // Uncached - DeoptimizeParameters parameter(kind, reason, feedback); + DeoptimizeParameters parameter(reason, feedback); return zone()->New<Operator1<DeoptimizeParameters>>( // -- IrOpcode::kDeoptimize, // opcodes Operator::kFoldable | Operator::kNoThrow, // properties @@ -923,17 +959,15 @@ const Operator* CommonOperatorBuilder::Deoptimize( } const Operator* CommonOperatorBuilder::DeoptimizeIf( - DeoptimizeKind kind, DeoptimizeReason reason, - FeedbackSource const& feedback) { -#define CACHED_DEOPTIMIZE_IF(Kind, Reason) \ - if (kind == DeoptimizeKind::k##Kind && \ - reason == DeoptimizeReason::k##Reason && !feedback.IsValid()) { \ - return &cache_.kDeoptimizeIf##Kind##Reason##Operator; \ + DeoptimizeReason reason, FeedbackSource const& feedback) { +#define CACHED_DEOPTIMIZE_IF(Reason) \ + if (reason == DeoptimizeReason::k##Reason && !feedback.IsValid()) { \ + return &cache_.kDeoptimizeIf##Reason##Operator; \ } CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF) #undef CACHED_DEOPTIMIZE_IF // Uncached - DeoptimizeParameters parameter(kind, reason, feedback); + DeoptimizeParameters parameter(reason, feedback); return zone()->New<Operator1<DeoptimizeParameters>>( // -- IrOpcode::kDeoptimizeIf, // opcode Operator::kFoldable | Operator::kNoThrow, // properties @@ -943,17 +977,15 @@ const Operator* CommonOperatorBuilder::DeoptimizeIf( } const Operator* CommonOperatorBuilder::DeoptimizeUnless( - DeoptimizeKind kind, DeoptimizeReason reason, - FeedbackSource const& feedback) { -#define CACHED_DEOPTIMIZE_UNLESS(Kind, Reason) \ - if (kind == DeoptimizeKind::k##Kind && \ - reason == DeoptimizeReason::k##Reason && !feedback.IsValid()) { \ - return &cache_.kDeoptimizeUnless##Kind##Reason##Operator; \ + DeoptimizeReason reason, FeedbackSource const& feedback) { +#define CACHED_DEOPTIMIZE_UNLESS(Reason) \ + if (reason == DeoptimizeReason::k##Reason && !feedback.IsValid()) { \ + return &cache_.kDeoptimizeUnless##Reason##Operator; \ } CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS) #undef CACHED_DEOPTIMIZE_UNLESS // Uncached - DeoptimizeParameters parameter(kind, reason, feedback); + DeoptimizeParameters parameter(reason, feedback); return zone()->New<Operator1<DeoptimizeParameters>>( // -- IrOpcode::kDeoptimizeUnless, // opcode Operator::kFoldable | Operator::kNoThrow, // properties |