diff options
Diffstat (limited to 'deps/v8/src/compiler/simplified-operator.cc')
-rw-r--r-- | deps/v8/src/compiler/simplified-operator.cc | 181 |
1 files changed, 136 insertions, 45 deletions
diff --git a/deps/v8/src/compiler/simplified-operator.cc b/deps/v8/src/compiler/simplified-operator.cc index 9978bae122..f4802a96d0 100644 --- a/deps/v8/src/compiler/simplified-operator.cc +++ b/deps/v8/src/compiler/simplified-operator.cc @@ -258,11 +258,6 @@ std::ostream& operator<<(std::ostream& os, CheckTaggedInputMode mode) { UNREACHABLE(); } -CheckTaggedInputMode CheckTaggedInputModeOf(const Operator* op) { - DCHECK(op->opcode() == IrOpcode::kCheckedTaggedToFloat64); - return OpParameter<CheckTaggedInputMode>(op); -} - std::ostream& operator<<(std::ostream& os, GrowFastElementsMode mode) { switch (mode) { case GrowFastElementsMode::kDoubleElements: @@ -487,8 +482,7 @@ size_t hash_value(NumberOperationHint hint) { } NumberOperationHint NumberOperationHintOf(const Operator* op) { - DCHECK(op->opcode() == IrOpcode::kSpeculativeToNumber || - op->opcode() == IrOpcode::kSpeculativeNumberAdd || + DCHECK(op->opcode() == IrOpcode::kSpeculativeNumberAdd || op->opcode() == IrOpcode::kSpeculativeNumberSubtract || op->opcode() == IrOpcode::kSpeculativeNumberMultiply || op->opcode() == IrOpcode::kSpeculativeNumberDivide || @@ -507,6 +501,25 @@ NumberOperationHint NumberOperationHintOf(const Operator* op) { return OpParameter<NumberOperationHint>(op); } +bool operator==(NumberOperationParameters const& lhs, + NumberOperationParameters const& rhs) { + return lhs.hint() == rhs.hint() && lhs.feedback() == rhs.feedback(); +} + +size_t hash_value(NumberOperationParameters const& p) { + return base::hash_combine(p.hint(), p.feedback()); +} + +std::ostream& operator<<(std::ostream& os, NumberOperationParameters const& p) { + return os << p.hint() << " " << p.feedback(); +} + +NumberOperationParameters const& NumberOperationParametersOf( + Operator const* op) { + DCHECK_EQ(IrOpcode::kSpeculativeToNumber, op->opcode()); + return OpParameter<NumberOperationParameters>(op); +} + size_t hash_value(AllocateParameters info) { return base::hash_combine(info.type(), info.pretenure()); } @@ -537,7 +550,9 @@ Type* AllocateTypeOf(const Operator* op) { } UnicodeEncoding UnicodeEncodingOf(const Operator* op) { - DCHECK_EQ(IrOpcode::kStringFromCodePoint, op->opcode()); + DCHECK(op->opcode() == IrOpcode::kStringFromCodePoint || + op->opcode() == IrOpcode::kStringCodePointAt || + op->opcode() == IrOpcode::kSeqStringCodePointAt); return OpParameter<UnicodeEncoding>(op); } @@ -553,7 +568,8 @@ DeoptimizeReason DeoptimizeReasonOf(const Operator* op) { const CheckTaggedInputParameters& CheckTaggedInputParametersOf( const Operator* op) { - DCHECK(op->opcode() == IrOpcode::kCheckedTruncateTaggedToWord32); + DCHECK(op->opcode() == IrOpcode::kCheckedTruncateTaggedToWord32 || + op->opcode() == IrOpcode::kCheckedTaggedToFloat64); return OpParameter<CheckTaggedInputParameters>(op); } @@ -655,18 +671,12 @@ bool operator==(CheckMinusZeroParameters const& lhs, V(NumberToUint8Clamped, Operator::kNoProperties, 1, 0) \ V(NumberSilenceNaN, Operator::kNoProperties, 1, 0) \ V(StringToNumber, Operator::kNoProperties, 1, 0) \ - V(StringCharAt, Operator::kNoProperties, 2, 1) \ - V(StringCharCodeAt, Operator::kNoProperties, 2, 1) \ - V(SeqStringCharCodeAt, Operator::kNoProperties, 2, 1) \ - V(StringCodePointAt, Operator::kNoProperties, 2, 1) \ - V(SeqStringCodePointAt, Operator::kNoProperties, 2, 1) \ V(StringFromCharCode, Operator::kNoProperties, 1, 0) \ V(StringIndexOf, Operator::kNoProperties, 3, 0) \ V(StringLength, Operator::kNoProperties, 1, 0) \ V(StringToLowerCaseIntl, Operator::kNoProperties, 1, 0) \ V(StringToUpperCaseIntl, Operator::kNoProperties, 1, 0) \ V(TypeOf, Operator::kNoProperties, 1, 1) \ - V(ClassOf, Operator::kNoProperties, 1, 1) \ V(PlainPrimitiveToNumber, Operator::kNoProperties, 1, 0) \ V(PlainPrimitiveToWord32, Operator::kNoProperties, 1, 0) \ V(PlainPrimitiveToFloat64, Operator::kNoProperties, 1, 0) \ @@ -710,6 +720,12 @@ bool operator==(CheckMinusZeroParameters const& lhs, V(NewConsString, Operator::kNoProperties, 3, 0) \ V(MaskIndexWithBound, Operator::kNoProperties, 2, 0) +#define EFFECT_DEPENDENT_OP_LIST(V) \ + V(StringCharAt, Operator::kNoProperties, 2, 1) \ + V(StringCharCodeAt, Operator::kNoProperties, 2, 1) \ + V(SeqStringCharCodeAt, Operator::kNoProperties, 2, 1) \ + V(StringSubstring, Operator::kNoProperties, 3, 1) + #define SPECULATIVE_NUMBER_BINOP_LIST(V) \ SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(V) \ V(SpeculativeNumberEqual) \ @@ -755,6 +771,20 @@ struct SimplifiedOperatorGlobalCache final { PURE_OP_LIST(PURE) #undef PURE +#define EFFECT_DEPENDENT(Name, properties, value_input_count, \ + control_input_count) \ + struct Name##Operator final : public Operator { \ + Name##Operator() \ + : Operator(IrOpcode::k##Name, \ + Operator::kNoDeopt | Operator::kNoWrite | \ + Operator::kNoThrow | properties, \ + #Name, value_input_count, 1, control_input_count, 1, 1, \ + 0) {} \ + }; \ + Name##Operator k##Name; + EFFECT_DEPENDENT_OP_LIST(EFFECT_DEPENDENT) +#undef EFFECT_DEPENDENT + #define CHECKED(Name, value_input_count, value_output_count) \ struct Name##Operator final : public Operator { \ Name##Operator() \ @@ -791,6 +821,33 @@ struct SimplifiedOperatorGlobalCache final { #undef CHECK_IF template <UnicodeEncoding kEncoding> + struct StringCodePointAtOperator final : public Operator1<UnicodeEncoding> { + StringCodePointAtOperator() + : Operator1<UnicodeEncoding>(IrOpcode::kStringCodePointAt, + Operator::kFoldable | Operator::kNoThrow, + "StringCodePointAt", 2, 1, 1, 1, 1, 0, + kEncoding) {} + }; + StringCodePointAtOperator<UnicodeEncoding::UTF16> + kStringCodePointAtOperatorUTF16; + StringCodePointAtOperator<UnicodeEncoding::UTF32> + kStringCodePointAtOperatorUTF32; + + template <UnicodeEncoding kEncoding> + struct SeqStringCodePointAtOperator final + : public Operator1<UnicodeEncoding> { + SeqStringCodePointAtOperator() + : Operator1<UnicodeEncoding>(IrOpcode::kSeqStringCodePointAt, + Operator::kFoldable | Operator::kNoThrow, + "SeqStringCodePointAt", 2, 1, 1, 1, 1, 0, + kEncoding) {} + }; + SeqStringCodePointAtOperator<UnicodeEncoding::UTF16> + kSeqStringCodePointAtOperatorUTF16; + SeqStringCodePointAtOperator<UnicodeEncoding::UTF32> + kSeqStringCodePointAtOperatorUTF32; + + template <UnicodeEncoding kEncoding> struct StringFromCodePointOperator final : public Operator1<UnicodeEncoding> { StringFromCodePointOperator() : Operator1<UnicodeEncoding>(IrOpcode::kStringFromCodePoint, @@ -891,12 +948,13 @@ struct SimplifiedOperatorGlobalCache final { template <CheckTaggedInputMode kMode> struct CheckedTaggedToFloat64Operator final - : public Operator1<CheckTaggedInputMode> { + : public Operator1<CheckTaggedInputParameters> { CheckedTaggedToFloat64Operator() - : Operator1<CheckTaggedInputMode>( + : Operator1<CheckTaggedInputParameters>( IrOpcode::kCheckedTaggedToFloat64, Operator::kFoldable | Operator::kNoThrow, - "CheckedTaggedToFloat64", 1, 1, 1, 1, 1, 0, kMode) {} + "CheckedTaggedToFloat64", 1, 1, 1, 1, 1, 0, + CheckTaggedInputParameters(kMode, VectorSlotPair())) {} }; CheckedTaggedToFloat64Operator<CheckTaggedInputMode::kNumber> kCheckedTaggedToFloat64NumberOperator; @@ -1004,14 +1062,13 @@ struct SimplifiedOperatorGlobalCache final { template <NumberOperationHint kHint> struct SpeculativeToNumberOperator final - : public Operator1<NumberOperationHint> { + : public Operator1<NumberOperationParameters> { SpeculativeToNumberOperator() - : Operator1<NumberOperationHint>( - IrOpcode::kSpeculativeToNumber, // opcode - Operator::kFoldable | Operator::kNoThrow, // flags - "SpeculativeToNumber", // name - 1, 1, 1, 1, 1, 0, // counts - kHint) {} // parameter + : Operator1<NumberOperationParameters>( + IrOpcode::kSpeculativeToNumber, + Operator::kFoldable | Operator::kNoThrow, "SpeculativeToNumber", + 1, 1, 1, 1, 1, 0, + NumberOperationParameters(kHint, VectorSlotPair())) {} }; SpeculativeToNumberOperator<NumberOperationHint::kSignedSmall> kSpeculativeToNumberSignedSmallOperator; @@ -1032,6 +1089,7 @@ SimplifiedOperatorBuilder::SimplifiedOperatorBuilder(Zone* zone) #define GET_FROM_CACHE(Name, ...) \ const Operator* SimplifiedOperatorBuilder::Name() { return &cache_.k##Name; } PURE_OP_LIST(GET_FROM_CACHE) +EFFECT_DEPENDENT_OP_LIST(GET_FROM_CACHE) CHECKED_OP_LIST(GET_FROM_CACHE) GET_FROM_CACHE(ArrayBufferWasNeutered) GET_FROM_CACHE(ArgumentsFrame) @@ -1140,14 +1198,19 @@ const Operator* SimplifiedOperatorBuilder::CheckedTaggedToInt32( } const Operator* SimplifiedOperatorBuilder::CheckedTaggedToFloat64( - CheckTaggedInputMode mode) { - switch (mode) { - case CheckTaggedInputMode::kNumber: - return &cache_.kCheckedTaggedToFloat64NumberOperator; - case CheckTaggedInputMode::kNumberOrOddball: - return &cache_.kCheckedTaggedToFloat64NumberOrOddballOperator; + CheckTaggedInputMode mode, const VectorSlotPair& feedback) { + if (!feedback.IsValid()) { + switch (mode) { + case CheckTaggedInputMode::kNumber: + return &cache_.kCheckedTaggedToFloat64NumberOperator; + case CheckTaggedInputMode::kNumberOrOddball: + return &cache_.kCheckedTaggedToFloat64NumberOrOddballOperator; + } } - UNREACHABLE(); + return new (zone()) Operator1<CheckTaggedInputParameters>( + IrOpcode::kCheckedTaggedToFloat64, + Operator::kFoldable | Operator::kNoThrow, "CheckedTaggedToFloat64", 1, 1, + 1, 1, 1, 0, CheckTaggedInputParameters(mode, feedback)); } const Operator* SimplifiedOperatorBuilder::CheckedTruncateTaggedToWord32( @@ -1222,20 +1285,25 @@ const Operator* SimplifiedOperatorBuilder::CheckFloat64Hole( } const Operator* SimplifiedOperatorBuilder::SpeculativeToNumber( - NumberOperationHint hint) { - switch (hint) { - case NumberOperationHint::kSignedSmall: - return &cache_.kSpeculativeToNumberSignedSmallOperator; - case NumberOperationHint::kSignedSmallInputs: - break; - case NumberOperationHint::kSigned32: - return &cache_.kSpeculativeToNumberSigned32Operator; - case NumberOperationHint::kNumber: - return &cache_.kSpeculativeToNumberNumberOperator; - case NumberOperationHint::kNumberOrOddball: - return &cache_.kSpeculativeToNumberNumberOrOddballOperator; + NumberOperationHint hint, const VectorSlotPair& feedback) { + if (!feedback.IsValid()) { + switch (hint) { + case NumberOperationHint::kSignedSmall: + return &cache_.kSpeculativeToNumberSignedSmallOperator; + case NumberOperationHint::kSignedSmallInputs: + break; + case NumberOperationHint::kSigned32: + return &cache_.kSpeculativeToNumberSigned32Operator; + case NumberOperationHint::kNumber: + return &cache_.kSpeculativeToNumberNumberOperator; + case NumberOperationHint::kNumberOrOddball: + return &cache_.kSpeculativeToNumberNumberOrOddballOperator; + } } - UNREACHABLE(); + return new (zone()) Operator1<NumberOperationParameters>( + IrOpcode::kSpeculativeToNumber, Operator::kFoldable | Operator::kNoThrow, + "SpeculativeToNumber", 1, 1, 1, 1, 1, 0, + NumberOperationParameters(hint, feedback)); } const Operator* SimplifiedOperatorBuilder::EnsureWritableFastElements() { @@ -1378,6 +1446,28 @@ const Operator* SimplifiedOperatorBuilder::AllocateRaw( "AllocateRaw", 1, 1, 1, 1, 1, 1, AllocateParameters(type, pretenure)); } +const Operator* SimplifiedOperatorBuilder::StringCodePointAt( + UnicodeEncoding encoding) { + switch (encoding) { + case UnicodeEncoding::UTF16: + return &cache_.kStringCodePointAtOperatorUTF16; + case UnicodeEncoding::UTF32: + return &cache_.kStringCodePointAtOperatorUTF32; + } + UNREACHABLE(); +} + +const Operator* SimplifiedOperatorBuilder::SeqStringCodePointAt( + UnicodeEncoding encoding) { + switch (encoding) { + case UnicodeEncoding::UTF16: + return &cache_.kSeqStringCodePointAtOperatorUTF16; + case UnicodeEncoding::UTF32: + return &cache_.kSeqStringCodePointAtOperatorUTF32; + } + UNREACHABLE(); +} + const Operator* SimplifiedOperatorBuilder::StringFromCodePoint( UnicodeEncoding encoding) { switch (encoding) { @@ -1463,6 +1553,7 @@ const Operator* SimplifiedOperatorBuilder::TransitionAndStoreNonNumberElement( } #undef PURE_OP_LIST +#undef EFFECT_DEPENDENT_OP_LIST #undef SPECULATIVE_NUMBER_BINOP_LIST #undef CHECKED_WITH_FEEDBACK_OP_LIST #undef CHECKED_OP_LIST |