summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/common-operator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/common-operator.cc')
-rw-r--r--deps/v8/src/compiler/common-operator.cc150
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