diff options
Diffstat (limited to 'deps/v8/src/compiler/simplified-operator.cc')
-rw-r--r-- | deps/v8/src/compiler/simplified-operator.cc | 111 |
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) { |