// 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.
// Check that our SSA graph does have the try body a predecessor of a
// try/finally.
// VMOptions=--optimization-counter-threshold=10 --no-background-compilation

// @dart = 2.9

import "package:expect/expect.dart";

var a;

foo1() {
  var b = false;
  var entered = false;
  while (true) {
    if (entered) return b;
    b = 8 == a; // This expression should not be GVN'ed.
    try {
      a = 8;
      return false;
    } finally {
      b = 8 == a;
      entered = true;
      continue;
    }
  }
}

doThrow() {
  throw 2;
}

foo2() {
  var b = false;
  var entered = false;
  while (true) {
    if (entered) return b;
    b = 8 == a; // This expression should not be GVN'ed.
    try {
      a = 8;
      doThrow();
      return false;
    } catch (e) {
      b = 8 == a;
      entered = true;
      continue;
    }
  }
}

foo3() {
  var b = false;
  var entered = false;
  while (true) {
    if (entered) return b;
    b = 8 == a; // This expression should not be GVN'ed.
    try {
      doThrow();
    } catch (e) {
      a = 8;
      entered = true;
      return false;
    } finally {
      b = 8 == a;
      entered = true;
      continue;
    }
  }
}

foo4() {
  var b = false;
  var entered = false;
  while (true) {
    if (entered) return b;
    b = 8 == a; // This expression should not be GVN'ed.
    try {
      a = 8;
      break;
    } finally {
      b = 8 == a;
      entered = true;
      continue;
    }
  }
}

foo5() {
  var b = false;
  var entered = false;
  while (true) {
    if (entered) return b;
    b = 8 == a; // This expression should not be GVN'ed.
    try {
      a = 8;
      doThrow();
      break;
    } catch (e) {
      b = 8 == a;
      entered = true;
      continue;
    }
  }
}

foo6() {
  var b = false;
  var entered = false;
  while (true) {
    if (entered) return b;
    b = 8 == a; // This expression should not be GVN'ed.
    try {
      doThrow();
    } catch (e) {
      a = 8;
      entered = true;
      break;
    } finally {
      b = 8 == a;
      entered = true;
      continue;
    }
  }
}

foo7() {
  var b = false;
  var entered = false;
  while (true) {
    if (entered) return b;
    b = 8 == a; // This expression should not be GVN'ed.
    try {
      a = 8;
      continue;
    } finally {
      b = 8 == a;
      entered = true;
      continue;
    }
  }
}

foo8() {
  var b = false;
  var entered = false;
  while (true) {
    if (entered) return b;
    b = 8 == a; // This expression should not be GVN'ed.
    try {
      a = 8;
      doThrow();
      continue;
    } catch (e) {
      b = 8 == a;
      entered = true;
      continue;
    }
  }
}

foo9() {
  var b = false;
  var entered = false;
  while (true) {
    if (entered) return b;
    b = 8 == a; // This expression should not be GVN'ed.
    try {
      doThrow();
    } catch (e) {
      a = 8;
      entered = true;
      continue;
    } finally {
      b = 8 == a;
      entered = true;
      continue;
    }
  }
}

main_test() {
  a = 0;
  Expect.isTrue(foo1());
  a = 0;
  Expect.isTrue(foo2());
  a = 0;
  Expect.isTrue(foo3());
  a = 0;
  Expect.isTrue(foo4());
  a = 0;
  Expect.isTrue(foo5());
  a = 0;
  Expect.isTrue(foo6());
  a = 0;
  Expect.isTrue(foo7());
  a = 0;
  Expect.isTrue(foo8());
  a = 0;
  Expect.isTrue(foo9());
}

main() {
  for (var i = 0; i < 20; i++) {
    main_test();
  }
}
