| Index: src/compiler/js-typed-lowering.cc
|
| diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
|
| index 58d7facbbfdb4829686f5958a6d8060f0a466f22..1c7127dbc23ad6d59d4855e8eec372b3883771ce 100644
|
| --- a/src/compiler/js-typed-lowering.cc
|
| +++ b/src/compiler/js-typed-lowering.cc
|
| @@ -70,12 +70,23 @@ class JSBinopReduction final {
|
| case CompareOperationHint::kAny:
|
| case CompareOperationHint::kNone:
|
| case CompareOperationHint::kString:
|
| + case CompareOperationHint::kInternalizedString:
|
| break;
|
| }
|
| }
|
| return false;
|
| }
|
|
|
| + bool IsInternalizedStringCompareOperation() {
|
| + if (lowering_->flags() & JSTypedLowering::kDeoptimizationEnabled) {
|
| + DCHECK_EQ(1, node_->op()->EffectOutputCount());
|
| + return (CompareOperationHintOf(node_->op()) ==
|
| + CompareOperationHint::kInternalizedString) &&
|
| + BothInputsMaybe(Type::InternalizedString());
|
| + }
|
| + return false;
|
| + }
|
| +
|
| // Check if a string addition will definitely result in creating a ConsString,
|
| // i.e. if the combined length of the resulting string exceeds the ConsString
|
| // minimum length.
|
| @@ -104,6 +115,25 @@ class JSBinopReduction final {
|
| return false;
|
| }
|
|
|
| + // Checks that both inputs are InternalizedString, and if we don't know
|
| + // statically that one side is already an InternalizedString, insert a
|
| + // CheckInternalizedString node.
|
| + void CheckInputsToInternalizedString() {
|
| + if (!left_type()->Is(Type::UniqueName())) {
|
| + Node* left_input = graph()->NewNode(
|
| + simplified()->CheckInternalizedString(), left(), effect(), control());
|
| + node_->ReplaceInput(0, left_input);
|
| + update_effect(left_input);
|
| + }
|
| + if (!right_type()->Is(Type::UniqueName())) {
|
| + Node* right_input =
|
| + graph()->NewNode(simplified()->CheckInternalizedString(), right(),
|
| + effect(), control());
|
| + node_->ReplaceInput(1, right_input);
|
| + update_effect(right_input);
|
| + }
|
| + }
|
| +
|
| void ConvertInputsToNumber() {
|
| // To convert the inputs to numbers, we have to provide frame states
|
| // for lazy bailouts in the ToNumber conversions.
|
| @@ -317,6 +347,10 @@ class JSBinopReduction final {
|
|
|
| bool BothInputsAre(Type* t) { return LeftInputIs(t) && RightInputIs(t); }
|
|
|
| + bool BothInputsMaybe(Type* t) {
|
| + return left_type()->Maybe(t) && right_type()->Maybe(t);
|
| + }
|
| +
|
| bool OneInputCannotBe(Type* t) {
|
| return !left_type()->Maybe(t) || !right_type()->Maybe(t);
|
| }
|
| @@ -851,6 +885,13 @@ Reduction JSTypedLowering::ReduceJSEqual(Node* node, bool invert) {
|
|
|
| JSBinopReduction r(this, node);
|
|
|
| + if (r.BothInputsAre(Type::UniqueName())) {
|
| + return r.ChangeToPureOperator(simplified()->ReferenceEqual(), invert);
|
| + }
|
| + if (r.IsInternalizedStringCompareOperation()) {
|
| + r.CheckInputsToInternalizedString();
|
| + return r.ChangeToPureOperator(simplified()->ReferenceEqual(), invert);
|
| + }
|
| if (r.BothInputsAre(Type::String())) {
|
| return r.ChangeToPureOperator(simplified()->StringEqual(), invert);
|
| }
|
| @@ -934,6 +975,10 @@ Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node, bool invert) {
|
| if (r.BothInputsAre(Type::Unique())) {
|
| return r.ChangeToPureOperator(simplified()->ReferenceEqual(), invert);
|
| }
|
| + if (r.IsInternalizedStringCompareOperation()) {
|
| + r.CheckInputsToInternalizedString();
|
| + return r.ChangeToPureOperator(simplified()->ReferenceEqual(), invert);
|
| + }
|
| if (r.BothInputsAre(Type::String())) {
|
| return r.ChangeToPureOperator(simplified()->StringEqual(), invert);
|
| }
|
|
|