/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/


public class Main {

  // CHECK-START: void Main.loop1(boolean) liveness (after)
  // CHECK:         ParameterValue (liveness: 2 ranges: { [2, 22) }, uses: { 17 22 }
  // CHECK:         Goto (liveness: 20)
  public static void loop1(boolean incoming) {
    while (incoming) {}
  }

  // CHECK-START: void Main.loop2(boolean) liveness (after)
  // CHECK:         ParameterValue (liveness: 2 ranges: { [2, 42) }, uses: { 33 38 42 }
  // CHECK:         Goto (liveness: 36)
  // CHECK:         Goto (liveness: 40)
  public static void loop2(boolean incoming) {
    while (true) {
      System.out.println("foo");
      while (incoming) {}
    }
  }

  // CHECK-START: void Main.loop3(boolean) liveness (after)
  // CHECK:         ParameterValue (liveness: 2 ranges: { [2, 60) }, uses: { 56 60 }
  // CHECK:         Goto (liveness: 58)

  // CHECK-START: void Main.loop3(boolean) liveness (after)
  // CHECK-NOT:     Goto (liveness: 54)
  public static void loop3(boolean incoming) {
    // 'incoming' only needs a use at the outer loop's back edge.
    while (System.currentTimeMillis() != 42) {
      while (Runtime.getRuntime() != null) {}
      System.out.println(incoming);
    }
  }

  // CHECK-START: void Main.loop4(boolean) liveness (after)
  // CHECK:         ParameterValue (liveness: 2 ranges: { [2, 22) }, uses: { 22 }

  // CHECK-START: void Main.loop4(boolean) liveness (after)
  // CHECK-NOT:     Goto (liveness: 20)
  public static void loop4(boolean incoming) {
    // 'incoming' has no loop use, so should not have back edge uses.
    System.out.println(incoming);
    while (System.currentTimeMillis() != 42) {
      while (Runtime.getRuntime() != null) {}
    }
  }

  // CHECK-START: void Main.loop5(boolean) liveness (after)
  // CHECK:         ParameterValue (liveness: 2 ranges: { [2, 50) }, uses: { 33 42 46 50 }
  // CHECK:         Goto (liveness: 44)
  // CHECK:         Goto (liveness: 48)
  public static void loop5(boolean incoming) {
    // 'incoming' must have a use at both back edges.
    while (Runtime.getRuntime() != null) {
      while (incoming) {
        System.out.println(incoming);
      }
    }
  }

  // CHECK-START: void Main.loop6(boolean) liveness (after)
  // CHECK          ParameterValue (liveness: 2 ranges: { [2, 46) }, uses: { 24 46 }
  // CHECK:         Goto (liveness: 44)

  // CHECK-START: void Main.loop6(boolean) liveness (after)
  // CHECK-NOT:     Goto (liveness: 22)
  public static void loop6(boolean incoming) {
    // 'incoming' must have a use only at the first loop's back edge.
    while (true) {
      System.out.println(incoming);
      while (Runtime.getRuntime() != null) {}
    }
  }

  // CHECK-START: void Main.loop7(boolean) liveness (after)
  // CHECK:         ParameterValue (liveness: 2 ranges: { [2, 50) }, uses: { 32 41 46 50 }
  // CHECK:         Goto (liveness: 44)
  // CHECK:         Goto (liveness: 48)
  public static void loop7(boolean incoming) {
    // 'incoming' must have a use at both back edges.
    while (Runtime.getRuntime() != null) {
      System.out.println(incoming);
      while (incoming) {}
    }
  }

  // CHECK-START: void Main.loop8() liveness (after)
  // CHECK:         StaticFieldGet (liveness: 12 ranges: { [12, 44) }, uses: { 35 40 44 }
  // CHECK:         Goto (liveness: 38)
  // CHECK:         Goto (liveness: 42)
  public static void loop8() {
    // 'incoming' must have a use at both back edges.
    boolean incoming = field;
    while (Runtime.getRuntime() != null) {
      while (incoming) {}
    }
  }

  // CHECK-START: void Main.loop9() liveness (after)
  // CHECK:         StaticFieldGet (liveness: 22 ranges: { [22, 36) }, uses: { 31 36 }
  // CHECK:         Goto (liveness: 38)
  public static void loop9() {
    while (Runtime.getRuntime() != null) {
      // 'incoming' must only have a use in the inner loop.
      boolean incoming = field;
      while (incoming) {}
    }
  }

  public static void main(String[] args) {
  }

  static boolean field;
}