// Copyright (c) 2012, 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.
//
// We are using --complete-timeline below to ensure that we get timeline events
// generated during all phases of compilation and deoptimization.
// VMOptions=--optimization_counter_threshold=10 --no-use-osr --complete-timeline --no-background_compilation

// @dart = 2.9

import "package:expect/expect.dart";

test1(a, start, step, N) {
  var e;
  for (var i = 0; i < N; i++) {
    e = a[start + i * step];
  }
  return e;
}

test2(a, b) {
  var e;
  for (var i = 0, j = 0, k = 0; i < a.length; i++, j++, k++) {
    e = b[k] = a[j];
  }
  return e;
}

test3(a, b) {
  var e;
  for (var i = 0, j = 1, k = 0; i < a.length - 1; i++, j++, k++) {
    e = b[k] = a[j - 1];
  }
  return e;
}

test4(a, b) {
  var e;
  if (a.length < 2) {
    return null;
  }

  for (var i = 0, j = 1, k = 0; i < a.length - 1; i++, j++, k++) {
    e = b[k] = a[j - 1];
  }
  return e;
}

test5(a, b, k0) {
  var e;
  if (a.length < 2) {
    return null;
  }

  if (k0 > 1) {
    return null;
  }

  for (var i = 0, j = 1, k = 0; i < a.length - 1; i++, j++, k++) {
    e = b[k - k0] = a[j - 1];
  }
  return e;
}

test6(a, M, N) {
  var e = 0;
  for (var i = 0; i < N; i++) {
    for (var j = 0; j < M; j++) {
      e += a[i * M + j];
    }
  }
  return e;
}

main() {
  var a = const [0, 1, 2, 3, 4, 5, 6, 7];
  var b = new List(a.length);
  for (var i = 0; i < 10000; i++) {
    Expect.equals(a.last, test1(a, 0, 1, a.length));
    Expect.equals(a.last, test2(a, b));
    Expect.equals(a[a.length - 2], test3(a, b));
    Expect.equals(a[a.length - 2], test4(a, b));
    Expect.equals(a[a.length - 2], test5(a, b, 0));
    Expect.equals(6, test6(a, 2, 2));
  }

  test1(a, 0, 2, a.length ~/ 2);
  Expect.throws(() => test1(a, 1, 1, a.length));
  Expect.throws(() => test2(a, new List(a.length - 1)));
  Expect.throws(() => test6(a, 4, 3));
}
