1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2017 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 * 18*795d594fSAndroid Build Coastguard Worker * L: Break operator doesn't break one basic block limitation for int, 19*795d594fSAndroid Build Coastguard Worker * for some reasons (most probably not a bug), there are two basic blocks for long type, 20*795d594fSAndroid Build Coastguard Worker * 1 sinking expected for int, 0 for long. 21*795d594fSAndroid Build Coastguard Worker * M: no limitations on basic blocks number, 1 constant calculation sinking expected for 22*795d594fSAndroid Build Coastguard Worker * each method 23*795d594fSAndroid Build Coastguard Worker * 24*795d594fSAndroid Build Coastguard Worker **/ 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker public class Main { 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker final int iterations = 1100; 29*795d594fSAndroid Build Coastguard Worker assertIntEquals(int expected, int result)30*795d594fSAndroid Build Coastguard Worker public static void assertIntEquals(int expected, int result) { 31*795d594fSAndroid Build Coastguard Worker if (expected != result) { 32*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 33*795d594fSAndroid Build Coastguard Worker } 34*795d594fSAndroid Build Coastguard Worker } 35*795d594fSAndroid Build Coastguard Worker assertLongEquals(long expected, long result)36*795d594fSAndroid Build Coastguard Worker public static void assertLongEquals(long expected, long result) { 37*795d594fSAndroid Build Coastguard Worker if (expected != result) { 38*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 39*795d594fSAndroid Build Coastguard Worker } 40*795d594fSAndroid Build Coastguard Worker } 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker testLoopAddInt()43*795d594fSAndroid Build Coastguard Worker public int testLoopAddInt() { 44*795d594fSAndroid Build Coastguard Worker int testVar = 10000; 45*795d594fSAndroid Build Coastguard Worker int additionalVar = 10; 46*795d594fSAndroid Build Coastguard Worker 47*795d594fSAndroid Build Coastguard Worker outer: 48*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < iterations; i++) { 49*795d594fSAndroid Build Coastguard Worker additionalVar += i; 50*795d594fSAndroid Build Coastguard Worker for (int k = 0; k < iterations; k++) { 51*795d594fSAndroid Build Coastguard Worker additionalVar += k; 52*795d594fSAndroid Build Coastguard Worker testVar += 5; 53*795d594fSAndroid Build Coastguard Worker continue outer; 54*795d594fSAndroid Build Coastguard Worker } 55*795d594fSAndroid Build Coastguard Worker } 56*795d594fSAndroid Build Coastguard Worker assertIntEquals(testVar + additionalVar, 619960); 57*795d594fSAndroid Build Coastguard Worker return testVar + additionalVar; 58*795d594fSAndroid Build Coastguard Worker } 59*795d594fSAndroid Build Coastguard Worker testLoopSubInt()60*795d594fSAndroid Build Coastguard Worker public int testLoopSubInt() { 61*795d594fSAndroid Build Coastguard Worker int testVar = 10000; 62*795d594fSAndroid Build Coastguard Worker int additionalVar = 10; 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Worker outer: 65*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < iterations; i++) { 66*795d594fSAndroid Build Coastguard Worker additionalVar += i; 67*795d594fSAndroid Build Coastguard Worker for (int k = 0; k < iterations; k++) { 68*795d594fSAndroid Build Coastguard Worker additionalVar += k; 69*795d594fSAndroid Build Coastguard Worker testVar -= 5; 70*795d594fSAndroid Build Coastguard Worker continue outer; 71*795d594fSAndroid Build Coastguard Worker } 72*795d594fSAndroid Build Coastguard Worker } 73*795d594fSAndroid Build Coastguard Worker assertIntEquals(testVar + additionalVar, 608960); 74*795d594fSAndroid Build Coastguard Worker return testVar + additionalVar; 75*795d594fSAndroid Build Coastguard Worker } 76*795d594fSAndroid Build Coastguard Worker testLoopSubLong()77*795d594fSAndroid Build Coastguard Worker public long testLoopSubLong() { 78*795d594fSAndroid Build Coastguard Worker long testVar = 10000; 79*795d594fSAndroid Build Coastguard Worker long additionalVar = 10; 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Worker outer: 82*795d594fSAndroid Build Coastguard Worker for (long i = 0; i < iterations; i++) { 83*795d594fSAndroid Build Coastguard Worker additionalVar += i; 84*795d594fSAndroid Build Coastguard Worker for (long k = 0; k < iterations; k++) { 85*795d594fSAndroid Build Coastguard Worker additionalVar += k; 86*795d594fSAndroid Build Coastguard Worker testVar -= 5; 87*795d594fSAndroid Build Coastguard Worker continue outer; 88*795d594fSAndroid Build Coastguard Worker } 89*795d594fSAndroid Build Coastguard Worker } 90*795d594fSAndroid Build Coastguard Worker assertLongEquals(testVar + additionalVar, 608960); 91*795d594fSAndroid Build Coastguard Worker return testVar + additionalVar; 92*795d594fSAndroid Build Coastguard Worker } 93*795d594fSAndroid Build Coastguard Worker testLoopMulInt(int n)94*795d594fSAndroid Build Coastguard Worker public int testLoopMulInt(int n) { 95*795d594fSAndroid Build Coastguard Worker int testVar = 1; 96*795d594fSAndroid Build Coastguard Worker int additionalVar = 10; 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker outer: 99*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 3; i++) { 100*795d594fSAndroid Build Coastguard Worker additionalVar += i + n * 2; 101*795d594fSAndroid Build Coastguard Worker for (int k = 0; k < 5; k++) { 102*795d594fSAndroid Build Coastguard Worker additionalVar += k + n + k % 3 - i % 2 + n % 4 - i % 5 103*795d594fSAndroid Build Coastguard Worker + (k + 2) / 7 - (i - 5) / 3 + k * 3 - k / 2; 104*795d594fSAndroid Build Coastguard Worker testVar *= 6; 105*795d594fSAndroid Build Coastguard Worker continue outer; 106*795d594fSAndroid Build Coastguard Worker } 107*795d594fSAndroid Build Coastguard Worker } 108*795d594fSAndroid Build Coastguard Worker assertIntEquals(testVar + additionalVar, 324); 109*795d594fSAndroid Build Coastguard Worker return testVar + additionalVar; 110*795d594fSAndroid Build Coastguard Worker } 111*795d594fSAndroid Build Coastguard Worker testLoopMulLong(long n)112*795d594fSAndroid Build Coastguard Worker public long testLoopMulLong(long n) { 113*795d594fSAndroid Build Coastguard Worker long testVar = 1; 114*795d594fSAndroid Build Coastguard Worker long additionalVar = 10; 115*795d594fSAndroid Build Coastguard Worker 116*795d594fSAndroid Build Coastguard Worker outer: 117*795d594fSAndroid Build Coastguard Worker for (long i = 0; i < 5; i++) { 118*795d594fSAndroid Build Coastguard Worker additionalVar += i + n; 119*795d594fSAndroid Build Coastguard Worker for (long k = 0; k < 5; k++) { 120*795d594fSAndroid Build Coastguard Worker additionalVar += k + n + k % 3 - i % 2 + n % 4 - i % 5 121*795d594fSAndroid Build Coastguard Worker + (k + 2) / 7 - (i - 5) / 3 + k * 3 - k / 2; 122*795d594fSAndroid Build Coastguard Worker testVar *= 6L; 123*795d594fSAndroid Build Coastguard Worker continue outer; 124*795d594fSAndroid Build Coastguard Worker } 125*795d594fSAndroid Build Coastguard Worker } 126*795d594fSAndroid Build Coastguard Worker assertLongEquals(testVar + additionalVar, 7897); 127*795d594fSAndroid Build Coastguard Worker return testVar + additionalVar; 128*795d594fSAndroid Build Coastguard Worker } 129*795d594fSAndroid Build Coastguard Worker testLoopDivInt()130*795d594fSAndroid Build Coastguard Worker public int testLoopDivInt() { 131*795d594fSAndroid Build Coastguard Worker int testVar = 10000; 132*795d594fSAndroid Build Coastguard Worker int additionalVar = 10; 133*795d594fSAndroid Build Coastguard Worker 134*795d594fSAndroid Build Coastguard Worker outer: 135*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < iterations; i++) { 136*795d594fSAndroid Build Coastguard Worker additionalVar += i; 137*795d594fSAndroid Build Coastguard Worker for (int k = 0; k < iterations; k++) { 138*795d594fSAndroid Build Coastguard Worker additionalVar += k; 139*795d594fSAndroid Build Coastguard Worker testVar /= 5; 140*795d594fSAndroid Build Coastguard Worker continue outer; 141*795d594fSAndroid Build Coastguard Worker } 142*795d594fSAndroid Build Coastguard Worker } 143*795d594fSAndroid Build Coastguard Worker assertIntEquals(testVar + additionalVar, 604460); 144*795d594fSAndroid Build Coastguard Worker return testVar + additionalVar; 145*795d594fSAndroid Build Coastguard Worker } 146*795d594fSAndroid Build Coastguard Worker testLoopDivLong()147*795d594fSAndroid Build Coastguard Worker public long testLoopDivLong() { 148*795d594fSAndroid Build Coastguard Worker long testVar = 10000; 149*795d594fSAndroid Build Coastguard Worker long additionalVar = 10; 150*795d594fSAndroid Build Coastguard Worker 151*795d594fSAndroid Build Coastguard Worker outer: 152*795d594fSAndroid Build Coastguard Worker for (long i = 0; i < iterations; i++) { 153*795d594fSAndroid Build Coastguard Worker additionalVar += i; 154*795d594fSAndroid Build Coastguard Worker for (long k = 0; k < iterations; k++) { 155*795d594fSAndroid Build Coastguard Worker additionalVar += k; 156*795d594fSAndroid Build Coastguard Worker testVar /= 5; 157*795d594fSAndroid Build Coastguard Worker continue outer; 158*795d594fSAndroid Build Coastguard Worker } 159*795d594fSAndroid Build Coastguard Worker } 160*795d594fSAndroid Build Coastguard Worker assertLongEquals(testVar + additionalVar, 604460); 161*795d594fSAndroid Build Coastguard Worker return testVar + additionalVar; 162*795d594fSAndroid Build Coastguard Worker } 163*795d594fSAndroid Build Coastguard Worker testLoopRemInt()164*795d594fSAndroid Build Coastguard Worker public int testLoopRemInt() { 165*795d594fSAndroid Build Coastguard Worker int testVar = 10000; 166*795d594fSAndroid Build Coastguard Worker int additionalVar = 10; 167*795d594fSAndroid Build Coastguard Worker 168*795d594fSAndroid Build Coastguard Worker outer: 169*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < iterations; i++) { 170*795d594fSAndroid Build Coastguard Worker additionalVar += i; 171*795d594fSAndroid Build Coastguard Worker for (int k = 0; k < iterations; k++) { 172*795d594fSAndroid Build Coastguard Worker additionalVar += k; 173*795d594fSAndroid Build Coastguard Worker testVar %= 5; 174*795d594fSAndroid Build Coastguard Worker continue outer; 175*795d594fSAndroid Build Coastguard Worker } 176*795d594fSAndroid Build Coastguard Worker } 177*795d594fSAndroid Build Coastguard Worker assertIntEquals(testVar + additionalVar, 604460); 178*795d594fSAndroid Build Coastguard Worker return testVar + additionalVar; 179*795d594fSAndroid Build Coastguard Worker } 180*795d594fSAndroid Build Coastguard Worker testLoopRemLong()181*795d594fSAndroid Build Coastguard Worker public long testLoopRemLong() { 182*795d594fSAndroid Build Coastguard Worker long testVar = 10000; 183*795d594fSAndroid Build Coastguard Worker long additionalVar = 10; 184*795d594fSAndroid Build Coastguard Worker 185*795d594fSAndroid Build Coastguard Worker outer: 186*795d594fSAndroid Build Coastguard Worker for (long i = 0; i < iterations; i++) { 187*795d594fSAndroid Build Coastguard Worker additionalVar += i; 188*795d594fSAndroid Build Coastguard Worker for (long k = 0; k < iterations; k++) { 189*795d594fSAndroid Build Coastguard Worker additionalVar += k; 190*795d594fSAndroid Build Coastguard Worker testVar %= 5; 191*795d594fSAndroid Build Coastguard Worker continue outer; 192*795d594fSAndroid Build Coastguard Worker } 193*795d594fSAndroid Build Coastguard Worker } 194*795d594fSAndroid Build Coastguard Worker assertLongEquals(testVar + additionalVar, 604460); 195*795d594fSAndroid Build Coastguard Worker return testVar + additionalVar; 196*795d594fSAndroid Build Coastguard Worker } 197*795d594fSAndroid Build Coastguard Worker testLoopAddLong()198*795d594fSAndroid Build Coastguard Worker public long testLoopAddLong() { 199*795d594fSAndroid Build Coastguard Worker long testVar = 10000; 200*795d594fSAndroid Build Coastguard Worker long additionalVar = 10; 201*795d594fSAndroid Build Coastguard Worker 202*795d594fSAndroid Build Coastguard Worker outer: 203*795d594fSAndroid Build Coastguard Worker for (long i = 0; i < iterations; i++) { 204*795d594fSAndroid Build Coastguard Worker additionalVar += i; 205*795d594fSAndroid Build Coastguard Worker for (long k = 0; k < iterations; k++) { 206*795d594fSAndroid Build Coastguard Worker additionalVar += k; 207*795d594fSAndroid Build Coastguard Worker testVar += 5; 208*795d594fSAndroid Build Coastguard Worker continue outer; 209*795d594fSAndroid Build Coastguard Worker } 210*795d594fSAndroid Build Coastguard Worker } 211*795d594fSAndroid Build Coastguard Worker assertLongEquals(testVar + additionalVar, 619960); 212*795d594fSAndroid Build Coastguard Worker return testVar + additionalVar; 213*795d594fSAndroid Build Coastguard Worker } 214*795d594fSAndroid Build Coastguard Worker main(String[] args)215*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 216*795d594fSAndroid Build Coastguard Worker Main obj = new Main(); 217*795d594fSAndroid Build Coastguard Worker obj.testLoopAddInt(); 218*795d594fSAndroid Build Coastguard Worker obj.testLoopAddLong(); 219*795d594fSAndroid Build Coastguard Worker obj.testLoopRemLong(); 220*795d594fSAndroid Build Coastguard Worker obj.testLoopRemInt(); 221*795d594fSAndroid Build Coastguard Worker obj.testLoopDivLong(); 222*795d594fSAndroid Build Coastguard Worker obj.testLoopDivInt(); 223*795d594fSAndroid Build Coastguard Worker obj.testLoopMulLong(10); 224*795d594fSAndroid Build Coastguard Worker obj.testLoopMulInt(10); 225*795d594fSAndroid Build Coastguard Worker obj.testLoopSubLong(); 226*795d594fSAndroid Build Coastguard Worker obj.testLoopSubInt(); 227*795d594fSAndroid Build Coastguard Worker } 228*795d594fSAndroid Build Coastguard Worker 229*795d594fSAndroid Build Coastguard Worker } 230