summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/simplified-operator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/simplified-operator.cc')
-rw-r--r--deps/v8/src/compiler/simplified-operator.cc111
1 files changed, 73 insertions, 38 deletions
diff --git a/deps/v8/src/compiler/simplified-operator.cc b/deps/v8/src/compiler/simplified-operator.cc
index 4f83635422..6b86a95e01 100644
--- a/deps/v8/src/compiler/simplified-operator.cc
+++ b/deps/v8/src/compiler/simplified-operator.cc
@@ -31,13 +31,34 @@ std::ostream& operator<<(std::ostream& os, BaseTaggedness base_taggedness) {
UNREACHABLE();
}
+std::ostream& operator<<(std::ostream& os,
+ ConstFieldInfo const& const_field_info) {
+ if (const_field_info.IsConst()) {
+ return os << "const (field owner: " << const_field_info.owner_map.address()
+ << ")";
+ } else {
+ return os << "mutable";
+ }
+ UNREACHABLE();
+}
+
+bool operator==(ConstFieldInfo const& lhs, ConstFieldInfo const& rhs) {
+ return lhs.owner_map.address() == rhs.owner_map.address();
+}
+
+size_t hash_value(ConstFieldInfo const& const_field_info) {
+ return (size_t)const_field_info.owner_map.address();
+}
+
bool operator==(FieldAccess const& lhs, FieldAccess const& rhs) {
// On purpose we don't include the write barrier kind here, as this method is
// really only relevant for eliminating loads and they don't care about the
// write barrier mode.
return lhs.base_is_tagged == rhs.base_is_tagged && lhs.offset == rhs.offset &&
lhs.map.address() == rhs.map.address() &&
- lhs.machine_type == rhs.machine_type;
+ lhs.machine_type == rhs.machine_type &&
+ lhs.const_field_info == rhs.const_field_info &&
+ lhs.is_store_in_literal == rhs.is_store_in_literal;
}
size_t hash_value(FieldAccess const& access) {
@@ -45,7 +66,8 @@ size_t hash_value(FieldAccess const& access) {
// really only relevant for eliminating loads and they don't care about the
// write barrier mode.
return base::hash_combine(access.base_is_tagged, access.offset,
- access.machine_type);
+ access.machine_type, access.const_field_info,
+ access.is_store_in_literal);
}
size_t hash_value(LoadSensitivity load_sensitivity) {
@@ -78,7 +100,10 @@ std::ostream& operator<<(std::ostream& os, FieldAccess const& access) {
}
#endif
os << access.type << ", " << access.machine_type << ", "
- << access.write_barrier_kind << ", " << access.constness;
+ << access.write_barrier_kind << ", " << access.const_field_info;
+ if (access.is_store_in_literal) {
+ os << " (store in literal)";
+ }
if (FLAG_untrusted_code_mitigations) {
os << ", " << access.load_sensitivity;
}
@@ -199,7 +224,8 @@ std::ostream& operator<<(std::ostream& os,
}
size_t hash_value(const CheckFloat64HoleParameters& params) {
- return base::hash_combine(params.mode(), params.feedback());
+ FeedbackSource::Hash feedback_hash;
+ return base::hash_combine(params.mode(), feedback_hash(params.feedback()));
}
bool operator==(CheckFloat64HoleParameters const& lhs,
@@ -249,7 +275,8 @@ bool operator==(CheckMapsParameters const& lhs,
}
size_t hash_value(CheckMapsParameters const& p) {
- return base::hash_combine(p.flags(), p.maps(), p.feedback());
+ FeedbackSource::Hash feedback_hash;
+ return base::hash_combine(p.flags(), p.maps(), feedback_hash(p.feedback()));
}
std::ostream& operator<<(std::ostream& os, CheckMapsParameters const& p) {
@@ -305,7 +332,8 @@ bool operator==(const GrowFastElementsParameters& lhs,
}
inline size_t hash_value(const GrowFastElementsParameters& params) {
- return base::hash_combine(params.mode(), params.feedback());
+ FeedbackSource::Hash feedback_hash;
+ return base::hash_combine(params.mode(), feedback_hash(params.feedback()));
}
std::ostream& operator<<(std::ostream& os,
@@ -550,7 +578,8 @@ bool operator==(NumberOperationParameters const& lhs,
}
size_t hash_value(NumberOperationParameters const& p) {
- return base::hash_combine(p.hint(), p.feedback());
+ FeedbackSource::Hash feedback_hash;
+ return base::hash_combine(p.hint(), feedback_hash(p.feedback()));
}
std::ostream& operator<<(std::ostream& os, NumberOperationParameters const& p) {
@@ -619,7 +648,8 @@ std::ostream& operator<<(std::ostream& os,
}
size_t hash_value(const CheckTaggedInputParameters& params) {
- return base::hash_combine(params.mode(), params.feedback());
+ FeedbackSource::Hash feedback_hash;
+ return base::hash_combine(params.mode(), feedback_hash(params.feedback()));
}
bool operator==(CheckTaggedInputParameters const& lhs,
@@ -645,7 +675,8 @@ std::ostream& operator<<(std::ostream& os,
}
size_t hash_value(const CheckMinusZeroParameters& params) {
- return base::hash_combine(params.mode(), params.feedback());
+ FeedbackSource::Hash feedback_hash;
+ return base::hash_combine(params.mode(), feedback_hash(params.feedback()));
}
bool operator==(CheckMinusZeroParameters const& lhs,
@@ -878,7 +909,7 @@ struct SimplifiedOperatorGlobalCache final {
: Operator1<CheckParameters>( \
IrOpcode::k##Name, Operator::kFoldable | Operator::kNoThrow, \
#Name, value_input_count, 1, 1, value_output_count, 1, 0, \
- CheckParameters(VectorSlotPair())) {} \
+ CheckParameters(FeedbackSource())) {} \
}; \
Name##Operator k##Name;
CHECKED_WITH_FEEDBACK_OP_LIST(CHECKED_WITH_FEEDBACK)
@@ -886,16 +917,16 @@ struct SimplifiedOperatorGlobalCache final {
#define CHECKED_BOUNDS(Name) \
struct Name##Operator final : public Operator1<CheckBoundsParameters> { \
- Name##Operator(VectorSlotPair feedback, CheckBoundsParameters::Mode mode) \
+ Name##Operator(FeedbackSource feedback, CheckBoundsParameters::Mode mode) \
: Operator1<CheckBoundsParameters>( \
IrOpcode::k##Name, Operator::kFoldable | Operator::kNoThrow, \
#Name, 2, 1, 1, 1, 1, 0, \
CheckBoundsParameters(feedback, mode)) {} \
}; \
Name##Operator k##Name##Deopting = { \
- VectorSlotPair(), CheckBoundsParameters::kDeoptOnOutOfBounds}; \
+ FeedbackSource(), CheckBoundsParameters::kDeoptOnOutOfBounds}; \
Name##Operator k##Name##Aborting = { \
- VectorSlotPair(), CheckBoundsParameters::kAbortOnOutOfBounds};
+ FeedbackSource(), CheckBoundsParameters::kAbortOnOutOfBounds};
CHECKED_BOUNDS_OP_LIST(CHECKED_BOUNDS)
#undef CHECKED_BOUNDS
@@ -905,7 +936,7 @@ struct SimplifiedOperatorGlobalCache final {
: Operator1<CheckIfParameters>(
IrOpcode::kCheckIf, Operator::kFoldable | Operator::kNoThrow,
"CheckIf", 1, 1, 1, 0, 1, 0,
- CheckIfParameters(kDeoptimizeReason, VectorSlotPair())) {}
+ CheckIfParameters(kDeoptimizeReason, FeedbackSource())) {}
};
#define CHECK_IF(Name, message) \
CheckIfOperator<DeoptimizeReason::k##Name> kCheckIf##Name;
@@ -970,7 +1001,7 @@ struct SimplifiedOperatorGlobalCache final {
IrOpcode::kCheckedFloat64ToInt32,
Operator::kFoldable | Operator::kNoThrow, "CheckedFloat64ToInt32",
1, 1, 1, 1, 1, 0,
- CheckMinusZeroParameters(kMode, VectorSlotPair())) {}
+ CheckMinusZeroParameters(kMode, FeedbackSource())) {}
};
CheckedFloat64ToInt32Operator<CheckForMinusZeroMode::kCheckForMinusZero>
kCheckedFloat64ToInt32CheckForMinusZeroOperator;
@@ -985,7 +1016,7 @@ struct SimplifiedOperatorGlobalCache final {
IrOpcode::kCheckedFloat64ToInt64,
Operator::kFoldable | Operator::kNoThrow, "CheckedFloat64ToInt64",
1, 1, 1, 1, 1, 0,
- CheckMinusZeroParameters(kMode, VectorSlotPair())) {}
+ CheckMinusZeroParameters(kMode, FeedbackSource())) {}
};
CheckedFloat64ToInt64Operator<CheckForMinusZeroMode::kCheckForMinusZero>
kCheckedFloat64ToInt64CheckForMinusZeroOperator;
@@ -1000,7 +1031,7 @@ struct SimplifiedOperatorGlobalCache final {
IrOpcode::kCheckedTaggedToInt32,
Operator::kFoldable | Operator::kNoThrow, "CheckedTaggedToInt32",
1, 1, 1, 1, 1, 0,
- CheckMinusZeroParameters(kMode, VectorSlotPair())) {}
+ CheckMinusZeroParameters(kMode, FeedbackSource())) {}
};
CheckedTaggedToInt32Operator<CheckForMinusZeroMode::kCheckForMinusZero>
kCheckedTaggedToInt32CheckForMinusZeroOperator;
@@ -1015,7 +1046,7 @@ struct SimplifiedOperatorGlobalCache final {
IrOpcode::kCheckedTaggedToInt64,
Operator::kFoldable | Operator::kNoThrow, "CheckedTaggedToInt64",
1, 1, 1, 1, 1, 0,
- CheckMinusZeroParameters(kMode, VectorSlotPair())) {}
+ CheckMinusZeroParameters(kMode, FeedbackSource())) {}
};
CheckedTaggedToInt64Operator<CheckForMinusZeroMode::kCheckForMinusZero>
kCheckedTaggedToInt64CheckForMinusZeroOperator;
@@ -1030,7 +1061,7 @@ struct SimplifiedOperatorGlobalCache final {
IrOpcode::kCheckedTaggedToFloat64,
Operator::kFoldable | Operator::kNoThrow,
"CheckedTaggedToFloat64", 1, 1, 1, 1, 1, 0,
- CheckTaggedInputParameters(kMode, VectorSlotPair())) {}
+ CheckTaggedInputParameters(kMode, FeedbackSource())) {}
};
CheckedTaggedToFloat64Operator<CheckTaggedInputMode::kNumber>
kCheckedTaggedToFloat64NumberOperator;
@@ -1045,7 +1076,7 @@ struct SimplifiedOperatorGlobalCache final {
IrOpcode::kCheckedTruncateTaggedToWord32,
Operator::kFoldable | Operator::kNoThrow,
"CheckedTruncateTaggedToWord32", 1, 1, 1, 1, 1, 0,
- CheckTaggedInputParameters(kMode, VectorSlotPair())) {}
+ CheckTaggedInputParameters(kMode, FeedbackSource())) {}
};
CheckedTruncateTaggedToWord32Operator<CheckTaggedInputMode::kNumber>
kCheckedTruncateTaggedToWord32NumberOperator;
@@ -1077,7 +1108,7 @@ struct SimplifiedOperatorGlobalCache final {
IrOpcode::kCheckFloat64Hole,
Operator::kFoldable | Operator::kNoThrow, "CheckFloat64Hole", 1,
1, 1, 1, 1, 0,
- CheckFloat64HoleParameters(kMode, VectorSlotPair())) {}
+ CheckFloat64HoleParameters(kMode, FeedbackSource())) {}
};
CheckFloat64HoleNaNOperator<CheckFloat64HoleMode::kAllowReturnHole>
kCheckFloat64HoleAllowReturnHoleOperator;
@@ -1100,7 +1131,7 @@ struct SimplifiedOperatorGlobalCache final {
GrowFastElementsOperator()
: Operator1(IrOpcode::kMaybeGrowFastElements, Operator::kNoThrow,
"MaybeGrowFastElements", 4, 1, 1, 1, 1, 0,
- GrowFastElementsParameters(kMode, VectorSlotPair())) {}
+ GrowFastElementsParameters(kMode, FeedbackSource())) {}
};
GrowFastElementsOperator<GrowFastElementsMode::kDoubleElements>
@@ -1145,7 +1176,7 @@ struct SimplifiedOperatorGlobalCache final {
IrOpcode::kSpeculativeToNumber,
Operator::kFoldable | Operator::kNoThrow, "SpeculativeToNumber",
1, 1, 1, 1, 1, 0,
- NumberOperationParameters(kHint, VectorSlotPair())) {}
+ NumberOperationParameters(kHint, FeedbackSource())) {}
};
SpeculativeToNumberOperator<NumberOperationHint::kSignedSmall>
kSpeculativeToNumberSignedSmallOperator;
@@ -1179,7 +1210,7 @@ GET_FROM_CACHE(LoadFieldByIndex)
#define GET_FROM_CACHE_WITH_FEEDBACK(Name, value_input_count, \
value_output_count) \
const Operator* SimplifiedOperatorBuilder::Name( \
- const VectorSlotPair& feedback) { \
+ const FeedbackSource& feedback) { \
if (!feedback.IsValid()) { \
return &cache_.k##Name; \
} \
@@ -1193,7 +1224,7 @@ CHECKED_WITH_FEEDBACK_OP_LIST(GET_FROM_CACHE_WITH_FEEDBACK)
#define GET_FROM_CACHE_WITH_FEEDBACK(Name) \
const Operator* SimplifiedOperatorBuilder::Name( \
- const VectorSlotPair& feedback, CheckBoundsParameters::Mode mode) { \
+ const FeedbackSource& feedback, CheckBoundsParameters::Mode mode) { \
if (!feedback.IsValid()) { \
switch (mode) { \
case CheckBoundsParameters::kDeoptOnOutOfBounds: \
@@ -1242,7 +1273,7 @@ const Operator* SimplifiedOperatorBuilder::AssertType(Type type) {
}
const Operator* SimplifiedOperatorBuilder::CheckIf(
- DeoptimizeReason reason, const VectorSlotPair& feedback) {
+ DeoptimizeReason reason, const FeedbackSource& feedback) {
if (!feedback.IsValid()) {
switch (reason) {
#define CHECK_IF(Name, message) \
@@ -1280,7 +1311,7 @@ const Operator* SimplifiedOperatorBuilder::CheckedInt32Mul(
}
const Operator* SimplifiedOperatorBuilder::CheckedFloat64ToInt32(
- CheckForMinusZeroMode mode, const VectorSlotPair& feedback) {
+ CheckForMinusZeroMode mode, const FeedbackSource& feedback) {
if (!feedback.IsValid()) {
switch (mode) {
case CheckForMinusZeroMode::kCheckForMinusZero:
@@ -1296,7 +1327,7 @@ const Operator* SimplifiedOperatorBuilder::CheckedFloat64ToInt32(
}
const Operator* SimplifiedOperatorBuilder::CheckedFloat64ToInt64(
- CheckForMinusZeroMode mode, const VectorSlotPair& feedback) {
+ CheckForMinusZeroMode mode, const FeedbackSource& feedback) {
if (!feedback.IsValid()) {
switch (mode) {
case CheckForMinusZeroMode::kCheckForMinusZero:
@@ -1312,7 +1343,7 @@ const Operator* SimplifiedOperatorBuilder::CheckedFloat64ToInt64(
}
const Operator* SimplifiedOperatorBuilder::CheckedTaggedToInt32(
- CheckForMinusZeroMode mode, const VectorSlotPair& feedback) {
+ CheckForMinusZeroMode mode, const FeedbackSource& feedback) {
if (!feedback.IsValid()) {
switch (mode) {
case CheckForMinusZeroMode::kCheckForMinusZero:
@@ -1328,7 +1359,7 @@ const Operator* SimplifiedOperatorBuilder::CheckedTaggedToInt32(
}
const Operator* SimplifiedOperatorBuilder::CheckedTaggedToInt64(
- CheckForMinusZeroMode mode, const VectorSlotPair& feedback) {
+ CheckForMinusZeroMode mode, const FeedbackSource& feedback) {
if (!feedback.IsValid()) {
switch (mode) {
case CheckForMinusZeroMode::kCheckForMinusZero:
@@ -1344,7 +1375,7 @@ const Operator* SimplifiedOperatorBuilder::CheckedTaggedToInt64(
}
const Operator* SimplifiedOperatorBuilder::CheckedTaggedToFloat64(
- CheckTaggedInputMode mode, const VectorSlotPair& feedback) {
+ CheckTaggedInputMode mode, const FeedbackSource& feedback) {
if (!feedback.IsValid()) {
switch (mode) {
case CheckTaggedInputMode::kNumber:
@@ -1360,7 +1391,7 @@ const Operator* SimplifiedOperatorBuilder::CheckedTaggedToFloat64(
}
const Operator* SimplifiedOperatorBuilder::CheckedTruncateTaggedToWord32(
- CheckTaggedInputMode mode, const VectorSlotPair& feedback) {
+ CheckTaggedInputMode mode, const FeedbackSource& feedback) {
if (!feedback.IsValid()) {
switch (mode) {
case CheckTaggedInputMode::kNumber:
@@ -1377,7 +1408,7 @@ const Operator* SimplifiedOperatorBuilder::CheckedTruncateTaggedToWord32(
const Operator* SimplifiedOperatorBuilder::CheckMaps(
CheckMapsFlags flags, ZoneHandleSet<Map> maps,
- const VectorSlotPair& feedback) {
+ const FeedbackSource& feedback) {
CheckMapsParameters const parameters(flags, maps, feedback);
return new (zone()) Operator1<CheckMapsParameters>( // --
IrOpcode::kCheckMaps, // opcode
@@ -1422,7 +1453,7 @@ const Operator* SimplifiedOperatorBuilder::ConvertReceiver(
}
const Operator* SimplifiedOperatorBuilder::CheckFloat64Hole(
- CheckFloat64HoleMode mode, VectorSlotPair const& feedback) {
+ CheckFloat64HoleMode mode, FeedbackSource const& feedback) {
if (!feedback.IsValid()) {
switch (mode) {
case CheckFloat64HoleMode::kAllowReturnHole:
@@ -1454,7 +1485,7 @@ const Operator* SimplifiedOperatorBuilder::SpeculativeBigIntNegate(
}
const Operator* SimplifiedOperatorBuilder::SpeculativeToNumber(
- NumberOperationHint hint, const VectorSlotPair& feedback) {
+ NumberOperationHint hint, const FeedbackSource& feedback) {
if (!feedback.IsValid()) {
switch (hint) {
case NumberOperationHint::kSignedSmall:
@@ -1480,7 +1511,7 @@ const Operator* SimplifiedOperatorBuilder::EnsureWritableFastElements() {
}
const Operator* SimplifiedOperatorBuilder::MaybeGrowFastElements(
- GrowFastElementsMode mode, const VectorSlotPair& feedback) {
+ GrowFastElementsMode mode, const FeedbackSource& feedback) {
if (!feedback.IsValid()) {
switch (mode) {
case GrowFastElementsMode::kDoubleElements:
@@ -1556,7 +1587,10 @@ bool operator==(CheckParameters const& lhs, CheckParameters const& rhs) {
return lhs.feedback() == rhs.feedback();
}
-size_t hash_value(CheckParameters const& p) { return hash_value(p.feedback()); }
+size_t hash_value(CheckParameters const& p) {
+ FeedbackSource::Hash feedback_hash;
+ return feedback_hash(p.feedback());
+}
std::ostream& operator<<(std::ostream& os, CheckParameters const& p) {
return os << p.feedback();
@@ -1605,7 +1639,8 @@ bool operator==(CheckIfParameters const& lhs, CheckIfParameters const& rhs) {
}
size_t hash_value(CheckIfParameters const& p) {
- return base::hash_combine(p.reason(), p.feedback());
+ FeedbackSource::Hash feedback_hash;
+ return base::hash_combine(p.reason(), feedback_hash(p.feedback()));
}
std::ostream& operator<<(std::ostream& os, CheckIfParameters const& p) {