content: /*
   * Copyright (C) 2014 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.
   */
  
  // Note that $opt$reg$ is a marker for the optimizing compiler to test
  // it does use its register allocator.
  
  public class Main {
    public static void main(String[] args) {
  
      expectEquals(4, $opt$reg$TestLostCopy());
      expectEquals(-10, $opt$reg$TestTwoLive());
      expectEquals(-20, $opt$reg$TestThreeLive());
      expectEquals(5, $opt$reg$TestFourLive());
      expectEquals(10, $opt$reg$TestMultipleLive());
      expectEquals(1, $opt$reg$TestWithBreakAndContinue());
      expectEquals(-15, $opt$reg$testSpillInIf(5, 6, 7));
      expectEquals(-567, $opt$reg$TestAgressiveLive1(1, 2, 3, 4, 5, 6, 7));
      expectEquals(-77, $opt$reg$TestAgressiveLive2(1, 2, 3, 4, 5, 6, 7));
    }
  
    public static int $opt$reg$TestLostCopy() {
      int a = 0;
      int b = 0;
      do {
        b = a;
        a++;
      } while (a != 5);
      return b;
    }
  
    public static int $opt$reg$TestTwoLive() {
      int a = 0;
      int b = 0;
      do {
        a++;
        b += 3;
      } while (a != 5);
      return a - b;
    }
  
    public static int $opt$reg$TestThreeLive() {
      int a = 0;
      int b = 0;
      int c = 0;
      do {
        a++;
        b += 3;
        c += 2;
      } while (a != 5);
      return a - b - c;
    }
  
    public static int $opt$reg$TestFourLive() {
      int a = 0;
      int b = 0;
      int c = 0;
      int d = 0;
      do {
        a++;
        b += 3;
        c += 2;
        d++;
      } while (a != 5);
      return d;
    }
  
    public static int $opt$reg$TestMultipleLive() {
      int a = 0;
      int b = 0;
      int c = 0;
      int d = 0;
      int e = 0;
      int f = 0;
      int g = 0;
      do {
        a++;
        b++;
        c++;
        d++;
        e += 3;
        f += 2;
        g += 2;
      } while (a != 5);
      return f;
    }
  
    public static int $opt$reg$TestWithBreakAndContinue() {
      int a = 0;
      int b = 0;
      do {
        a++;
        if (a == 2) {
          continue;
        }
        b++;
        if (a == 5) {
          break;
        }
      } while (true);
      return a - b;
    }
  
    public static int $opt$reg$testSpillInIf(int a, int b, int c) {
      int d = 0;
      int e = 0;
      if (a == 5) {
        b++;
        c++;
        d += 2;
        e += 3;
      }
  
      return a - b - c - d - e;
    }
  
    public static int $opt$reg$TestAgressiveLive1(int a, int b, int c, int d, int e, int f, int g) {
      int h = a - b;
      int i = c - d;
      int j = e - f;
      int k = 42 + g - a;
      do {
        b++;
        while (k != 1) {
          --k;
          ++i;
          if (i == 9) {
            ++i;
          }
          j += 5;
        }
        k = 9;
        h++;
      } while (h != 5);
      return a - b - c - d - e - f - g - h - i - j - k;
    }
  
    public static int $opt$reg$TestAgressiveLive2(int a, int b, int c, int d, int e, int f, int g) {
      int h = a - b;
      int i = c - d;
      int j = e - f;
      int k = 42 + g - a;
      do {
        h++;
      } while (h != 5);
      return a - b - c - d - e - f - g - h - i - j - k;
    }
  
    public static void expectEquals(int expected, int value) {
      if (expected != value) {
        throw new Error("Expected: " + expected + ", got: " + value);
      }
    }
  }
  