/*
 * 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$TestAggressiveLive1(1, 2, 3, 4, 5, 6, 7));
        expectEquals(-77, $opt$reg$TestAggressiveLive2(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$TestAggressiveLive1(
            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$TestAggressiveLive2(
            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);
        }
    }
}
