text: // Copyright 2018 the V8 project authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  // Flags: --allow-natives-syntax --opt --noalways-opt
  
  // Known receivers abstract equality.
  (function() {
    const a = {};
    const b = {};
  
    function foo() { return a == b; }
  
    %PrepareFunctionForOptimization(foo);
    assertFalse(foo());
    assertFalse(foo());
    %OptimizeFunctionOnNextCall(foo);
    assertFalse(foo());
  })();
  
  // Known receiver/null abstract equality.
  (function() {
    const a = {};
    const b = null;
  
    function foo() { return a == b; }
  
    %PrepareFunctionForOptimization(foo);
    assertFalse(foo());
    assertFalse(foo());
    %OptimizeFunctionOnNextCall(foo);
    assertFalse(foo());
  })();
  
  // Known null/receiver abstract equality.
  (function() {
    const a = null;
    const b = {};
  
    function foo() { return a == b; }
  
    %PrepareFunctionForOptimization(foo);
    assertFalse(foo());
    assertFalse(foo());
    %OptimizeFunctionOnNextCall(foo);
    assertFalse(foo());
  })();
  
  // Known receiver/undefined abstract equality.
  (function() {
    const a = {};
    const b = undefined;
  
    function foo() { return a == b; }
  
    %PrepareFunctionForOptimization(foo);
    assertFalse(foo());
    assertFalse(foo());
    %OptimizeFunctionOnNextCall(foo);
    assertFalse(foo());
  })();
  
  // Known undefined/receiver abstract equality.
  (function() {
    const a = undefined;
    const b = {};
  
    function foo() { return a == b; }
  
    %PrepareFunctionForOptimization(foo);
    assertFalse(foo());
    assertFalse(foo());
    %OptimizeFunctionOnNextCall(foo);
    assertFalse(foo());
  })();
  
  // Known receiver on one side strict equality.
  (function() {
    const a = {};
    const b = {};
  
    function foo(a) { return a == b; }
  
    %PrepareFunctionForOptimization(foo);
    assertTrue(foo(b));
    assertFalse(foo(a));
    assertTrue(foo(b));
    assertFalse(foo(a));
    %OptimizeFunctionOnNextCall(foo);
    assertTrue(foo(b));
    assertFalse(foo(a));
  
    // TurboFan bakes in feedback for the (unknown) left hand side.
    assertFalse(foo(null));
    assertUnoptimized(foo);
  })();
  
  // Known receiver on one side strict equality with null.
  (function() {
    const a = null;
    const b = {};
  
    function foo(a) { return a == b; }
  
    %PrepareFunctionForOptimization(foo);
    assertTrue(foo(b));
    assertFalse(foo(a));
    assertTrue(foo(b));
    assertFalse(foo(a));
    %OptimizeFunctionOnNextCall(foo);
    assertTrue(foo(b));
    assertFalse(foo(a));
  
    // TurboFan bakes in feedback for the (unknown) left hand side.
    assertFalse(foo(1));
    assertUnoptimized(foo);
  })();
  
  // Known receiver on one side strict equality with undefined.
  (function() {
    const a = undefined;
    const b = {};
  
    function foo(a) { return a == b; }
  
    %PrepareFunctionForOptimization(foo);
    assertTrue(foo(b));
    assertFalse(foo(a));
    assertTrue(foo(b));
    assertFalse(foo(a));
    %OptimizeFunctionOnNextCall(foo);
    assertTrue(foo(b));
    assertFalse(foo(a));
  
    // TurboFan bakes in feedback for the (unknown) left hand side.
    assertFalse(foo(1));
    assertUnoptimized(foo);
  })();
  
  // Known null on one side strict equality with receiver.
  (function() {
    const a = {};
    const b = null;
  
    function foo(a) { return a == b; }
  
    %PrepareFunctionForOptimization(foo);
    assertTrue(foo(b));
    assertFalse(foo(a));
    assertTrue(foo(b));
    assertFalse(foo(a));
    %OptimizeFunctionOnNextCall(foo);
    assertTrue(foo(b));
    assertFalse(foo(a));
    assertTrue(foo(null));
    assertTrue(foo(undefined));
    assertOptimized(foo);
  
    // TurboFan doesn't need to bake in feedback, since it sees the null.
    assertFalse(foo(1));
    assertOptimized(foo);
  })();
  
  // Known undefined on one side strict equality with receiver.
  (function() {
    const a = {};
    const b = undefined;
  
    function foo(a) { return a == b; }
  
    %PrepareFunctionForOptimization(foo);
    assertTrue(foo(b));
    assertFalse(foo(a));
    assertTrue(foo(b));
    assertFalse(foo(a));
    %OptimizeFunctionOnNextCall(foo);
    assertTrue(foo(b));
    assertFalse(foo(a));
    assertTrue(foo(null));
    assertTrue(foo(undefined));
    assertOptimized(foo);
  
    // TurboFan needs to bake in feedback, since undefined cannot
    // be context specialized.
    assertFalse(foo(1));
    assertUnoptimized(foo);
  })();
  