| 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);
 | 
|    }
 | 
| 
 |