// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Dart test program to test cid guessing optimizations.
// VMOptions=--optimization-counter-threshold=10 --no-background-compilation

// @dart = 2.9

import "package:expect/expect.dart";

main() {
  // Warmup optimizes methods.
  for (int i = 0; i < 100; i++) {
    Expect.equals(i, compareInt(i));
    Expect.equals(i.toDouble(), compareDouble(i.toDouble()));
    Expect.equals(i, binOpInt(i, i));
    Expect.equals(i.toDouble(), binOpDouble(i.toDouble(), i.toDouble()));
  }
  Expect.equals(3, compareInt(3));
  Expect.equals(-2, compareInt(-2));
  Expect.equals(0, compareInt(-1));

  Expect.equals(3, binOpInt(3, 3));
  Expect.equals(0, binOpInt(-2, -2));

  Expect.equals(3.0, binOpDouble(3.0, 3.0));
  Expect.equals(0.0, binOpDouble(-2.0, -2.0));

  Expect.equals(3.0, compareDouble(3.0));
  Expect.equals(-2.0, compareDouble(-2.0));
  Expect.equals(0.0, compareDouble(-1.0));

  testOSR();
}

int compareInt(int i) {
  if (i < 0) {
    // Not visited in before optimization.
    // Guess cid of comparison below.
    if (i == -1) return 0;
  }
  return i;
}

double compareDouble(double i) {
  if (i < 0.0) {
    // Not visited in before optimization.
    // Guess cid of comparison below.
    if (i == -1.0) return 0.0;
  }
  return i;
}

int binOpInt(int i, int x) {
  if (i < 0) {
    // Not visited in before optimization.
    // Guess cid of binary operation below.
    return x + 2;
  }
  return i;
}

double binOpDouble(double i, double x) {
  if (i < 0.0) {
    // Not visited in before optimization.
    // Guess cid of binary operation below.
    return x + 2.0;
  }
  return i;
}

testOSR() {
  // Foul up  IC data in integer's unary minus.
  var y = -0x80000000;
  Expect.equals(
      (0x7fffffffffffffff + 2) * 10, testLoop(10, 0x7fffffffffffffff));
  // Second time no deoptimization can occur, since runtime feedback has been collected.
  Expect.equals(
      (0x7fffffffffffffff + 2) * 10, testLoop(10, 0x7fffffffffffffff));
}

testLoop(N, x) {
  for (int i = 0; i < N; ++i) {
    // Will trigger OSR. Operation in loop below will use guessed cids.
  }
  int sum = 0;
  for (int i = 0; i < N; ++i) {
    // Guess 'x' is Smi, but is actually Mint: deoptimize.
    sum += x + 2;
  }
  return sum;
}
