1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2016 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 * Tests on bounds check elimination in loops that use intrinsics. 19*795d594fSAndroid Build Coastguard Worker * All bounds checks below should be statically eliminated. 20*795d594fSAndroid Build Coastguard Worker */ 21*795d594fSAndroid Build Coastguard Worker public class Main { 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.oneArray(int[]) BCE (before) 24*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop:B\d+>> outer_loop:none 25*795d594fSAndroid Build Coastguard Worker // 26*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.oneArray(int[]) BCE (after) 27*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 28*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize oneArray(int[] a)29*795d594fSAndroid Build Coastguard Worker static int oneArray(int[] a) { 30*795d594fSAndroid Build Coastguard Worker int x = 0; 31*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length; i++) { 32*795d594fSAndroid Build Coastguard Worker x += a[i]; 33*795d594fSAndroid Build Coastguard Worker } 34*795d594fSAndroid Build Coastguard Worker return x; 35*795d594fSAndroid Build Coastguard Worker } 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.oneArrayAbs(int[], int[]) BCE (before) 38*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop:B\d+>> outer_loop:none 39*795d594fSAndroid Build Coastguard Worker // 40*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.oneArrayAbs(int[], int[]) BCE (after) 41*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 42*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize oneArrayAbs(int[] a, int[] b)43*795d594fSAndroid Build Coastguard Worker static int oneArrayAbs(int[] a, int[] b) { 44*795d594fSAndroid Build Coastguard Worker int x = 0; 45*795d594fSAndroid Build Coastguard Worker for (int i = Math.abs(b.length); i < a.length; i++) { 46*795d594fSAndroid Build Coastguard Worker x += a[i]; 47*795d594fSAndroid Build Coastguard Worker } 48*795d594fSAndroid Build Coastguard Worker return x; 49*795d594fSAndroid Build Coastguard Worker } 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.twoArrays(int[], int[]) BCE (before) 53*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop:B\d+>> outer_loop:none 54*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop>> outer_loop:none 55*795d594fSAndroid Build Coastguard Worker // 56*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.twoArrays(int[], int[]) BCE (after) 57*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 58*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize twoArrays(int[] a, int[] b)59*795d594fSAndroid Build Coastguard Worker static int twoArrays(int[] a, int[] b) { 60*795d594fSAndroid Build Coastguard Worker int x = 0; 61*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < Math.min(a.length, b.length); i++) { 62*795d594fSAndroid Build Coastguard Worker x += a[i] + b[i]; 63*795d594fSAndroid Build Coastguard Worker } 64*795d594fSAndroid Build Coastguard Worker return x; 65*795d594fSAndroid Build Coastguard Worker } 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.threeArrays(int[], int[], int[]) BCE (before) 68*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop:B\d+>> outer_loop:none 69*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop>> outer_loop:none 70*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop>> outer_loop:none 71*795d594fSAndroid Build Coastguard Worker // 72*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.threeArrays(int[], int[], int[]) BCE (after) 73*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 74*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize threeArrays(int[] a, int[] b, int[] c)75*795d594fSAndroid Build Coastguard Worker static int threeArrays(int[] a, int[] b, int[] c) { 76*795d594fSAndroid Build Coastguard Worker int x = 0; 77*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < Math.min(Math.min(a.length, b.length), c.length); i++) { 78*795d594fSAndroid Build Coastguard Worker x += a[i] + b[i] + c[i]; 79*795d594fSAndroid Build Coastguard Worker } 80*795d594fSAndroid Build Coastguard Worker return x; 81*795d594fSAndroid Build Coastguard Worker } 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.fourArrays(int[], int[], int[], int[]) BCE (before) 84*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop:B\d+>> outer_loop:none 85*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop>> outer_loop:none 86*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop>> outer_loop:none 87*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop>> outer_loop:none 88*795d594fSAndroid Build Coastguard Worker // 89*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.fourArrays(int[], int[], int[], int[]) BCE (after) 90*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 91*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize fourArrays(int[] a, int[] b, int[] c, int[] d)92*795d594fSAndroid Build Coastguard Worker static int fourArrays(int[] a, int[] b, int[] c, int[] d) { 93*795d594fSAndroid Build Coastguard Worker int x = 0; 94*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < Math.min(Math.min(a.length, b.length), Math.min(c.length, d.length)); i++) { 95*795d594fSAndroid Build Coastguard Worker x += a[i] + b[i] + c[i] + d[i]; 96*795d594fSAndroid Build Coastguard Worker } 97*795d594fSAndroid Build Coastguard Worker return x; 98*795d594fSAndroid Build Coastguard Worker } 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.oneArrayWithCleanup(int[]) BCE (before) 101*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop1:B\d+>> outer_loop:none 102*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop2:B\d+>> outer_loop:none 103*795d594fSAndroid Build Coastguard Worker // 104*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 105*795d594fSAndroid Build Coastguard Worker // 106*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.oneArrayWithCleanup(int[]) BCE (after) 107*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 108*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize oneArrayWithCleanup(int[] a)109*795d594fSAndroid Build Coastguard Worker static int oneArrayWithCleanup(int[] a) { 110*795d594fSAndroid Build Coastguard Worker int x = 0; 111*795d594fSAndroid Build Coastguard Worker int n = Math.min(4, a.length); 112*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < n; i++) { 113*795d594fSAndroid Build Coastguard Worker x += a[i]; 114*795d594fSAndroid Build Coastguard Worker } 115*795d594fSAndroid Build Coastguard Worker for (int i = n; i < a.length; i++) { 116*795d594fSAndroid Build Coastguard Worker x += a[i] * 10; 117*795d594fSAndroid Build Coastguard Worker } 118*795d594fSAndroid Build Coastguard Worker return x; 119*795d594fSAndroid Build Coastguard Worker } 120*795d594fSAndroid Build Coastguard Worker 121*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.twoArraysWithCleanup(int[], int[]) BCE (before) 122*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop1:B\d+>> outer_loop:none 123*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop1>> outer_loop:none 124*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop2:B\d+>> outer_loop:none 125*795d594fSAndroid Build Coastguard Worker // 126*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 127*795d594fSAndroid Build Coastguard Worker // 128*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.twoArraysWithCleanup(int[], int[]) BCE (after) 129*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 130*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize twoArraysWithCleanup(int[] a, int[] b)131*795d594fSAndroid Build Coastguard Worker static int twoArraysWithCleanup(int[] a, int[] b) { 132*795d594fSAndroid Build Coastguard Worker int x = 0; 133*795d594fSAndroid Build Coastguard Worker int n = Math.min(a.length, b.length); 134*795d594fSAndroid Build Coastguard Worker for (int i = n - 1; i >= 0; i--) { 135*795d594fSAndroid Build Coastguard Worker x += a[i] + b[i]; 136*795d594fSAndroid Build Coastguard Worker } 137*795d594fSAndroid Build Coastguard Worker for (int i = n; i < a.length; i++) { 138*795d594fSAndroid Build Coastguard Worker x += a[i]; 139*795d594fSAndroid Build Coastguard Worker } 140*795d594fSAndroid Build Coastguard Worker return x; 141*795d594fSAndroid Build Coastguard Worker } 142*795d594fSAndroid Build Coastguard Worker 143*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.threeArraysWithCleanup(int[], int[], int[]) BCE (before) 144*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop1:B\d+>> outer_loop:none 145*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop1>> outer_loop:none 146*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop1>> outer_loop:none 147*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop2:B\d+>> outer_loop:none 148*795d594fSAndroid Build Coastguard Worker // 149*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 150*795d594fSAndroid Build Coastguard Worker // 151*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.threeArraysWithCleanup(int[], int[], int[]) BCE (after) 152*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 153*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize threeArraysWithCleanup(int[] a, int[] b, int[] c)154*795d594fSAndroid Build Coastguard Worker static int threeArraysWithCleanup(int[] a, int[] b, int[] c) { 155*795d594fSAndroid Build Coastguard Worker int x = 0; 156*795d594fSAndroid Build Coastguard Worker int n = Math.min(a.length, Math.min(b.length, c.length)); 157*795d594fSAndroid Build Coastguard Worker for (int i = n - 1; i >= 0; i--) { 158*795d594fSAndroid Build Coastguard Worker x += a[i] + b[i] + c[i]; 159*795d594fSAndroid Build Coastguard Worker } 160*795d594fSAndroid Build Coastguard Worker for (int i = n; i < a.length; i++) { 161*795d594fSAndroid Build Coastguard Worker x += a[i]; 162*795d594fSAndroid Build Coastguard Worker } 163*795d594fSAndroid Build Coastguard Worker return x; 164*795d594fSAndroid Build Coastguard Worker } 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.altLoopLogic(int[], int[]) BCE (before) 167*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop:B\d+>> outer_loop:none 168*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop>> outer_loop:none 169*795d594fSAndroid Build Coastguard Worker // 170*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.altLoopLogic(int[], int[]) BCE (after) 171*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 172*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize altLoopLogic(int[] a, int[] b)173*795d594fSAndroid Build Coastguard Worker static int altLoopLogic(int[] a, int[] b) { 174*795d594fSAndroid Build Coastguard Worker int x = 0; 175*795d594fSAndroid Build Coastguard Worker int n = Math.min(a.length, b.length); 176*795d594fSAndroid Build Coastguard Worker for (int i = n; i-- > 0;) { 177*795d594fSAndroid Build Coastguard Worker x += a[i] + b[i]; 178*795d594fSAndroid Build Coastguard Worker } 179*795d594fSAndroid Build Coastguard Worker return x; 180*795d594fSAndroid Build Coastguard Worker } 181*795d594fSAndroid Build Coastguard Worker 182*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.hiddenMin(int[], int[]) BCE (before) 183*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop:B\d+>> outer_loop:none 184*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop>> outer_loop:none 185*795d594fSAndroid Build Coastguard Worker // 186*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.hiddenMin(int[], int[]) BCE (after) 187*795d594fSAndroid Build Coastguard Worker // 188*795d594fSAndroid Build Coastguard Worker // TODO: make this so hiddenMin(int[] a, int[] b)189*795d594fSAndroid Build Coastguard Worker static int hiddenMin(int[] a, int[] b) { 190*795d594fSAndroid Build Coastguard Worker int x = 0; 191*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length && i < b.length; i++) { 192*795d594fSAndroid Build Coastguard Worker x += a[i] + b[i]; 193*795d594fSAndroid Build Coastguard Worker } 194*795d594fSAndroid Build Coastguard Worker return x; 195*795d594fSAndroid Build Coastguard Worker } 196*795d594fSAndroid Build Coastguard Worker 197*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.hiddenMinWithCleanup(int[], int[]) BCE (before) 198*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop1:B\d+>> outer_loop:none 199*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop1>> outer_loop:none 200*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck loop:<<Loop2:B\d+>> outer_loop:none 201*795d594fSAndroid Build Coastguard Worker // 202*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 203*795d594fSAndroid Build Coastguard Worker // 204*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.hiddenMinWithCleanup(int[], int[]) BCE (after) 205*795d594fSAndroid Build Coastguard Worker // 206*795d594fSAndroid Build Coastguard Worker // TODO: make this so hiddenMinWithCleanup(int[] a, int[] b)207*795d594fSAndroid Build Coastguard Worker static int hiddenMinWithCleanup(int[] a, int[] b) { 208*795d594fSAndroid Build Coastguard Worker int x = 0; 209*795d594fSAndroid Build Coastguard Worker int i = 0; 210*795d594fSAndroid Build Coastguard Worker for (; i < a.length && i < b.length; i++) { 211*795d594fSAndroid Build Coastguard Worker x += a[i] + b[i]; 212*795d594fSAndroid Build Coastguard Worker } 213*795d594fSAndroid Build Coastguard Worker for (; i < a.length; i++) { 214*795d594fSAndroid Build Coastguard Worker x += a[i]; 215*795d594fSAndroid Build Coastguard Worker } 216*795d594fSAndroid Build Coastguard Worker return x; 217*795d594fSAndroid Build Coastguard Worker } 218*795d594fSAndroid Build Coastguard Worker main(String[] args)219*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 220*795d594fSAndroid Build Coastguard Worker int[] a = { 1, 2, 3, 4, 5 }; 221*795d594fSAndroid Build Coastguard Worker int[] b = { 6, 7, 8, 9, 4, 2 }; 222*795d594fSAndroid Build Coastguard Worker int[] c = { 1, 2, 3 }; 223*795d594fSAndroid Build Coastguard Worker int[] d = { 8, 5, 3, 2 }; 224*795d594fSAndroid Build Coastguard Worker int[] e = { }; 225*795d594fSAndroid Build Coastguard Worker 226*795d594fSAndroid Build Coastguard Worker expectEquals(15, oneArray(a)); 227*795d594fSAndroid Build Coastguard Worker expectEquals(36, oneArray(b)); 228*795d594fSAndroid Build Coastguard Worker expectEquals(6, oneArray(c)); 229*795d594fSAndroid Build Coastguard Worker expectEquals(18, oneArray(d)); 230*795d594fSAndroid Build Coastguard Worker 231*795d594fSAndroid Build Coastguard Worker expectEquals(15, oneArrayAbs(a, e)); 232*795d594fSAndroid Build Coastguard Worker expectEquals(5, oneArrayAbs(a, d)); 233*795d594fSAndroid Build Coastguard Worker 234*795d594fSAndroid Build Coastguard Worker expectEquals(30, twoArrays(a, a)); 235*795d594fSAndroid Build Coastguard Worker expectEquals(49, twoArrays(a, b)); 236*795d594fSAndroid Build Coastguard Worker expectEquals(12, twoArrays(a, c)); 237*795d594fSAndroid Build Coastguard Worker expectEquals(28, twoArrays(a, d)); 238*795d594fSAndroid Build Coastguard Worker 239*795d594fSAndroid Build Coastguard Worker expectEquals(45, threeArrays(a, a, a)); 240*795d594fSAndroid Build Coastguard Worker expectEquals(33, threeArrays(a, b, c)); 241*795d594fSAndroid Build Coastguard Worker expectEquals(58, threeArrays(a, b, d)); 242*795d594fSAndroid Build Coastguard Worker expectEquals(28, threeArrays(a, c, d)); 243*795d594fSAndroid Build Coastguard Worker 244*795d594fSAndroid Build Coastguard Worker expectEquals(60, fourArrays(a, a, a, a)); 245*795d594fSAndroid Build Coastguard Worker expectEquals(49, fourArrays(a, b, c, d)); 246*795d594fSAndroid Build Coastguard Worker 247*795d594fSAndroid Build Coastguard Worker expectEquals(60, oneArrayWithCleanup(a)); 248*795d594fSAndroid Build Coastguard Worker expectEquals(90, oneArrayWithCleanup(b)); 249*795d594fSAndroid Build Coastguard Worker expectEquals(6, oneArrayWithCleanup(c)); 250*795d594fSAndroid Build Coastguard Worker expectEquals(18, oneArrayWithCleanup(d)); 251*795d594fSAndroid Build Coastguard Worker 252*795d594fSAndroid Build Coastguard Worker expectEquals(30, twoArraysWithCleanup(a, a)); 253*795d594fSAndroid Build Coastguard Worker expectEquals(49, twoArraysWithCleanup(a, b)); 254*795d594fSAndroid Build Coastguard Worker expectEquals(21, twoArraysWithCleanup(a, c)); 255*795d594fSAndroid Build Coastguard Worker expectEquals(33, twoArraysWithCleanup(a, d)); 256*795d594fSAndroid Build Coastguard Worker 257*795d594fSAndroid Build Coastguard Worker expectEquals(45, threeArraysWithCleanup(a, a, a)); 258*795d594fSAndroid Build Coastguard Worker expectEquals(42, threeArraysWithCleanup(a, b, c)); 259*795d594fSAndroid Build Coastguard Worker expectEquals(63, threeArraysWithCleanup(a, b, d)); 260*795d594fSAndroid Build Coastguard Worker expectEquals(37, threeArraysWithCleanup(a, c, d)); 261*795d594fSAndroid Build Coastguard Worker 262*795d594fSAndroid Build Coastguard Worker expectEquals(30, altLoopLogic(a, a)); 263*795d594fSAndroid Build Coastguard Worker expectEquals(49, altLoopLogic(a, b)); 264*795d594fSAndroid Build Coastguard Worker expectEquals(12, altLoopLogic(a, c)); 265*795d594fSAndroid Build Coastguard Worker expectEquals(28, altLoopLogic(a, d)); 266*795d594fSAndroid Build Coastguard Worker 267*795d594fSAndroid Build Coastguard Worker expectEquals(30, hiddenMin(a, a)); 268*795d594fSAndroid Build Coastguard Worker expectEquals(49, hiddenMin(a, b)); 269*795d594fSAndroid Build Coastguard Worker expectEquals(12, hiddenMin(a, c)); 270*795d594fSAndroid Build Coastguard Worker expectEquals(28, hiddenMin(a, d)); 271*795d594fSAndroid Build Coastguard Worker 272*795d594fSAndroid Build Coastguard Worker expectEquals(30, hiddenMinWithCleanup(a, a)); 273*795d594fSAndroid Build Coastguard Worker expectEquals(49, hiddenMinWithCleanup(a, b)); 274*795d594fSAndroid Build Coastguard Worker expectEquals(21, hiddenMinWithCleanup(a, c)); 275*795d594fSAndroid Build Coastguard Worker expectEquals(33, hiddenMinWithCleanup(a, d)); 276*795d594fSAndroid Build Coastguard Worker 277*795d594fSAndroid Build Coastguard Worker System.out.println("passed"); 278*795d594fSAndroid Build Coastguard Worker } 279*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)280*795d594fSAndroid Build Coastguard Worker private static void expectEquals(int expected, int result) { 281*795d594fSAndroid Build Coastguard Worker if (expected != result) { 282*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 283*795d594fSAndroid Build Coastguard Worker } 284*795d594fSAndroid Build Coastguard Worker } 285*795d594fSAndroid Build Coastguard Worker } 286