1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker // Note that $opt$reg$ is a marker for the optimizing compiler to test 18*795d594fSAndroid Build Coastguard Worker // it does use its register allocator. 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker public class Main { main(String[] args)21*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker expectEquals(4, $opt$reg$TestLostCopy()); 24*795d594fSAndroid Build Coastguard Worker expectEquals(-10, $opt$reg$TestTwoLive()); 25*795d594fSAndroid Build Coastguard Worker expectEquals(-20, $opt$reg$TestThreeLive()); 26*795d594fSAndroid Build Coastguard Worker expectEquals(5, $opt$reg$TestFourLive()); 27*795d594fSAndroid Build Coastguard Worker expectEquals(10, $opt$reg$TestMultipleLive()); 28*795d594fSAndroid Build Coastguard Worker expectEquals(1, $opt$reg$TestWithBreakAndContinue()); 29*795d594fSAndroid Build Coastguard Worker expectEquals(-15, $opt$reg$testSpillInIf(5, 6, 7)); 30*795d594fSAndroid Build Coastguard Worker expectEquals(-567, $opt$reg$TestAgressiveLive1(1, 2, 3, 4, 5, 6, 7)); 31*795d594fSAndroid Build Coastguard Worker expectEquals(-77, $opt$reg$TestAgressiveLive2(1, 2, 3, 4, 5, 6, 7)); 32*795d594fSAndroid Build Coastguard Worker } 33*795d594fSAndroid Build Coastguard Worker $opt$reg$TestLostCopy()34*795d594fSAndroid Build Coastguard Worker public static int $opt$reg$TestLostCopy() { 35*795d594fSAndroid Build Coastguard Worker int a = 0; 36*795d594fSAndroid Build Coastguard Worker int b = 0; 37*795d594fSAndroid Build Coastguard Worker do { 38*795d594fSAndroid Build Coastguard Worker b = a; 39*795d594fSAndroid Build Coastguard Worker a++; 40*795d594fSAndroid Build Coastguard Worker } while (a != 5); 41*795d594fSAndroid Build Coastguard Worker return b; 42*795d594fSAndroid Build Coastguard Worker } 43*795d594fSAndroid Build Coastguard Worker $opt$reg$TestTwoLive()44*795d594fSAndroid Build Coastguard Worker public static int $opt$reg$TestTwoLive() { 45*795d594fSAndroid Build Coastguard Worker int a = 0; 46*795d594fSAndroid Build Coastguard Worker int b = 0; 47*795d594fSAndroid Build Coastguard Worker do { 48*795d594fSAndroid Build Coastguard Worker a++; 49*795d594fSAndroid Build Coastguard Worker b += 3; 50*795d594fSAndroid Build Coastguard Worker } while (a != 5); 51*795d594fSAndroid Build Coastguard Worker return a - b; 52*795d594fSAndroid Build Coastguard Worker } 53*795d594fSAndroid Build Coastguard Worker $opt$reg$TestThreeLive()54*795d594fSAndroid Build Coastguard Worker public static int $opt$reg$TestThreeLive() { 55*795d594fSAndroid Build Coastguard Worker int a = 0; 56*795d594fSAndroid Build Coastguard Worker int b = 0; 57*795d594fSAndroid Build Coastguard Worker int c = 0; 58*795d594fSAndroid Build Coastguard Worker do { 59*795d594fSAndroid Build Coastguard Worker a++; 60*795d594fSAndroid Build Coastguard Worker b += 3; 61*795d594fSAndroid Build Coastguard Worker c += 2; 62*795d594fSAndroid Build Coastguard Worker } while (a != 5); 63*795d594fSAndroid Build Coastguard Worker return a - b - c; 64*795d594fSAndroid Build Coastguard Worker } 65*795d594fSAndroid Build Coastguard Worker $opt$reg$TestFourLive()66*795d594fSAndroid Build Coastguard Worker public static int $opt$reg$TestFourLive() { 67*795d594fSAndroid Build Coastguard Worker int a = 0; 68*795d594fSAndroid Build Coastguard Worker int b = 0; 69*795d594fSAndroid Build Coastguard Worker int c = 0; 70*795d594fSAndroid Build Coastguard Worker int d = 0; 71*795d594fSAndroid Build Coastguard Worker do { 72*795d594fSAndroid Build Coastguard Worker a++; 73*795d594fSAndroid Build Coastguard Worker b += 3; 74*795d594fSAndroid Build Coastguard Worker c += 2; 75*795d594fSAndroid Build Coastguard Worker d++; 76*795d594fSAndroid Build Coastguard Worker } while (a != 5); 77*795d594fSAndroid Build Coastguard Worker return d; 78*795d594fSAndroid Build Coastguard Worker } 79*795d594fSAndroid Build Coastguard Worker $opt$reg$TestMultipleLive()80*795d594fSAndroid Build Coastguard Worker public static int $opt$reg$TestMultipleLive() { 81*795d594fSAndroid Build Coastguard Worker int a = 0; 82*795d594fSAndroid Build Coastguard Worker int b = 0; 83*795d594fSAndroid Build Coastguard Worker int c = 0; 84*795d594fSAndroid Build Coastguard Worker int d = 0; 85*795d594fSAndroid Build Coastguard Worker int e = 0; 86*795d594fSAndroid Build Coastguard Worker int f = 0; 87*795d594fSAndroid Build Coastguard Worker int g = 0; 88*795d594fSAndroid Build Coastguard Worker do { 89*795d594fSAndroid Build Coastguard Worker a++; 90*795d594fSAndroid Build Coastguard Worker b++; 91*795d594fSAndroid Build Coastguard Worker c++; 92*795d594fSAndroid Build Coastguard Worker d++; 93*795d594fSAndroid Build Coastguard Worker e += 3; 94*795d594fSAndroid Build Coastguard Worker f += 2; 95*795d594fSAndroid Build Coastguard Worker g += 2; 96*795d594fSAndroid Build Coastguard Worker } while (a != 5); 97*795d594fSAndroid Build Coastguard Worker return f; 98*795d594fSAndroid Build Coastguard Worker } 99*795d594fSAndroid Build Coastguard Worker $opt$reg$TestWithBreakAndContinue()100*795d594fSAndroid Build Coastguard Worker public static int $opt$reg$TestWithBreakAndContinue() { 101*795d594fSAndroid Build Coastguard Worker int a = 0; 102*795d594fSAndroid Build Coastguard Worker int b = 0; 103*795d594fSAndroid Build Coastguard Worker do { 104*795d594fSAndroid Build Coastguard Worker a++; 105*795d594fSAndroid Build Coastguard Worker if (a == 2) { 106*795d594fSAndroid Build Coastguard Worker continue; 107*795d594fSAndroid Build Coastguard Worker } 108*795d594fSAndroid Build Coastguard Worker b++; 109*795d594fSAndroid Build Coastguard Worker if (a == 5) { 110*795d594fSAndroid Build Coastguard Worker break; 111*795d594fSAndroid Build Coastguard Worker } 112*795d594fSAndroid Build Coastguard Worker } while (true); 113*795d594fSAndroid Build Coastguard Worker return a - b; 114*795d594fSAndroid Build Coastguard Worker } 115*795d594fSAndroid Build Coastguard Worker $opt$reg$testSpillInIf(int a, int b, int c)116*795d594fSAndroid Build Coastguard Worker public static int $opt$reg$testSpillInIf(int a, int b, int c) { 117*795d594fSAndroid Build Coastguard Worker int d = 0; 118*795d594fSAndroid Build Coastguard Worker int e = 0; 119*795d594fSAndroid Build Coastguard Worker if (a == 5) { 120*795d594fSAndroid Build Coastguard Worker b++; 121*795d594fSAndroid Build Coastguard Worker c++; 122*795d594fSAndroid Build Coastguard Worker d += 2; 123*795d594fSAndroid Build Coastguard Worker e += 3; 124*795d594fSAndroid Build Coastguard Worker } 125*795d594fSAndroid Build Coastguard Worker 126*795d594fSAndroid Build Coastguard Worker return a - b - c - d - e; 127*795d594fSAndroid Build Coastguard Worker } 128*795d594fSAndroid Build Coastguard Worker $opt$reg$TestAgressiveLive1(int a, int b, int c, int d, int e, int f, int g)129*795d594fSAndroid Build Coastguard Worker public static int $opt$reg$TestAgressiveLive1(int a, int b, int c, int d, int e, int f, int g) { 130*795d594fSAndroid Build Coastguard Worker int h = a - b; 131*795d594fSAndroid Build Coastguard Worker int i = c - d; 132*795d594fSAndroid Build Coastguard Worker int j = e - f; 133*795d594fSAndroid Build Coastguard Worker int k = 42 + g - a; 134*795d594fSAndroid Build Coastguard Worker do { 135*795d594fSAndroid Build Coastguard Worker b++; 136*795d594fSAndroid Build Coastguard Worker while (k != 1) { 137*795d594fSAndroid Build Coastguard Worker --k; 138*795d594fSAndroid Build Coastguard Worker ++i; 139*795d594fSAndroid Build Coastguard Worker if (i == 9) { 140*795d594fSAndroid Build Coastguard Worker ++i; 141*795d594fSAndroid Build Coastguard Worker } 142*795d594fSAndroid Build Coastguard Worker j += 5; 143*795d594fSAndroid Build Coastguard Worker } 144*795d594fSAndroid Build Coastguard Worker k = 9; 145*795d594fSAndroid Build Coastguard Worker h++; 146*795d594fSAndroid Build Coastguard Worker } while (h != 5); 147*795d594fSAndroid Build Coastguard Worker return a - b - c - d - e - f - g - h - i - j - k; 148*795d594fSAndroid Build Coastguard Worker } 149*795d594fSAndroid Build Coastguard Worker $opt$reg$TestAgressiveLive2(int a, int b, int c, int d, int e, int f, int g)150*795d594fSAndroid Build Coastguard Worker public static int $opt$reg$TestAgressiveLive2(int a, int b, int c, int d, int e, int f, int g) { 151*795d594fSAndroid Build Coastguard Worker int h = a - b; 152*795d594fSAndroid Build Coastguard Worker int i = c - d; 153*795d594fSAndroid Build Coastguard Worker int j = e - f; 154*795d594fSAndroid Build Coastguard Worker int k = 42 + g - a; 155*795d594fSAndroid Build Coastguard Worker do { 156*795d594fSAndroid Build Coastguard Worker h++; 157*795d594fSAndroid Build Coastguard Worker } while (h != 5); 158*795d594fSAndroid Build Coastguard Worker return a - b - c - d - e - f - g - h - i - j - k; 159*795d594fSAndroid Build Coastguard Worker } 160*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int value)161*795d594fSAndroid Build Coastguard Worker public static void expectEquals(int expected, int value) { 162*795d594fSAndroid Build Coastguard Worker if (expected != value) { 163*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", got: " + value); 164*795d594fSAndroid Build Coastguard Worker } 165*795d594fSAndroid Build Coastguard Worker } 166*795d594fSAndroid Build Coastguard Worker } 167