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.cc181
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