// Copyright 2020 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 --no-always-opt


// smi == boolean
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(2, true));
  assertTrue(foo(1, true));
  assertTrue(foo(0, false));
  assertFalse(foo(2, false));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(2, true));
  assertTrue(foo(1, true));
  assertTrue(foo(0, false));
  assertFalse(foo(2, false));
  assertOptimized(foo);

  assertFalse(foo(0, null));
  assertUnoptimized(foo);
})();


// boolean == smi
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(true, 2));
  assertTrue(foo(true, 1));
  assertTrue(foo(false, 0));
  assertFalse(foo(false, 2));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(true, 2));
  assertTrue(foo(true, 1));
  assertTrue(foo(false, 0));
  assertFalse(foo(false, 2));
  assertOptimized(foo);

  assertFalse(foo(null, 0));
  assertUnoptimized(foo);
})();


// smi == undefined
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(2, undefined));
  assertFalse(foo(0, undefined));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(2, undefined));
  assertFalse(foo(0, undefined));
  assertOptimized(foo);
})();


// undefined == smi
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(undefined, 2));
  assertFalse(foo(undefined, 0));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(undefined, 2));
  assertFalse(foo(undefined, 0));
  assertOptimized(foo);
})();


// smi == null
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(2, null));
  assertFalse(foo(0, null));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(2, null));
  assertFalse(foo(0, null));
  assertOptimized(foo);
})();


// null == smi
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(null, 2));
  assertFalse(foo(null, 0));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(null, 2));
  assertFalse(foo(null, 0));
  assertOptimized(foo);
})();


// smi == oddball
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(2, null));
  assertFalse(foo(0, undefined));
  assertFalse(foo(0, true));
  assertTrue(foo(1, true));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(2, null));
  assertFalse(foo(0, undefined));
  assertFalse(foo(0, true));
  assertTrue(foo(1, true));
  assertOptimized(foo);
})();


// oddball == smi
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(null, 2));
  assertFalse(foo(undefined, 0));
  assertFalse(foo(true, 0));
  assertTrue(foo(true, 1));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(null, 2));
  assertFalse(foo(undefined, 0));
  assertFalse(foo(true, 0));
  assertTrue(foo(true, 1));
  assertOptimized(foo);
})();


// number == boolean
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(-2.8, true));
  assertTrue(foo(1, true));
  assertTrue(foo(-0.0, false));
  assertFalse(foo(2, false));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(-2.8, true));
  assertTrue(foo(1, true));
  assertTrue(foo(-0.0, false));
  assertFalse(foo(2, false));
  assertOptimized(foo);

  assertFalse(foo(0, null));
  assertUnoptimized(foo);
})();


// boolean == number
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(true, -2.8));
  assertTrue(foo(true, 1));
  assertTrue(foo(false, -0.0));
  assertFalse(foo(false, 2));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(true, -2.8));
  assertTrue(foo(true, 1));
  assertTrue(foo(false, -0.0));
  assertFalse(foo(false, 2));
  assertOptimized(foo);

  assertFalse(foo(null, 0));
  assertUnoptimized(foo);
})();


// number == undefined
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(-2.8, undefined));
  assertFalse(foo(-0.0, undefined));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(-2.8, undefined));
  assertFalse(foo(-0.0, undefined));
  assertOptimized(foo);
})();


// undefined == number
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(undefined, -2.8));
  assertFalse(foo(undefined, -0.0));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(undefined, -2.8));
  assertFalse(foo(undefined, -0.0));
  assertOptimized(foo);
})();


// number == null
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(-2.8, null));
  assertFalse(foo(-0.0, null));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(-2.8, null));
  assertFalse(foo(-0.0, null));
  assertOptimized(foo);
})();


// null == number
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(null, -2.8));
  assertFalse(foo(null, -0.0));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(null, -2.8));
  assertFalse(foo(null, -0.0));
  assertOptimized(foo);
})();


// number == oddball
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(-2.8, null));
  assertFalse(foo(-0.0, undefined));
  assertFalse(foo(0, true));
  assertTrue(foo(1.0, true));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(-2.8, null));
  assertFalse(foo(-0.0, undefined));
  assertFalse(foo(0, true));
  assertTrue(foo(1.0, true));
  assertOptimized(foo);
})();


// oddball == number
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(null, -2.8));
  assertFalse(foo(undefined, -0.0));
  assertFalse(foo(true, 0));
  assertTrue(foo(true, 1.0));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(null, -2.8));
  assertFalse(foo(undefined, -0.0));
  assertFalse(foo(true, 0));
  assertTrue(foo(true, 1.0));
  assertOptimized(foo);
})();


// oddball == oddball
(function() {
  function foo(a, b) { return a == b; }

  %PrepareFunctionForOptimization(foo);
  assertTrue(foo(null, null));
  assertTrue(foo(undefined, undefined));
  assertTrue(foo(false, false));
  assertTrue(foo(true, true));
  assertTrue(foo(undefined, null));
  assertFalse(foo(undefined, false));
  assertFalse(foo(null, false));
  assertFalse(foo(true, undefined));
  assertFalse(foo(true, null));
  assertFalse(foo(true, false));

  %OptimizeFunctionOnNextCall(foo);
  assertTrue(foo(null, null));
  assertOptimized(foo);
  assertTrue(foo(undefined, undefined));
  assertTrue(foo(false, false));
  assertTrue(foo(true, true));
  assertTrue(foo(undefined, null));
  assertFalse(foo(undefined, false));
  assertFalse(foo(null, false));
  assertFalse(foo(true, undefined));
  assertFalse(foo(true, null));
  assertFalse(foo(true, false));
  assertOptimized(foo);
})();
