1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2015 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 import java.util.Arrays; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker public class Main { 20*795d594fSAndroid Build Coastguard Worker 21*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.sieve(int) BCE (before) 22*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 23*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 24*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 25*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 26*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 27*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.sieve(int) BCE (after) 30*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 31*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 32*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 33*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 34*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 35*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 36*795d594fSAndroid Build Coastguard Worker sieve(int size)37*795d594fSAndroid Build Coastguard Worker static int sieve(int size) { 38*795d594fSAndroid Build Coastguard Worker int primeCount = 0; 39*795d594fSAndroid Build Coastguard Worker boolean[] flags = new boolean[size + 1]; 40*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < size; i++) flags[i] = true; // Can eliminate. 41*795d594fSAndroid Build Coastguard Worker for (int i = 2; i < size; i++) { 42*795d594fSAndroid Build Coastguard Worker if (flags[i]) { // Can eliminate. 43*795d594fSAndroid Build Coastguard Worker primeCount++; 44*795d594fSAndroid Build Coastguard Worker for (int k = i + 1; k <= size; k += i) 45*795d594fSAndroid Build Coastguard Worker flags[k - 1] = false; // Can't eliminate yet due to (k+i) may overflow. 46*795d594fSAndroid Build Coastguard Worker } 47*795d594fSAndroid Build Coastguard Worker } 48*795d594fSAndroid Build Coastguard Worker return primeCount; 49*795d594fSAndroid Build Coastguard Worker } 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.narrow(int[], int) BCE (before) 53*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 54*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 55*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 56*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 57*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 58*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 59*795d594fSAndroid Build Coastguard Worker 60*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.narrow(int[], int) BCE (after) 61*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 62*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 63*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 64*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 65*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 66*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 67*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 68*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 69*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 70*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 71*795d594fSAndroid Build Coastguard Worker narrow(int[] array, int offset)72*795d594fSAndroid Build Coastguard Worker static void narrow(int[] array, int offset) { 73*795d594fSAndroid Build Coastguard Worker if (offset < 0) { 74*795d594fSAndroid Build Coastguard Worker return; 75*795d594fSAndroid Build Coastguard Worker } 76*795d594fSAndroid Build Coastguard Worker if (offset < array.length) { 77*795d594fSAndroid Build Coastguard Worker // offset is in range [0, array.length-1]. 78*795d594fSAndroid Build Coastguard Worker // Bounds check can be eliminated. 79*795d594fSAndroid Build Coastguard Worker array[offset] = 1; 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Worker int biased_offset1 = offset + 1; 82*795d594fSAndroid Build Coastguard Worker // biased_offset1 is in range [1, array.length]. 83*795d594fSAndroid Build Coastguard Worker if (biased_offset1 < array.length) { 84*795d594fSAndroid Build Coastguard Worker // biased_offset1 is in range [1, array.length-1]. 85*795d594fSAndroid Build Coastguard Worker // Bounds check can be eliminated. 86*795d594fSAndroid Build Coastguard Worker array[biased_offset1] = 1; 87*795d594fSAndroid Build Coastguard Worker } 88*795d594fSAndroid Build Coastguard Worker 89*795d594fSAndroid Build Coastguard Worker int biased_offset2 = offset + 0x70000000; 90*795d594fSAndroid Build Coastguard Worker // biased_offset2 is in range [0x70000000, array.length-1+0x70000000]. 91*795d594fSAndroid Build Coastguard Worker // It may overflow and be negative. 92*795d594fSAndroid Build Coastguard Worker if (biased_offset2 < array.length) { 93*795d594fSAndroid Build Coastguard Worker // Even with this test, biased_offset2 can be negative so we can't 94*795d594fSAndroid Build Coastguard Worker // eliminate this bounds check. 95*795d594fSAndroid Build Coastguard Worker array[biased_offset2] = 1; 96*795d594fSAndroid Build Coastguard Worker } 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker // offset_sub1 won't underflow since offset is no less than 0. 99*795d594fSAndroid Build Coastguard Worker int offset_sub1 = offset - Integer.MAX_VALUE; 100*795d594fSAndroid Build Coastguard Worker if (offset_sub1 >= 0) { 101*795d594fSAndroid Build Coastguard Worker array[offset_sub1] = 1; // Bounds check can be eliminated. 102*795d594fSAndroid Build Coastguard Worker } 103*795d594fSAndroid Build Coastguard Worker 104*795d594fSAndroid Build Coastguard Worker // offset_sub2 can underflow. 105*795d594fSAndroid Build Coastguard Worker int offset_sub2 = offset_sub1 - Integer.MAX_VALUE; 106*795d594fSAndroid Build Coastguard Worker if (offset_sub2 >= 0) { 107*795d594fSAndroid Build Coastguard Worker array[offset_sub2] = 1; // Bounds check can't be eliminated. 108*795d594fSAndroid Build Coastguard Worker } 109*795d594fSAndroid Build Coastguard Worker } 110*795d594fSAndroid Build Coastguard Worker } 111*795d594fSAndroid Build Coastguard Worker 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing1(int[]) BCE (before) 114*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 115*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 116*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 117*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing1(int[]) BCE (after) 120*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 121*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 122*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 123*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 124*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 125*795d594fSAndroid Build Coastguard Worker constantIndexing1(int[] array)126*795d594fSAndroid Build Coastguard Worker static void constantIndexing1(int[] array) { 127*795d594fSAndroid Build Coastguard Worker // Decreasing order: bc for 5 but not for 4. 128*795d594fSAndroid Build Coastguard Worker array[5] = 11; 129*795d594fSAndroid Build Coastguard Worker array[4] = 11; 130*795d594fSAndroid Build Coastguard Worker } 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Worker 133*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$opt$noinline$constantIndexing2(int[]) BCE (before) 134*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 135*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 136*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 137*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 138*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 139*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 140*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 141*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 142*795d594fSAndroid Build Coastguard Worker 143*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$opt$noinline$constantIndexing2(int[]) BCE (after) 144*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 145*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 146*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 147*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 148*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 149*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 150*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 151*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 152*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 153*795d594fSAndroid Build Coastguard Worker $opt$noinline$constantIndexing2(int[] array)154*795d594fSAndroid Build Coastguard Worker static void $opt$noinline$constantIndexing2(int[] array) { 155*795d594fSAndroid Build Coastguard Worker array[1] = 1; 156*795d594fSAndroid Build Coastguard Worker array[2] = 1; 157*795d594fSAndroid Build Coastguard Worker array[3] = 1; 158*795d594fSAndroid Build Coastguard Worker array[4] = 1; 159*795d594fSAndroid Build Coastguard Worker if (array[1] != 1) { 160*795d594fSAndroid Build Coastguard Worker throw new Error(""); 161*795d594fSAndroid Build Coastguard Worker } 162*795d594fSAndroid Build Coastguard Worker } 163*795d594fSAndroid Build Coastguard Worker 164*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing2b(int[]) BCE (before) 165*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 166*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 167*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 168*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 169*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 170*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 171*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 172*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 173*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 174*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 175*795d594fSAndroid Build Coastguard Worker 176*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing2b(int[]) BCE (after) 177*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 178*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 179*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 180*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 181*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 182*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 183*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 184*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 185*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 186*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 187*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 188*795d594fSAndroid Build Coastguard Worker constantIndexing2b(int[] array)189*795d594fSAndroid Build Coastguard Worker static void constantIndexing2b(int[] array) { 190*795d594fSAndroid Build Coastguard Worker array[0] = 6; 191*795d594fSAndroid Build Coastguard Worker array[1] = 6; 192*795d594fSAndroid Build Coastguard Worker array[2] = 6; 193*795d594fSAndroid Build Coastguard Worker array[3] = 6; 194*795d594fSAndroid Build Coastguard Worker array[-1] = 1; // prevents the whole opt on [-1:4] 195*795d594fSAndroid Build Coastguard Worker } 196*795d594fSAndroid Build Coastguard Worker 197*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing2c(int[]) BCE (before) 198*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 199*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 200*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 201*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 202*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 203*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 204*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 205*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 206*795d594fSAndroid Build Coastguard Worker 207*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing2c(int[]) BCE (after) 208*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 209*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 210*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 211*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 212*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 213*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 214*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 215*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 216*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 217*795d594fSAndroid Build Coastguard Worker constantIndexing2c(int[] array)218*795d594fSAndroid Build Coastguard Worker static void constantIndexing2c(int[] array) { 219*795d594fSAndroid Build Coastguard Worker array[0] = 7; 220*795d594fSAndroid Build Coastguard Worker array[1] = 7; 221*795d594fSAndroid Build Coastguard Worker array[2] = 7; 222*795d594fSAndroid Build Coastguard Worker array[3] = 7; 223*795d594fSAndroid Build Coastguard Worker } 224*795d594fSAndroid Build Coastguard Worker 225*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int[] Main.constantIndexing3(int[], int[], boolean) BCE (before) 226*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 227*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 228*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 229*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 230*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 231*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 232*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 233*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 234*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 235*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 236*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 237*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 238*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 239*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 240*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 241*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 242*795d594fSAndroid Build Coastguard Worker 243*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int[] Main.constantIndexing3(int[], int[], boolean) BCE (after) 244*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 245*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 246*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 247*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 248*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 249*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 250*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 251*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 252*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 253*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 254*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 255*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 256*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 257*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 258*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 259*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 260*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 261*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 262*795d594fSAndroid Build Coastguard Worker constantIndexing3(int[] array1, int[] array2, boolean copy)263*795d594fSAndroid Build Coastguard Worker static int[] constantIndexing3(int[] array1, int[] array2, boolean copy) { 264*795d594fSAndroid Build Coastguard Worker if (!copy) { 265*795d594fSAndroid Build Coastguard Worker return array1; 266*795d594fSAndroid Build Coastguard Worker } 267*795d594fSAndroid Build Coastguard Worker array2[0] = array1[0]; 268*795d594fSAndroid Build Coastguard Worker array2[1] = array1[1]; 269*795d594fSAndroid Build Coastguard Worker array2[2] = array1[2]; 270*795d594fSAndroid Build Coastguard Worker array2[3] = array1[3]; 271*795d594fSAndroid Build Coastguard Worker return array2; 272*795d594fSAndroid Build Coastguard Worker } 273*795d594fSAndroid Build Coastguard Worker 274*795d594fSAndroid Build Coastguard Worker 275*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing4(int[]) BCE (before) 276*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 277*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 278*795d594fSAndroid Build Coastguard Worker 279*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing4(int[]) BCE (after) 280*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 281*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 282*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 283*795d594fSAndroid Build Coastguard Worker 284*795d594fSAndroid Build Coastguard Worker // There is only one array access. It's not beneficial 285*795d594fSAndroid Build Coastguard Worker // to create a compare with deoptimization instruction. constantIndexing4(int[] array)286*795d594fSAndroid Build Coastguard Worker static void constantIndexing4(int[] array) { 287*795d594fSAndroid Build Coastguard Worker array[0] = -1; 288*795d594fSAndroid Build Coastguard Worker } 289*795d594fSAndroid Build Coastguard Worker 290*795d594fSAndroid Build Coastguard Worker 291*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing5(int[]) BCE (before) 292*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 293*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 294*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 295*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 296*795d594fSAndroid Build Coastguard Worker 297*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing5(int[]) BCE (after) 298*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 299*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 300*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 301*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 302*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 303*795d594fSAndroid Build Coastguard Worker constantIndexing5(int[] array)304*795d594fSAndroid Build Coastguard Worker static void constantIndexing5(int[] array) { 305*795d594fSAndroid Build Coastguard Worker // We don't apply the deoptimization for very large constant index 306*795d594fSAndroid Build Coastguard Worker // since it's likely to be an anomaly and will throw AIOOBE. 307*795d594fSAndroid Build Coastguard Worker array[Integer.MAX_VALUE - 1000] = 1; 308*795d594fSAndroid Build Coastguard Worker array[Integer.MAX_VALUE - 999] = 1; 309*795d594fSAndroid Build Coastguard Worker array[Integer.MAX_VALUE - 998] = 1; 310*795d594fSAndroid Build Coastguard Worker } 311*795d594fSAndroid Build Coastguard Worker 312*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing6(int[]) BCE (before) 313*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 314*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 315*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 316*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 317*795d594fSAndroid Build Coastguard Worker 318*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing6(int[]) BCE (after) 319*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 320*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 321*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 322*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 323*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 324*795d594fSAndroid Build Coastguard Worker constantIndexing6(int[] array)325*795d594fSAndroid Build Coastguard Worker static void constantIndexing6(int[] array) { 326*795d594fSAndroid Build Coastguard Worker array[3] = 111; 327*795d594fSAndroid Build Coastguard Worker array[4] = 111; 328*795d594fSAndroid Build Coastguard Worker } 329*795d594fSAndroid Build Coastguard Worker 330*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing7(int[], int) BCE (before) 331*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 332*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 333*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 334*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 335*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 336*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 337*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 338*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 339*795d594fSAndroid Build Coastguard Worker 340*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing7(int[], int) BCE (after) 341*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 342*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 343*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 344*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 345*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 346*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 347*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 348*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 349*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 350*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 351*795d594fSAndroid Build Coastguard Worker constantIndexing7(int[] array, int base)352*795d594fSAndroid Build Coastguard Worker static void constantIndexing7(int[] array, int base) { 353*795d594fSAndroid Build Coastguard Worker // With constant offsets to symbolic base. 354*795d594fSAndroid Build Coastguard Worker array[base] = 10; 355*795d594fSAndroid Build Coastguard Worker array[base + 1] = 20; 356*795d594fSAndroid Build Coastguard Worker array[base + 2] = 30; 357*795d594fSAndroid Build Coastguard Worker array[base + 3] = 40; 358*795d594fSAndroid Build Coastguard Worker } 359*795d594fSAndroid Build Coastguard Worker 360*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing8(int[], int) BCE (before) 361*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 362*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 363*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 364*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 365*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 366*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 367*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 368*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 369*795d594fSAndroid Build Coastguard Worker 370*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing8(int[], int) BCE (after) 371*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 372*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 373*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 374*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 375*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 376*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 377*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 378*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 379*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 380*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 381*795d594fSAndroid Build Coastguard Worker constantIndexing8(int[] array, int base)382*795d594fSAndroid Build Coastguard Worker static void constantIndexing8(int[] array, int base) { 383*795d594fSAndroid Build Coastguard Worker // With constant offsets "both ways" to symbolic base. 384*795d594fSAndroid Build Coastguard Worker array[base - 1] = 100; 385*795d594fSAndroid Build Coastguard Worker array[base] = 200; 386*795d594fSAndroid Build Coastguard Worker array[base + 1] = 300; 387*795d594fSAndroid Build Coastguard Worker array[base + 2] = 400; 388*795d594fSAndroid Build Coastguard Worker } 389*795d594fSAndroid Build Coastguard Worker 390*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing9(int[], int) BCE (before) 391*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 392*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 393*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 394*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 395*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 396*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 397*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 398*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 399*795d594fSAndroid Build Coastguard Worker 400*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing9(int[], int) BCE (after) 401*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 402*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 403*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 404*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 405*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 406*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 407*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 408*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 409*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 410*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 411*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 412*795d594fSAndroid Build Coastguard Worker constantIndexing9(int[] array, int base)413*795d594fSAndroid Build Coastguard Worker static void constantIndexing9(int[] array, int base) { 414*795d594fSAndroid Build Coastguard Worker // Final range is base..base+3 so conditional 415*795d594fSAndroid Build Coastguard Worker // references may be included in the end. 416*795d594fSAndroid Build Coastguard Worker array[base] = 0; 417*795d594fSAndroid Build Coastguard Worker if (base != 12345) 418*795d594fSAndroid Build Coastguard Worker array[base + 2] = 2; 419*795d594fSAndroid Build Coastguard Worker array[base + 3] = 3; 420*795d594fSAndroid Build Coastguard Worker if (base != 67890) 421*795d594fSAndroid Build Coastguard Worker array[base + 1] = 1; 422*795d594fSAndroid Build Coastguard Worker } 423*795d594fSAndroid Build Coastguard Worker 424*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing10(int[], int) BCE (before) 425*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 426*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 427*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 428*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 429*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 430*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 431*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 432*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 433*795d594fSAndroid Build Coastguard Worker 434*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantIndexing10(int[], int) BCE (after) 435*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 436*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 437*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 438*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 439*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 440*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 441*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 442*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 443*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 444*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 445*795d594fSAndroid Build Coastguard Worker constantIndexing10(int[] array, int base)446*795d594fSAndroid Build Coastguard Worker static void constantIndexing10(int[] array, int base) { 447*795d594fSAndroid Build Coastguard Worker // Offset hidden in incremented base. 448*795d594fSAndroid Build Coastguard Worker array[base] = 1; 449*795d594fSAndroid Build Coastguard Worker array[++base] = 2; 450*795d594fSAndroid Build Coastguard Worker array[++base] = 3; 451*795d594fSAndroid Build Coastguard Worker array[++base] = 4; 452*795d594fSAndroid Build Coastguard Worker } 453*795d594fSAndroid Build Coastguard Worker runAllConstantIndices()454*795d594fSAndroid Build Coastguard Worker static void runAllConstantIndices() { 455*795d594fSAndroid Build Coastguard Worker int[] a1 = { 0 }; 456*795d594fSAndroid Build Coastguard Worker int[] a6 = { 0, 0, 0, 0, 0, 0 }; 457*795d594fSAndroid Build Coastguard Worker 458*795d594fSAndroid Build Coastguard Worker boolean caught = false; 459*795d594fSAndroid Build Coastguard Worker try { 460*795d594fSAndroid Build Coastguard Worker constantIndexing1(a1); 461*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 462*795d594fSAndroid Build Coastguard Worker caught = true; 463*795d594fSAndroid Build Coastguard Worker } 464*795d594fSAndroid Build Coastguard Worker if (!caught) { 465*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 1 failed!"); 466*795d594fSAndroid Build Coastguard Worker } 467*795d594fSAndroid Build Coastguard Worker 468*795d594fSAndroid Build Coastguard Worker constantIndexing1(a6); 469*795d594fSAndroid Build Coastguard Worker if (a6[4] != 11 || a6[5] != 11) { 470*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 1 failed!"); 471*795d594fSAndroid Build Coastguard Worker } 472*795d594fSAndroid Build Coastguard Worker 473*795d594fSAndroid Build Coastguard Worker $opt$noinline$constantIndexing2(a6); 474*795d594fSAndroid Build Coastguard Worker if (a6[0] != 0 || a6[1] != 1 || a6[2] != 1 || 475*795d594fSAndroid Build Coastguard Worker a6[3] != 1 || a6[4] != 1 || a6[5] != 11) { 476*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 2 failed!"); 477*795d594fSAndroid Build Coastguard Worker } 478*795d594fSAndroid Build Coastguard Worker 479*795d594fSAndroid Build Coastguard Worker caught = false; 480*795d594fSAndroid Build Coastguard Worker try { 481*795d594fSAndroid Build Coastguard Worker constantIndexing2b(a6); 482*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 483*795d594fSAndroid Build Coastguard Worker caught = true; 484*795d594fSAndroid Build Coastguard Worker } 485*795d594fSAndroid Build Coastguard Worker if (!caught || a6[0] != 6 || a6[1] != 6 || a6[2] != 6 || 486*795d594fSAndroid Build Coastguard Worker a6[3] != 6 || a6[4] != 1 || a6[5] != 11) { 487*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 2b failed!"); 488*795d594fSAndroid Build Coastguard Worker } 489*795d594fSAndroid Build Coastguard Worker 490*795d594fSAndroid Build Coastguard Worker caught = false; 491*795d594fSAndroid Build Coastguard Worker try { 492*795d594fSAndroid Build Coastguard Worker constantIndexing2c(a1); 493*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 494*795d594fSAndroid Build Coastguard Worker caught = true; 495*795d594fSAndroid Build Coastguard Worker } 496*795d594fSAndroid Build Coastguard Worker if (!caught || a1[0] != 7) { 497*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 2c failed!"); 498*795d594fSAndroid Build Coastguard Worker } 499*795d594fSAndroid Build Coastguard Worker 500*795d594fSAndroid Build Coastguard Worker constantIndexing2c(a6); 501*795d594fSAndroid Build Coastguard Worker if (a6[0] != 7 || a6[1] != 7 || a6[2] != 7 || 502*795d594fSAndroid Build Coastguard Worker a6[3] != 7 || a6[4] != 1 || a6[5] != 11) { 503*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 2c failed!"); 504*795d594fSAndroid Build Coastguard Worker } 505*795d594fSAndroid Build Coastguard Worker 506*795d594fSAndroid Build Coastguard Worker int[] b4 = new int[4]; 507*795d594fSAndroid Build Coastguard Worker constantIndexing3(a6, b4, true); 508*795d594fSAndroid Build Coastguard Worker if (b4[0] != 7 || b4[1] != 7 || b4[2] != 7 || b4[3] != 7) { 509*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 3 failed!"); 510*795d594fSAndroid Build Coastguard Worker } 511*795d594fSAndroid Build Coastguard Worker 512*795d594fSAndroid Build Coastguard Worker constantIndexing4(a1); 513*795d594fSAndroid Build Coastguard Worker if (a1[0] != -1) { 514*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 4 failed!"); 515*795d594fSAndroid Build Coastguard Worker } 516*795d594fSAndroid Build Coastguard Worker 517*795d594fSAndroid Build Coastguard Worker caught = false; 518*795d594fSAndroid Build Coastguard Worker try { 519*795d594fSAndroid Build Coastguard Worker constantIndexing5(a6); 520*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 521*795d594fSAndroid Build Coastguard Worker caught = true; 522*795d594fSAndroid Build Coastguard Worker } 523*795d594fSAndroid Build Coastguard Worker if (!caught) { 524*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 5 failed!"); 525*795d594fSAndroid Build Coastguard Worker } 526*795d594fSAndroid Build Coastguard Worker 527*795d594fSAndroid Build Coastguard Worker constantIndexing6(a6); 528*795d594fSAndroid Build Coastguard Worker if (a6[0] != 7 || a6[1] != 7 || a6[2] != 7 || 529*795d594fSAndroid Build Coastguard Worker a6[3] != 111 || a6[4] != 111 || a6[5] != 11) { 530*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 6 failed!"); 531*795d594fSAndroid Build Coastguard Worker } 532*795d594fSAndroid Build Coastguard Worker 533*795d594fSAndroid Build Coastguard Worker constantIndexing7(a6, 1); 534*795d594fSAndroid Build Coastguard Worker if (a6[0] != 7 || a6[1] != 10 || a6[2] != 20 || 535*795d594fSAndroid Build Coastguard Worker a6[3] != 30 || a6[4] != 40 || a6[5] != 11) { 536*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 7 failed!"); 537*795d594fSAndroid Build Coastguard Worker } 538*795d594fSAndroid Build Coastguard Worker 539*795d594fSAndroid Build Coastguard Worker caught = false; 540*795d594fSAndroid Build Coastguard Worker try { 541*795d594fSAndroid Build Coastguard Worker constantIndexing7(a6, 5); 542*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 543*795d594fSAndroid Build Coastguard Worker caught = true; 544*795d594fSAndroid Build Coastguard Worker } 545*795d594fSAndroid Build Coastguard Worker if (!caught || a6[0] != 7 || a6[1] != 10 || a6[2] != 20 || 546*795d594fSAndroid Build Coastguard Worker a6[3] != 30 || a6[4] != 40 || a6[5] != 10) { 547*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 7 failed!"); 548*795d594fSAndroid Build Coastguard Worker } 549*795d594fSAndroid Build Coastguard Worker 550*795d594fSAndroid Build Coastguard Worker constantIndexing8(a6, 1); 551*795d594fSAndroid Build Coastguard Worker if (a6[0] != 100 || a6[1] != 200 || a6[2] != 300 || 552*795d594fSAndroid Build Coastguard Worker a6[3] != 400 || a6[4] != 40 || a6[5] != 10) { 553*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 8 failed!"); 554*795d594fSAndroid Build Coastguard Worker } 555*795d594fSAndroid Build Coastguard Worker 556*795d594fSAndroid Build Coastguard Worker caught = false; 557*795d594fSAndroid Build Coastguard Worker try { 558*795d594fSAndroid Build Coastguard Worker constantIndexing8(a6, 0); 559*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 560*795d594fSAndroid Build Coastguard Worker caught = true; 561*795d594fSAndroid Build Coastguard Worker } 562*795d594fSAndroid Build Coastguard Worker if (!caught || a6[0] != 100) { 563*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 8 failed!"); 564*795d594fSAndroid Build Coastguard Worker } 565*795d594fSAndroid Build Coastguard Worker 566*795d594fSAndroid Build Coastguard Worker constantIndexing9(a6, 0); 567*795d594fSAndroid Build Coastguard Worker if (a6[0] != 0 || a6[1] != 1 || a6[2] != 2 || 568*795d594fSAndroid Build Coastguard Worker a6[3] != 3 || a6[4] != 40 || a6[5] != 10) { 569*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 9 failed!"); 570*795d594fSAndroid Build Coastguard Worker } 571*795d594fSAndroid Build Coastguard Worker 572*795d594fSAndroid Build Coastguard Worker constantIndexing10(a6, 0); 573*795d594fSAndroid Build Coastguard Worker if (a6[0] != 1 || a6[1] != 2 || a6[2] != 3 || 574*795d594fSAndroid Build Coastguard Worker a6[3] != 4 || a6[4] != 40 || a6[5] != 10) { 575*795d594fSAndroid Build Coastguard Worker System.out.println("constant indices 10 failed!"); 576*795d594fSAndroid Build Coastguard Worker } 577*795d594fSAndroid Build Coastguard Worker } 578*795d594fSAndroid Build Coastguard Worker 579*795d594fSAndroid Build Coastguard Worker // A helper into which the actual throwing function should be inlined. constantIndexingForward6(int[] array)580*795d594fSAndroid Build Coastguard Worker static void constantIndexingForward6(int[] array) { 581*795d594fSAndroid Build Coastguard Worker assertIsManaged(); 582*795d594fSAndroid Build Coastguard Worker constantIndexing6(array); 583*795d594fSAndroid Build Coastguard Worker } 584*795d594fSAndroid Build Coastguard Worker 585*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.loopPattern1(int[]) BCE (before) 586*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 587*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 588*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 589*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 590*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 591*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 592*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 593*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 594*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 595*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 596*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 597*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 598*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 599*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 600*795d594fSAndroid Build Coastguard Worker 601*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.loopPattern1(int[]) BCE (after) 602*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 603*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 604*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 605*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 606*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 607*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 608*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 609*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 610*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 611*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 612*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 613*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 614*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 615*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 616*795d594fSAndroid Build Coastguard Worker loopPattern1(int[] array)617*795d594fSAndroid Build Coastguard Worker static void loopPattern1(int[] array) { 618*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < array.length; i++) { 619*795d594fSAndroid Build Coastguard Worker array[i] = 1; // Bounds check can be eliminated. 620*795d594fSAndroid Build Coastguard Worker } 621*795d594fSAndroid Build Coastguard Worker 622*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < array.length; i++) { 623*795d594fSAndroid Build Coastguard Worker array[i] = 1; // Bounds check can be eliminated. 624*795d594fSAndroid Build Coastguard Worker } 625*795d594fSAndroid Build Coastguard Worker 626*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < array.length - 1; i++) { 627*795d594fSAndroid Build Coastguard Worker array[i] = 1; // Bounds check can be eliminated. 628*795d594fSAndroid Build Coastguard Worker } 629*795d594fSAndroid Build Coastguard Worker 630*795d594fSAndroid Build Coastguard Worker for (int i = -1; i < array.length; i++) { 631*795d594fSAndroid Build Coastguard Worker array[i] = 1; // Bounds check can't be eliminated. 632*795d594fSAndroid Build Coastguard Worker } 633*795d594fSAndroid Build Coastguard Worker 634*795d594fSAndroid Build Coastguard Worker for (int i = 0; i <= array.length; i++) { 635*795d594fSAndroid Build Coastguard Worker array[i] = 1; // Bounds check can't be eliminated. 636*795d594fSAndroid Build Coastguard Worker } 637*795d594fSAndroid Build Coastguard Worker 638*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < array.length; i += 2) { 639*795d594fSAndroid Build Coastguard Worker // We don't have any assumption on max array length yet. 640*795d594fSAndroid Build Coastguard Worker // Bounds check can't be eliminated due to overflow concern. 641*795d594fSAndroid Build Coastguard Worker array[i] = 1; 642*795d594fSAndroid Build Coastguard Worker } 643*795d594fSAndroid Build Coastguard Worker 644*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < array.length; i += 2) { 645*795d594fSAndroid Build Coastguard Worker // Bounds check can be eliminated since i is odd so the last 646*795d594fSAndroid Build Coastguard Worker // i that's less than array.length is at most (Integer.MAX_VALUE - 2). 647*795d594fSAndroid Build Coastguard Worker array[i] = 1; 648*795d594fSAndroid Build Coastguard Worker } 649*795d594fSAndroid Build Coastguard Worker } 650*795d594fSAndroid Build Coastguard Worker 651*795d594fSAndroid Build Coastguard Worker 652*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.loopPattern2(int[]) BCE (before) 653*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 654*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 655*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 656*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 657*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 658*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 659*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 660*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 661*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 662*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 663*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 664*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 665*795d594fSAndroid Build Coastguard Worker 666*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.loopPattern2(int[]) BCE (after) 667*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 668*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 669*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 670*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 671*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 672*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 673*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 674*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 675*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 676*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 677*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 678*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 679*795d594fSAndroid Build Coastguard Worker loopPattern2(int[] array)680*795d594fSAndroid Build Coastguard Worker static void loopPattern2(int[] array) { 681*795d594fSAndroid Build Coastguard Worker for (int i = array.length - 1; i >= 0; i--) { 682*795d594fSAndroid Build Coastguard Worker array[i] = 1; // Bounds check can be eliminated. 683*795d594fSAndroid Build Coastguard Worker } 684*795d594fSAndroid Build Coastguard Worker 685*795d594fSAndroid Build Coastguard Worker for (int i = array.length; i > 0; i--) { 686*795d594fSAndroid Build Coastguard Worker array[i - 1] = 1; // Bounds check can be eliminated. 687*795d594fSAndroid Build Coastguard Worker } 688*795d594fSAndroid Build Coastguard Worker 689*795d594fSAndroid Build Coastguard Worker for (int i = array.length - 1; i > 0; i--) { 690*795d594fSAndroid Build Coastguard Worker array[i] = 1; // Bounds check can be eliminated. 691*795d594fSAndroid Build Coastguard Worker } 692*795d594fSAndroid Build Coastguard Worker 693*795d594fSAndroid Build Coastguard Worker for (int i = array.length; i >= 0; i--) { 694*795d594fSAndroid Build Coastguard Worker array[i] = 1; // Bounds check can't be eliminated. 695*795d594fSAndroid Build Coastguard Worker } 696*795d594fSAndroid Build Coastguard Worker 697*795d594fSAndroid Build Coastguard Worker for (int i = array.length; i >= 0; i--) { 698*795d594fSAndroid Build Coastguard Worker array[i - 1] = 1; // Bounds check can't be eliminated. 699*795d594fSAndroid Build Coastguard Worker } 700*795d594fSAndroid Build Coastguard Worker 701*795d594fSAndroid Build Coastguard Worker for (int i = array.length; i > 0; i -= 20) { 702*795d594fSAndroid Build Coastguard Worker // For i >= 0, (i - 20 - 1) is guaranteed not to underflow. 703*795d594fSAndroid Build Coastguard Worker array[i - 1] = 1; // Bounds check can be eliminated. 704*795d594fSAndroid Build Coastguard Worker } 705*795d594fSAndroid Build Coastguard Worker } 706*795d594fSAndroid Build Coastguard Worker 707*795d594fSAndroid Build Coastguard Worker 708*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.loopPattern3(int[]) BCE (before) 709*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 710*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 711*795d594fSAndroid Build Coastguard Worker 712*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.loopPattern3(int[]) BCE (after) 713*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 714*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 715*795d594fSAndroid Build Coastguard Worker loopPattern3(int[] array)716*795d594fSAndroid Build Coastguard Worker static void loopPattern3(int[] array) { 717*795d594fSAndroid Build Coastguard Worker java.util.Random random = new java.util.Random(); 718*795d594fSAndroid Build Coastguard Worker for (int i = 0; ; i++) { 719*795d594fSAndroid Build Coastguard Worker if (random.nextInt() % 1000 == 0 && i < array.length) { 720*795d594fSAndroid Build Coastguard Worker // Can't eliminate the bound check since not every i++ is 721*795d594fSAndroid Build Coastguard Worker // matched with a array length check, so there is some chance that i 722*795d594fSAndroid Build Coastguard Worker // overflows and is negative. 723*795d594fSAndroid Build Coastguard Worker array[i] = 1; 724*795d594fSAndroid Build Coastguard Worker } 725*795d594fSAndroid Build Coastguard Worker } 726*795d594fSAndroid Build Coastguard Worker } 727*795d594fSAndroid Build Coastguard Worker 728*795d594fSAndroid Build Coastguard Worker 729*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantNewArray() BCE (before) 730*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 731*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 732*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 733*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 734*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 735*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 736*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 737*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 738*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 739*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 740*795d594fSAndroid Build Coastguard Worker 741*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.constantNewArray() BCE (after) 742*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 743*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 744*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 745*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 746*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 747*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 748*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 749*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 750*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 751*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 752*795d594fSAndroid Build Coastguard Worker constantNewArray()753*795d594fSAndroid Build Coastguard Worker static void constantNewArray() { 754*795d594fSAndroid Build Coastguard Worker int[] array = new int[10]; 755*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) { 756*795d594fSAndroid Build Coastguard Worker array[i] = 1; // Bounds check can be eliminated. 757*795d594fSAndroid Build Coastguard Worker } 758*795d594fSAndroid Build Coastguard Worker 759*795d594fSAndroid Build Coastguard Worker for (int i = 0; i <= 10; i++) { 760*795d594fSAndroid Build Coastguard Worker array[i] = 1; // Bounds check can't be eliminated. 761*795d594fSAndroid Build Coastguard Worker } 762*795d594fSAndroid Build Coastguard Worker 763*795d594fSAndroid Build Coastguard Worker array[0] = 1; // Bounds check can be eliminated. 764*795d594fSAndroid Build Coastguard Worker array[9] = 1; // Bounds check can be eliminated. 765*795d594fSAndroid Build Coastguard Worker array[10] = 1; // Bounds check can't be eliminated. 766*795d594fSAndroid Build Coastguard Worker } 767*795d594fSAndroid Build Coastguard Worker 768*795d594fSAndroid Build Coastguard Worker readData()769*795d594fSAndroid Build Coastguard Worker static byte readData() { 770*795d594fSAndroid Build Coastguard Worker return 1; 771*795d594fSAndroid Build Coastguard Worker } 772*795d594fSAndroid Build Coastguard Worker 773*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.circularBufferProducer() BCE (before) 774*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 775*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 776*795d594fSAndroid Build Coastguard Worker 777*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.circularBufferProducer() BCE (after) 778*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 779*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 780*795d594fSAndroid Build Coastguard Worker circularBufferProducer()781*795d594fSAndroid Build Coastguard Worker static void circularBufferProducer() { 782*795d594fSAndroid Build Coastguard Worker byte[] array = new byte[4096]; 783*795d594fSAndroid Build Coastguard Worker int i = 0; 784*795d594fSAndroid Build Coastguard Worker while (true) { 785*795d594fSAndroid Build Coastguard Worker array[i & (array.length - 1)] = readData(); 786*795d594fSAndroid Build Coastguard Worker i++; 787*795d594fSAndroid Build Coastguard Worker } 788*795d594fSAndroid Build Coastguard Worker } 789*795d594fSAndroid Build Coastguard Worker 790*795d594fSAndroid Build Coastguard Worker 791*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.pyramid1(int[]) BCE (before) 792*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 793*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 794*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 795*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 796*795d594fSAndroid Build Coastguard Worker 797*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.pyramid1(int[]) BCE (after) 798*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 799*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 800*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 801*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 802*795d594fSAndroid Build Coastguard Worker 803*795d594fSAndroid Build Coastguard Worker // Set array to something like {0, 1, 2, 3, 2, 1, 0}. pyramid1(int[] array)804*795d594fSAndroid Build Coastguard Worker static void pyramid1(int[] array) { 805*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < (array.length + 1) / 2; i++) { 806*795d594fSAndroid Build Coastguard Worker array[i] = i; 807*795d594fSAndroid Build Coastguard Worker array[array.length - 1 - i] = i; 808*795d594fSAndroid Build Coastguard Worker } 809*795d594fSAndroid Build Coastguard Worker } 810*795d594fSAndroid Build Coastguard Worker 811*795d594fSAndroid Build Coastguard Worker 812*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.pyramid2(int[]) BCE (before) 813*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 814*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 815*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 816*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 817*795d594fSAndroid Build Coastguard Worker 818*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.pyramid2(int[]) BCE (after) 819*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 820*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 821*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 822*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 823*795d594fSAndroid Build Coastguard Worker 824*795d594fSAndroid Build Coastguard Worker // Set array to something like {0, 1, 2, 3, 2, 1, 0}. pyramid2(int[] array)825*795d594fSAndroid Build Coastguard Worker static void pyramid2(int[] array) { 826*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < (array.length + 1) >> 1; i++) { 827*795d594fSAndroid Build Coastguard Worker array[i] = i; 828*795d594fSAndroid Build Coastguard Worker array[array.length - 1 - i] = i; 829*795d594fSAndroid Build Coastguard Worker } 830*795d594fSAndroid Build Coastguard Worker } 831*795d594fSAndroid Build Coastguard Worker 832*795d594fSAndroid Build Coastguard Worker 833*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.pyramid3(int[]) BCE (before) 834*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 835*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 836*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 837*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 838*795d594fSAndroid Build Coastguard Worker 839*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.pyramid3(int[]) BCE (after) 840*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 841*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 842*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 843*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 844*795d594fSAndroid Build Coastguard Worker 845*795d594fSAndroid Build Coastguard Worker // Set array to something like {0, 1, 2, 3, 2, 1, 0}. pyramid3(int[] array)846*795d594fSAndroid Build Coastguard Worker static void pyramid3(int[] array) { 847*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < (array.length + 1) >>> 1; i++) { 848*795d594fSAndroid Build Coastguard Worker array[i] = i; 849*795d594fSAndroid Build Coastguard Worker array[array.length - 1 - i] = i; 850*795d594fSAndroid Build Coastguard Worker } 851*795d594fSAndroid Build Coastguard Worker } 852*795d594fSAndroid Build Coastguard Worker 853*795d594fSAndroid Build Coastguard Worker 854*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.isPyramid(int[]) BCE (before) 855*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 856*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 857*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 858*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 859*795d594fSAndroid Build Coastguard Worker 860*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.isPyramid(int[]) BCE (after) 861*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 862*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 863*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 864*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 865*795d594fSAndroid Build Coastguard Worker isPyramid(int[] array)866*795d594fSAndroid Build Coastguard Worker static boolean isPyramid(int[] array) { 867*795d594fSAndroid Build Coastguard Worker int i = 0; 868*795d594fSAndroid Build Coastguard Worker int j = array.length - 1; 869*795d594fSAndroid Build Coastguard Worker while (i <= j) { 870*795d594fSAndroid Build Coastguard Worker if (array[i] != i) { 871*795d594fSAndroid Build Coastguard Worker return false; 872*795d594fSAndroid Build Coastguard Worker } 873*795d594fSAndroid Build Coastguard Worker if (array[j] != i) { 874*795d594fSAndroid Build Coastguard Worker return false; 875*795d594fSAndroid Build Coastguard Worker } 876*795d594fSAndroid Build Coastguard Worker i++; j--; 877*795d594fSAndroid Build Coastguard Worker } 878*795d594fSAndroid Build Coastguard Worker return true; 879*795d594fSAndroid Build Coastguard Worker } 880*795d594fSAndroid Build Coastguard Worker 881*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.modArrayIndex1(int[]) BCE (before) 882*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 883*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 884*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 885*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 886*795d594fSAndroid Build Coastguard Worker 887*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.modArrayIndex1(int[]) BCE (after) 888*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 889*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 890*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 891*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 892*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet modArrayIndex1(int[] array)893*795d594fSAndroid Build Coastguard Worker public static void modArrayIndex1(int[] array) { 894*795d594fSAndroid Build Coastguard Worker for(int i = 0; i < 100; i++) { 895*795d594fSAndroid Build Coastguard Worker // Cannot statically eliminate, for example, when array.length == 5. 896*795d594fSAndroid Build Coastguard Worker // Currently dynamic BCE isn't applied for this case. 897*795d594fSAndroid Build Coastguard Worker array[i % 10] = i; 898*795d594fSAndroid Build Coastguard Worker // Can be eliminated by BCE. 899*795d594fSAndroid Build Coastguard Worker array[i % array.length] = i; 900*795d594fSAndroid Build Coastguard Worker } 901*795d594fSAndroid Build Coastguard Worker } 902*795d594fSAndroid Build Coastguard Worker 903*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.modArrayIndex2(int[], int) BCE (before) 904*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 905*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 906*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 907*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 908*795d594fSAndroid Build Coastguard Worker 909*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.modArrayIndex2(int[], int) BCE (after) 910*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 911*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 912*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 913*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 914*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet modArrayIndex2(int array[], int index)915*795d594fSAndroid Build Coastguard Worker public static void modArrayIndex2(int array[], int index) { 916*795d594fSAndroid Build Coastguard Worker for(int i = 0; i < 100; i++) { 917*795d594fSAndroid Build Coastguard Worker // Both bounds checks cannot be statically eliminated, because index can be < 0. 918*795d594fSAndroid Build Coastguard Worker // Currently dynamic BCE isn't applied for this case. 919*795d594fSAndroid Build Coastguard Worker array[(index+i) % 10] = i; 920*795d594fSAndroid Build Coastguard Worker array[(index+i) % array.length] = i; 921*795d594fSAndroid Build Coastguard Worker } 922*795d594fSAndroid Build Coastguard Worker } 923*795d594fSAndroid Build Coastguard Worker 924*795d594fSAndroid Build Coastguard Worker static final int[] staticArray = new int[10]; 925*795d594fSAndroid Build Coastguard Worker 926*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.modArrayIndex3() BCE (before) 927*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 928*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 929*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 930*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 931*795d594fSAndroid Build Coastguard Worker 932*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.modArrayIndex3() BCE (after) 933*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 934*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 935*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 936*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 937*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet modArrayIndex3()938*795d594fSAndroid Build Coastguard Worker public static void modArrayIndex3() { 939*795d594fSAndroid Build Coastguard Worker for(int i = 0; i < 100; i++) { 940*795d594fSAndroid Build Coastguard Worker // Currently dynamic BCE isn't applied for this case. 941*795d594fSAndroid Build Coastguard Worker staticArray[i % 10] = i; 942*795d594fSAndroid Build Coastguard Worker // Can be eliminated by BCE. 943*795d594fSAndroid Build Coastguard Worker staticArray[i % staticArray.length] = i; 944*795d594fSAndroid Build Coastguard Worker } 945*795d594fSAndroid Build Coastguard Worker } 946*795d594fSAndroid Build Coastguard Worker 947*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.modArrayIndex4() BCE (before) 948*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 949*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 950*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 951*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 952*795d594fSAndroid Build Coastguard Worker 953*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.modArrayIndex4() BCE (after) 954*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 955*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 956*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 957*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet modArrayIndex4()958*795d594fSAndroid Build Coastguard Worker public static void modArrayIndex4() { 959*795d594fSAndroid Build Coastguard Worker int[] array = new int[20]; 960*795d594fSAndroid Build Coastguard Worker for(int i = 0; i < 100; i++) { 961*795d594fSAndroid Build Coastguard Worker // The local array length is statically know. Both can be eliminated by BCE. 962*795d594fSAndroid Build Coastguard Worker array[i % 10] = i; 963*795d594fSAndroid Build Coastguard Worker array[i % array.length] = i; 964*795d594fSAndroid Build Coastguard Worker } 965*795d594fSAndroid Build Coastguard Worker } 966*795d594fSAndroid Build Coastguard Worker 967*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.modArrayIndex5(int[], int) BCE (before) 968*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 969*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet 970*795d594fSAndroid Build Coastguard Worker // 971*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.modArrayIndex5(int[], int) BCE (after) 972*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 973*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet modArrayIndex5(int[] x, int i)974*795d594fSAndroid Build Coastguard Worker public static void modArrayIndex5(int[] x, int i) { 975*795d594fSAndroid Build Coastguard Worker while (true) { 976*795d594fSAndroid Build Coastguard Worker int xi = i % x.length; 977*795d594fSAndroid Build Coastguard Worker if (xi < 0) 978*795d594fSAndroid Build Coastguard Worker break; 979*795d594fSAndroid Build Coastguard Worker if (i >= x.length) 980*795d594fSAndroid Build Coastguard Worker break; 981*795d594fSAndroid Build Coastguard Worker x[xi] = i; 982*795d594fSAndroid Build Coastguard Worker i++; 983*795d594fSAndroid Build Coastguard Worker } 984*795d594fSAndroid Build Coastguard Worker } 985*795d594fSAndroid Build Coastguard Worker 986*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.bubbleSort(int[]) GVN (before) 987*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 988*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 989*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 990*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 991*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 992*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 993*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 994*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 995*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 996*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 997*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 998*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 999*795d594fSAndroid Build Coastguard Worker 1000*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.bubbleSort(int[]) GVN (after) 1001*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1002*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1003*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1004*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1005*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 1006*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 1007*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1008*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1009*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1010*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1011*795d594fSAndroid Build Coastguard Worker 1012*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.bubbleSort(int[]) BCE (after) 1013*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1014*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1015*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1016*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1017*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 1018*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 1019*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1020*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1021*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1022*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1023*795d594fSAndroid Build Coastguard Worker bubbleSort(int[] array)1024*795d594fSAndroid Build Coastguard Worker static void bubbleSort(int[] array) { 1025*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < array.length - 1; i++) { 1026*795d594fSAndroid Build Coastguard Worker for (int j = 0; j < array.length - i - 1; j++) { 1027*795d594fSAndroid Build Coastguard Worker if (array[j] > array[j + 1]) { 1028*795d594fSAndroid Build Coastguard Worker int temp = array[j + 1]; 1029*795d594fSAndroid Build Coastguard Worker array[j + 1] = array[j]; 1030*795d594fSAndroid Build Coastguard Worker array[j] = temp; 1031*795d594fSAndroid Build Coastguard Worker } 1032*795d594fSAndroid Build Coastguard Worker } 1033*795d594fSAndroid Build Coastguard Worker } 1034*795d594fSAndroid Build Coastguard Worker } 1035*795d594fSAndroid Build Coastguard Worker 1036*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.nonzeroLength(int[]) BCE (before) 1037*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 1038*795d594fSAndroid Build Coastguard Worker // 1039*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.nonzeroLength(int[]) BCE (after) 1040*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1041*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize nonzeroLength(int[] a)1042*795d594fSAndroid Build Coastguard Worker public static void nonzeroLength(int[] a) { 1043*795d594fSAndroid Build Coastguard Worker if (a.length != 0) { 1044*795d594fSAndroid Build Coastguard Worker a[0] = 112; 1045*795d594fSAndroid Build Coastguard Worker } 1046*795d594fSAndroid Build Coastguard Worker } 1047*795d594fSAndroid Build Coastguard Worker 1048*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.knownLength(int[]) BCE (before) 1049*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 1050*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck 1051*795d594fSAndroid Build Coastguard Worker // 1052*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.knownLength(int[]) BCE (after) 1053*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1054*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize knownLength(int[] a)1055*795d594fSAndroid Build Coastguard Worker public static void knownLength(int[] a) { 1056*795d594fSAndroid Build Coastguard Worker if (a.length == 2) { 1057*795d594fSAndroid Build Coastguard Worker a[0] = -1; 1058*795d594fSAndroid Build Coastguard Worker a[1] = -2; 1059*795d594fSAndroid Build Coastguard Worker } 1060*795d594fSAndroid Build Coastguard Worker } 1061*795d594fSAndroid Build Coastguard Worker 1062*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.lengthAlias1(int[], int) BCE (before) 1063*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr:l\d+>> ParameterValue loop:none 1064*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue loop:none 1065*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Nul:l\d+>> NullCheck [<<Arr>>] loop:none 1066*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Len:i\d+>> ArrayLength [<<Nul>>] loop:none 1067*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: NotEqual [<<Par>>,<<Len>>] loop:none 1068*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Idx:i\d+>> Phi loop:<<Loop:B\d+>> 1069*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck [<<Idx>>,<<Len>>] loop:<<Loop>> 1070*795d594fSAndroid Build Coastguard Worker // 1071*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.lengthAlias1(int[], int) BCE (after) 1072*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1073*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize lengthAlias1(int[] a, int len)1074*795d594fSAndroid Build Coastguard Worker public static void lengthAlias1(int[] a, int len) { 1075*795d594fSAndroid Build Coastguard Worker if (len == a.length) { 1076*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < len; i++) { 1077*795d594fSAndroid Build Coastguard Worker a[i] = 1; 1078*795d594fSAndroid Build Coastguard Worker } 1079*795d594fSAndroid Build Coastguard Worker } 1080*795d594fSAndroid Build Coastguard Worker } 1081*795d594fSAndroid Build Coastguard Worker 1082*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.lengthAlias2(int[], int) BCE (before) 1083*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr:l\d+>> ParameterValue loop:none 1084*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue loop:none 1085*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Nul:l\d+>> NullCheck [<<Arr>>] loop:none 1086*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Len:i\d+>> ArrayLength [<<Nul>>] loop:none 1087*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Equal [<<Par>>,<<Len>>] loop:none 1088*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Idx:i\d+>> Phi loop:<<Loop:B\d+>> 1089*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck [<<Idx>>,<<Len>>] loop:<<Loop>> 1090*795d594fSAndroid Build Coastguard Worker // 1091*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.lengthAlias2(int[], int) BCE (after) 1092*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1093*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize lengthAlias2(int[] a, int len)1094*795d594fSAndroid Build Coastguard Worker public static void lengthAlias2(int[] a, int len) { 1095*795d594fSAndroid Build Coastguard Worker if (len != a.length) { 1096*795d594fSAndroid Build Coastguard Worker return; 1097*795d594fSAndroid Build Coastguard Worker } 1098*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < len; i++) { 1099*795d594fSAndroid Build Coastguard Worker a[i] = 2; 1100*795d594fSAndroid Build Coastguard Worker } 1101*795d594fSAndroid Build Coastguard Worker } 1102*795d594fSAndroid Build Coastguard Worker 1103*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.lengthAlias3(int[], int) BCE (before) 1104*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr:l\d+>> ParameterValue loop:none 1105*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue loop:none 1106*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Nul:l\d+>> NullCheck [<<Arr>>] loop:none 1107*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Len:i\d+>> ArrayLength [<<Nul>>] loop:none 1108*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: NotEqual [<<Par>>,<<Len>>] loop:none 1109*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Idx:i\d+>> Phi loop:<<Loop:B\d+>> 1110*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck [<<Idx>>,<<Len>>] loop:<<Loop>> 1111*795d594fSAndroid Build Coastguard Worker // 1112*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.lengthAlias3(int[], int) BCE (after) 1113*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1114*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize lengthAlias3(int[] a, int len)1115*795d594fSAndroid Build Coastguard Worker public static void lengthAlias3(int[] a, int len) { 1116*795d594fSAndroid Build Coastguard Worker if (a.length == len) { 1117*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < len; i++) { 1118*795d594fSAndroid Build Coastguard Worker a[i] = 3; 1119*795d594fSAndroid Build Coastguard Worker } 1120*795d594fSAndroid Build Coastguard Worker } 1121*795d594fSAndroid Build Coastguard Worker } 1122*795d594fSAndroid Build Coastguard Worker 1123*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.lengthAlias4(int[]) BCE (before) 1124*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr:l\d+>> ParameterValue loop:none 1125*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Val:i\d+>> IntConstant 8 loop:none 1126*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Nul:l\d+>> NullCheck [<<Arr>>] loop:none 1127*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Len:i\d+>> ArrayLength [<<Nul>>] loop:none 1128*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Equal [<<Len>>,<<Val>>] loop:none 1129*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Idx:i\d+>> Phi loop:<<Loop:B\d+>> 1130*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: BoundsCheck [<<Idx>>,<<Val>>] loop:<<Loop>> 1131*795d594fSAndroid Build Coastguard Worker // 1132*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.lengthAlias4(int[]) BCE (after) 1133*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1134*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize lengthAlias4(int[] a)1135*795d594fSAndroid Build Coastguard Worker public static void lengthAlias4(int[] a) { 1136*795d594fSAndroid Build Coastguard Worker if (8 != a.length) { 1137*795d594fSAndroid Build Coastguard Worker return; 1138*795d594fSAndroid Build Coastguard Worker } 1139*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 8; i++) { 1140*795d594fSAndroid Build Coastguard Worker a[i] = 4; 1141*795d594fSAndroid Build Coastguard Worker } 1142*795d594fSAndroid Build Coastguard Worker } 1143*795d594fSAndroid Build Coastguard Worker 1144*795d594fSAndroid Build Coastguard Worker static int[][] mA; 1145*795d594fSAndroid Build Coastguard Worker 1146*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (before) 1147*795d594fSAndroid Build Coastguard Worker // Array references mA[i] and ..[j] both in inner loop. 1148*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:l\d+>> ArrayGet [<<Array1:l\d+>>,<<Bounds1:i\d+>>] loop:<<InnerLoop:B\d+>> 1149*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array1>> NullCheck [<<Field1:l\d+>>] loop:<<InnerLoop>> 1150*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Len1:i\d+>> ArrayLength [<<Array1>>] loop:<<InnerLoop>> 1151*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Bounds1>> BoundsCheck [<<Index1:i\d+>>,<<Len1>>] loop:<<InnerLoop>> 1152*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:i\d+>> ArrayGet [<<Array2:l\d+>>,<<Bounds2:i\d+>>] loop:<<InnerLoop>> 1153*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array2>> NullCheck [<<Get1>>] loop:<<InnerLoop>> 1154*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Len2:i\d+>> ArrayLength [<<Array2>>] loop:<<InnerLoop>> 1155*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Bounds2>> BoundsCheck [<<Index2:i\d+>>,<<Len2>>] loop:<<InnerLoop>> 1156*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs [<<Get2>>] loop:<<InnerLoop>> 1157*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index2>> Phi loop:<<InnerLoop>> 1158*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index1>> Phi loop:<<OuterLoop:B\d+>> 1159*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Field1>> StaticFieldGet loop:none 1160*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<InnerLoop>>" != "<<OuterLoop>>" 1161*795d594fSAndroid Build Coastguard Worker // 1162*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (after) 1163*795d594fSAndroid Build Coastguard Worker // Array reference mA[i] hoisted to same level as deopt. 1164*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Deoptimize loop:<<OuterLoop:B\d+>> 1165*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayLength loop:<<OuterLoop>> 1166*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:l\d+>> ArrayGet [<<Array1:l\d+>>,<<Index1:i\d+>>] loop:<<OuterLoop>> 1167*795d594fSAndroid Build Coastguard Worker // Array reference ..[j] still in inner loop, with a direct index. 1168*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:i\d+>> ArrayGet [<<Array2:l\d+>>,<<Index2:i\d+>>] loop:<<InnerLoop:B\d+>> 1169*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs [<<Get2>>] loop:<<InnerLoop>> 1170*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index2>> Phi loop:<<InnerLoop>> 1171*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index1>> Phi loop:<<OuterLoop>> 1172*795d594fSAndroid Build Coastguard Worker // Synthetic phi. 1173*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array2>> Phi loop:<<OuterLoop>> 1174*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array1>> StaticFieldGet loop:none 1175*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<InnerLoop>>" != "<<OuterLoop>>" 1176*795d594fSAndroid Build Coastguard Worker // 1177*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (after) 1178*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck 1179*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck dynamicBCEAndIntrinsic(int n)1180*795d594fSAndroid Build Coastguard Worker static void dynamicBCEAndIntrinsic(int n) { 1181*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < n; i++) { 1182*795d594fSAndroid Build Coastguard Worker for (int j = 0; j < n; j++) { 1183*795d594fSAndroid Build Coastguard Worker // Since intrinsic call cannot modify fields or arrays, 1184*795d594fSAndroid Build Coastguard Worker // dynamic BCE and hoisting can be applied to the inner loop. 1185*795d594fSAndroid Build Coastguard Worker mA[i][j] = Math.abs(mA[i][j]); 1186*795d594fSAndroid Build Coastguard Worker } 1187*795d594fSAndroid Build Coastguard Worker } 1188*795d594fSAndroid Build Coastguard Worker } 1189*795d594fSAndroid Build Coastguard Worker foo()1190*795d594fSAndroid Build Coastguard Worker static int foo() { 1191*795d594fSAndroid Build Coastguard Worker try { 1192*795d594fSAndroid Build Coastguard Worker assertIsManaged(); 1193*795d594fSAndroid Build Coastguard Worker // This will cause AIOOBE. 1194*795d594fSAndroid Build Coastguard Worker $opt$noinline$constantIndexing2(new int[3]); 1195*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 1196*795d594fSAndroid Build Coastguard Worker assertIsManaged(); // This is to ensure that single-frame deoptimization works. 1197*795d594fSAndroid Build Coastguard Worker // Will need to be updated if $opt$noinline$constantIndexing2 is inlined. 1198*795d594fSAndroid Build Coastguard Worker try { 1199*795d594fSAndroid Build Coastguard Worker // This will cause AIOOBE. 1200*795d594fSAndroid Build Coastguard Worker constantIndexingForward6(new int[3]); 1201*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e2) { 1202*795d594fSAndroid Build Coastguard Worker // Having deopted, we expect to be running interpreted at this point. 1203*795d594fSAndroid Build Coastguard Worker // Does not apply to debuggable, however, since we do not inline. 1204*795d594fSAndroid Build Coastguard Worker return 99; 1205*795d594fSAndroid Build Coastguard Worker } 1206*795d594fSAndroid Build Coastguard Worker } 1207*795d594fSAndroid Build Coastguard Worker return 0; 1208*795d594fSAndroid Build Coastguard Worker } 1209*795d594fSAndroid Build Coastguard Worker 1210*795d594fSAndroid Build Coastguard Worker 1211*795d594fSAndroid Build Coastguard Worker int sum; 1212*795d594fSAndroid Build Coastguard Worker 1213*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo1(int[], int, int, boolean) BCE (before) 1214*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1215*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1216*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1217*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1218*795d594fSAndroid Build Coastguard Worker 1219*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo1(int[], int, int, boolean) BCE (after) 1220*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi 1221*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1222*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1223*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1224*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1225*795d594fSAndroid Build Coastguard Worker // Added blocks at end for deoptimization. 1226*795d594fSAndroid Build Coastguard Worker /// CHECK: Exit 1227*795d594fSAndroid Build Coastguard Worker /// CHECK: If 1228*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1229*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1230*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1231*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 1232*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1233*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1234*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1235*795d594fSAndroid Build Coastguard Worker foo1(int[] array, int start, int end, boolean expectInterpreter)1236*795d594fSAndroid Build Coastguard Worker void foo1(int[] array, int start, int end, boolean expectInterpreter) { 1237*795d594fSAndroid Build Coastguard Worker if (end < 0) 1238*795d594fSAndroid Build Coastguard Worker throw new Error(""); 1239*795d594fSAndroid Build Coastguard Worker // Three HDeoptimize will be added. Two for the index 1240*795d594fSAndroid Build Coastguard Worker // and one for null check on array (to hoist null 1241*795d594fSAndroid Build Coastguard Worker // check and array.length out of loop). 1242*795d594fSAndroid Build Coastguard Worker for (int i = start ; i < end; i++) { 1243*795d594fSAndroid Build Coastguard Worker if (expectInterpreter) { 1244*795d594fSAndroid Build Coastguard Worker assertIsInterpreted(); 1245*795d594fSAndroid Build Coastguard Worker } else { 1246*795d594fSAndroid Build Coastguard Worker assertIsManaged(); 1247*795d594fSAndroid Build Coastguard Worker } 1248*795d594fSAndroid Build Coastguard Worker array[i] = 1; 1249*795d594fSAndroid Build Coastguard Worker sum += array[i]; 1250*795d594fSAndroid Build Coastguard Worker } 1251*795d594fSAndroid Build Coastguard Worker } 1252*795d594fSAndroid Build Coastguard Worker 1253*795d594fSAndroid Build Coastguard Worker 1254*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo2(int[], int, int, boolean) BCE (before) 1255*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1256*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1257*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1258*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1259*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo2(int[], int, int, boolean) BCE (after) 1260*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi 1261*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1262*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1263*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1264*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1265*795d594fSAndroid Build Coastguard Worker // Added blocks at end for deoptimization. 1266*795d594fSAndroid Build Coastguard Worker /// CHECK: Exit 1267*795d594fSAndroid Build Coastguard Worker /// CHECK: If 1268*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1269*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1270*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1271*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 1272*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1273*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1274*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1275*795d594fSAndroid Build Coastguard Worker foo2(int[] array, int start, int end, boolean expectInterpreter)1276*795d594fSAndroid Build Coastguard Worker void foo2(int[] array, int start, int end, boolean expectInterpreter) { 1277*795d594fSAndroid Build Coastguard Worker if (end < 0) 1278*795d594fSAndroid Build Coastguard Worker throw new Error(""); 1279*795d594fSAndroid Build Coastguard Worker // Three HDeoptimize will be added. Two for the index 1280*795d594fSAndroid Build Coastguard Worker // and one for null check on array (to hoist null 1281*795d594fSAndroid Build Coastguard Worker // check and array.length out of loop). 1282*795d594fSAndroid Build Coastguard Worker for (int i = start ; i <= end; i++) { 1283*795d594fSAndroid Build Coastguard Worker if (expectInterpreter) { 1284*795d594fSAndroid Build Coastguard Worker assertIsInterpreted(); 1285*795d594fSAndroid Build Coastguard Worker } else { 1286*795d594fSAndroid Build Coastguard Worker assertIsManaged(); 1287*795d594fSAndroid Build Coastguard Worker } 1288*795d594fSAndroid Build Coastguard Worker array[i] = 1; 1289*795d594fSAndroid Build Coastguard Worker sum += array[i]; 1290*795d594fSAndroid Build Coastguard Worker } 1291*795d594fSAndroid Build Coastguard Worker } 1292*795d594fSAndroid Build Coastguard Worker 1293*795d594fSAndroid Build Coastguard Worker 1294*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo3(int[], int, boolean) BCE (before) 1295*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1296*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1297*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1298*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1299*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo3(int[], int, boolean) BCE (after) 1300*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi 1301*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1302*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1303*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1304*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1305*795d594fSAndroid Build Coastguard Worker // Added blocks at end for deoptimization. 1306*795d594fSAndroid Build Coastguard Worker /// CHECK: Exit 1307*795d594fSAndroid Build Coastguard Worker /// CHECK: If 1308*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1309*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1310*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1311*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 1312*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1313*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1314*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1315*795d594fSAndroid Build Coastguard Worker foo3(int[] array, int end, boolean expectInterpreter)1316*795d594fSAndroid Build Coastguard Worker void foo3(int[] array, int end, boolean expectInterpreter) { 1317*795d594fSAndroid Build Coastguard Worker if (end < 0) 1318*795d594fSAndroid Build Coastguard Worker throw new Error(""); 1319*795d594fSAndroid Build Coastguard Worker // Three HDeoptimize will be added. Two for the index 1320*795d594fSAndroid Build Coastguard Worker // and one for null check on array (to hoist null check 1321*795d594fSAndroid Build Coastguard Worker // and array.length out of loop). 1322*795d594fSAndroid Build Coastguard Worker for (int i = 3 ; i <= end; i++) { 1323*795d594fSAndroid Build Coastguard Worker if (expectInterpreter) { 1324*795d594fSAndroid Build Coastguard Worker assertIsInterpreted(); 1325*795d594fSAndroid Build Coastguard Worker } else { 1326*795d594fSAndroid Build Coastguard Worker assertIsManaged(); 1327*795d594fSAndroid Build Coastguard Worker } 1328*795d594fSAndroid Build Coastguard Worker array[i] = 1; 1329*795d594fSAndroid Build Coastguard Worker sum += array[i]; 1330*795d594fSAndroid Build Coastguard Worker } 1331*795d594fSAndroid Build Coastguard Worker } 1332*795d594fSAndroid Build Coastguard Worker 1333*795d594fSAndroid Build Coastguard Worker 1334*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo4(int[], int, boolean) BCE (before) 1335*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1336*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1337*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1338*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1339*795d594fSAndroid Build Coastguard Worker 1340*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo4(int[], int, boolean) BCE (after) 1341*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi 1342*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1343*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1344*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1345*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1346*795d594fSAndroid Build Coastguard Worker // Added blocks at end for deoptimization. 1347*795d594fSAndroid Build Coastguard Worker /// CHECK: Exit 1348*795d594fSAndroid Build Coastguard Worker /// CHECK: If 1349*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1350*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1351*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1352*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 1353*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1354*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1355*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1356*795d594fSAndroid Build Coastguard Worker foo4(int[] array, int end, boolean expectInterpreter)1357*795d594fSAndroid Build Coastguard Worker void foo4(int[] array, int end, boolean expectInterpreter) { 1358*795d594fSAndroid Build Coastguard Worker if (end < 0) 1359*795d594fSAndroid Build Coastguard Worker throw new Error(""); 1360*795d594fSAndroid Build Coastguard Worker // Three HDeoptimize will be added. Two for the index 1361*795d594fSAndroid Build Coastguard Worker // and one for null check on array (to hoist null check 1362*795d594fSAndroid Build Coastguard Worker // and array.length out of loop). 1363*795d594fSAndroid Build Coastguard Worker for (int i = end ; i > 0; i--) { 1364*795d594fSAndroid Build Coastguard Worker if (expectInterpreter) { 1365*795d594fSAndroid Build Coastguard Worker assertIsInterpreted(); 1366*795d594fSAndroid Build Coastguard Worker } else { 1367*795d594fSAndroid Build Coastguard Worker assertIsManaged(); 1368*795d594fSAndroid Build Coastguard Worker } 1369*795d594fSAndroid Build Coastguard Worker array[i - 1] = 1; 1370*795d594fSAndroid Build Coastguard Worker sum += array[i - 1]; 1371*795d594fSAndroid Build Coastguard Worker } 1372*795d594fSAndroid Build Coastguard Worker } 1373*795d594fSAndroid Build Coastguard Worker 1374*795d594fSAndroid Build Coastguard Worker 1375*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo5(int[], int, boolean) BCE (before) 1376*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1377*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1378*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1379*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1380*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1381*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1382*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1383*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1384*795d594fSAndroid Build Coastguard Worker 1385*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo5(int[], int, boolean) BCE (after) 1386*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1387*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1388*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi 1389*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1390*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1391*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1392*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1393*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1394*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1395*795d594fSAndroid Build Coastguard Worker // Added blocks at end for deoptimization. 1396*795d594fSAndroid Build Coastguard Worker /// CHECK: Exit 1397*795d594fSAndroid Build Coastguard Worker /// CHECK: If 1398*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1399*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1400*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1401*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 1402*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1403*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1404*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1405*795d594fSAndroid Build Coastguard Worker foo5(int[] array, int end, boolean expectInterpreter)1406*795d594fSAndroid Build Coastguard Worker void foo5(int[] array, int end, boolean expectInterpreter) { 1407*795d594fSAndroid Build Coastguard Worker if (end < 0) 1408*795d594fSAndroid Build Coastguard Worker throw new Error(""); 1409*795d594fSAndroid Build Coastguard Worker // Bounds check in this loop can be eliminated without deoptimization. 1410*795d594fSAndroid Build Coastguard Worker for (int i = array.length - 1 ; i >= 0; i--) { 1411*795d594fSAndroid Build Coastguard Worker array[i] = 1; 1412*795d594fSAndroid Build Coastguard Worker } 1413*795d594fSAndroid Build Coastguard Worker // Three HDeoptimize will be added for the bounds. 1414*795d594fSAndroid Build Coastguard Worker // The null check is not necessary. 1415*795d594fSAndroid Build Coastguard Worker for (int i = end - 2 ; i > 0; i--) { 1416*795d594fSAndroid Build Coastguard Worker if (expectInterpreter) { 1417*795d594fSAndroid Build Coastguard Worker assertIsInterpreted(); 1418*795d594fSAndroid Build Coastguard Worker } else { 1419*795d594fSAndroid Build Coastguard Worker assertIsManaged(); 1420*795d594fSAndroid Build Coastguard Worker } 1421*795d594fSAndroid Build Coastguard Worker sum += array[i - 1]; 1422*795d594fSAndroid Build Coastguard Worker sum += array[i]; 1423*795d594fSAndroid Build Coastguard Worker sum += array[i + 1]; 1424*795d594fSAndroid Build Coastguard Worker } 1425*795d594fSAndroid Build Coastguard Worker } 1426*795d594fSAndroid Build Coastguard Worker 1427*795d594fSAndroid Build Coastguard Worker 1428*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo6(int[], int, int, boolean) BCE (before) 1429*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1430*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1431*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1432*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1433*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1434*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1435*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1436*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1437*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1438*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1439*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1440*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1441*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo6(int[], int, int, boolean) BCE (after) 1442*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi 1443*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1444*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1445*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1446*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1447*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1448*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1449*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1450*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1451*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1452*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1453*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1454*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1455*795d594fSAndroid Build Coastguard Worker // Added blocks at end for deoptimization. 1456*795d594fSAndroid Build Coastguard Worker /// CHECK: Exit 1457*795d594fSAndroid Build Coastguard Worker /// CHECK: If 1458*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1459*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1460*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1461*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1462*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 1463*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1464*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1465*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1466*795d594fSAndroid Build Coastguard Worker foo6(int[] array, int start, int end, boolean expectInterpreter)1467*795d594fSAndroid Build Coastguard Worker void foo6(int[] array, int start, int end, boolean expectInterpreter) { 1468*795d594fSAndroid Build Coastguard Worker if (end < 0) 1469*795d594fSAndroid Build Coastguard Worker throw new Error(""); 1470*795d594fSAndroid Build Coastguard Worker for (int i = end; i >= start; i--) { 1471*795d594fSAndroid Build Coastguard Worker if (expectInterpreter) { 1472*795d594fSAndroid Build Coastguard Worker assertIsInterpreted(); 1473*795d594fSAndroid Build Coastguard Worker } else { 1474*795d594fSAndroid Build Coastguard Worker assertIsManaged(); 1475*795d594fSAndroid Build Coastguard Worker } 1476*795d594fSAndroid Build Coastguard Worker array[i] = (array[i-2] + array[i-1] + array[i] + array[i+1] + array[i+2]) / 5; 1477*795d594fSAndroid Build Coastguard Worker } 1478*795d594fSAndroid Build Coastguard Worker } 1479*795d594fSAndroid Build Coastguard Worker 1480*795d594fSAndroid Build Coastguard Worker 1481*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo7(int[], int, int, boolean) BCE (before) 1482*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1483*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1484*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1485*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1486*795d594fSAndroid Build Coastguard Worker 1487*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo7(int[], int, int, boolean) BCE (after) 1488*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi 1489*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1490*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1491*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1492*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1493*795d594fSAndroid Build Coastguard Worker // Added blocks at end for deoptimization. 1494*795d594fSAndroid Build Coastguard Worker /// CHECK: Exit 1495*795d594fSAndroid Build Coastguard Worker /// CHECK: If 1496*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1497*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1498*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1499*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 1500*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1501*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1502*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1503*795d594fSAndroid Build Coastguard Worker foo7(int[] array, int start, int end, boolean lowEnd)1504*795d594fSAndroid Build Coastguard Worker void foo7(int[] array, int start, int end, boolean lowEnd) { 1505*795d594fSAndroid Build Coastguard Worker // Three HDeoptimize will be added. One for the index 1506*795d594fSAndroid Build Coastguard Worker // and one for null check on array (to hoist null 1507*795d594fSAndroid Build Coastguard Worker // check and array.length out of loop). 1508*795d594fSAndroid Build Coastguard Worker for (int i = start ; i < end; i++) { 1509*795d594fSAndroid Build Coastguard Worker if (lowEnd) { 1510*795d594fSAndroid Build Coastguard Worker // This array access isn't certain. So we don't 1511*795d594fSAndroid Build Coastguard Worker // use +1000 offset in decision making for deoptimization 1512*795d594fSAndroid Build Coastguard Worker // conditions. 1513*795d594fSAndroid Build Coastguard Worker sum += array[i + 1000]; 1514*795d594fSAndroid Build Coastguard Worker } 1515*795d594fSAndroid Build Coastguard Worker sum += array[i]; 1516*795d594fSAndroid Build Coastguard Worker } 1517*795d594fSAndroid Build Coastguard Worker } 1518*795d594fSAndroid Build Coastguard Worker 1519*795d594fSAndroid Build Coastguard Worker 1520*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo8(int[][], int, int) BCE (before) 1521*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1522*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1523*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1524*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1525*795d594fSAndroid Build Coastguard Worker 1526*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo8(int[][], int, int) BCE (after) 1527*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi 1528*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1529*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1530*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi 1531*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1532*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1533*795d594fSAndroid Build Coastguard Worker // Added blocks at end for deoptimization. 1534*795d594fSAndroid Build Coastguard Worker /// CHECK: Exit 1535*795d594fSAndroid Build Coastguard Worker /// CHECK: If 1536*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1537*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1538*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1539*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1540*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1541*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1542*795d594fSAndroid Build Coastguard Worker /// CHECK: If 1543*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1544*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1545*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1546*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 1547*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1548*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1549*795d594fSAndroid Build Coastguard Worker /// CHECK: Goto 1550*795d594fSAndroid Build Coastguard Worker foo8(int[][] matrix, int start, int end)1551*795d594fSAndroid Build Coastguard Worker void foo8(int[][] matrix, int start, int end) { 1552*795d594fSAndroid Build Coastguard Worker // Three HDeoptimize will be added for the outer loop, 1553*795d594fSAndroid Build Coastguard Worker // two for the index, and null check on matrix. Same 1554*795d594fSAndroid Build Coastguard Worker // for the inner loop. 1555*795d594fSAndroid Build Coastguard Worker for (int i = start; i < end; i++) { 1556*795d594fSAndroid Build Coastguard Worker int[] row = matrix[i]; 1557*795d594fSAndroid Build Coastguard Worker for (int j = start; j < end; j++) { 1558*795d594fSAndroid Build Coastguard Worker row[j] = 1; 1559*795d594fSAndroid Build Coastguard Worker } 1560*795d594fSAndroid Build Coastguard Worker } 1561*795d594fSAndroid Build Coastguard Worker } 1562*795d594fSAndroid Build Coastguard Worker 1563*795d594fSAndroid Build Coastguard Worker 1564*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo9(int[], boolean) BCE (before) 1565*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 1566*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1567*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1568*795d594fSAndroid Build Coastguard Worker 1569*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo9(int[], boolean) BCE (after) 1570*795d594fSAndroid Build Coastguard Worker // The loop is guaranteed to be entered. No need to transform the 1571*795d594fSAndroid Build Coastguard Worker // loop for loop body entry test. 1572*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1573*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1574*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1575*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 1576*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi 1577*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck 1578*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: BoundsCheck 1579*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 1580*795d594fSAndroid Build Coastguard Worker 1581*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.foo9(int[], boolean) instruction_simplifier$before_codegen (after) 1582*795d594fSAndroid Build Coastguard Worker // Simplification removes the redundant check 1583*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1584*795d594fSAndroid Build Coastguard Worker /// CHECK: Deoptimize 1585*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 1586*795d594fSAndroid Build Coastguard Worker foo9(int[] array, boolean expectInterpreter)1587*795d594fSAndroid Build Coastguard Worker void foo9(int[] array, boolean expectInterpreter) { 1588*795d594fSAndroid Build Coastguard Worker // Three HDeoptimize will be added. Two for the index and one for null check on array. Then 1589*795d594fSAndroid Build Coastguard Worker // simplification removes one redundant HDeoptimize. 1590*795d594fSAndroid Build Coastguard Worker for (int i = 0 ; i < 10; i++) { 1591*795d594fSAndroid Build Coastguard Worker if (expectInterpreter) { 1592*795d594fSAndroid Build Coastguard Worker assertIsInterpreted(); 1593*795d594fSAndroid Build Coastguard Worker } else { 1594*795d594fSAndroid Build Coastguard Worker assertIsManaged(); 1595*795d594fSAndroid Build Coastguard Worker } 1596*795d594fSAndroid Build Coastguard Worker sum += array[i]; 1597*795d594fSAndroid Build Coastguard Worker } 1598*795d594fSAndroid Build Coastguard Worker } 1599*795d594fSAndroid Build Coastguard Worker 1600*795d594fSAndroid Build Coastguard Worker 1601*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.partialLooping(int[], int, int) BCE (before) 1602*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1603*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1604*795d594fSAndroid Build Coastguard Worker 1605*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.partialLooping(int[], int, int) BCE (after) 1606*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Deoptimize 1607*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1608*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 1609*795d594fSAndroid Build Coastguard Worker partialLooping(int[] array, int start, int end)1610*795d594fSAndroid Build Coastguard Worker void partialLooping(int[] array, int start, int end) { 1611*795d594fSAndroid Build Coastguard Worker // This loop doesn't cover the full range of [start, end) so 1612*795d594fSAndroid Build Coastguard Worker // adding deoptimization is too aggressive, since end can be 1613*795d594fSAndroid Build Coastguard Worker // greater than array.length but the loop is never going to work on 1614*795d594fSAndroid Build Coastguard Worker // more than 2 elements. 1615*795d594fSAndroid Build Coastguard Worker for (int i = start; i < end; i++) { 1616*795d594fSAndroid Build Coastguard Worker if (i == 2) { 1617*795d594fSAndroid Build Coastguard Worker return; 1618*795d594fSAndroid Build Coastguard Worker } 1619*795d594fSAndroid Build Coastguard Worker array[i] = 1; 1620*795d594fSAndroid Build Coastguard Worker } 1621*795d594fSAndroid Build Coastguard Worker } 1622*795d594fSAndroid Build Coastguard Worker 1623*795d594fSAndroid Build Coastguard Worker testUnknownBounds()1624*795d594fSAndroid Build Coastguard Worker static void testUnknownBounds() { 1625*795d594fSAndroid Build Coastguard Worker boolean caught = false; 1626*795d594fSAndroid Build Coastguard Worker 1627*795d594fSAndroid Build Coastguard Worker runAllConstantIndices(); 1628*795d594fSAndroid Build Coastguard Worker 1629*795d594fSAndroid Build Coastguard Worker Main main = new Main(); 1630*795d594fSAndroid Build Coastguard Worker main.foo1(new int[10], 0, 10, false); 1631*795d594fSAndroid Build Coastguard Worker if (main.sum != 10) { 1632*795d594fSAndroid Build Coastguard Worker System.out.println("foo1 failed!"); 1633*795d594fSAndroid Build Coastguard Worker } 1634*795d594fSAndroid Build Coastguard Worker 1635*795d594fSAndroid Build Coastguard Worker caught = false; 1636*795d594fSAndroid Build Coastguard Worker main = new Main(); 1637*795d594fSAndroid Build Coastguard Worker try { 1638*795d594fSAndroid Build Coastguard Worker main.foo1(new int[10], 0, 11, true); 1639*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 1640*795d594fSAndroid Build Coastguard Worker caught = true; 1641*795d594fSAndroid Build Coastguard Worker } 1642*795d594fSAndroid Build Coastguard Worker if (!caught || main.sum != 10) { 1643*795d594fSAndroid Build Coastguard Worker System.out.println("foo1 exception failed!"); 1644*795d594fSAndroid Build Coastguard Worker } 1645*795d594fSAndroid Build Coastguard Worker 1646*795d594fSAndroid Build Coastguard Worker main = new Main(); 1647*795d594fSAndroid Build Coastguard Worker main.foo2(new int[10], 0, 9, false); 1648*795d594fSAndroid Build Coastguard Worker if (main.sum != 10) { 1649*795d594fSAndroid Build Coastguard Worker System.out.println("foo2 failed!"); 1650*795d594fSAndroid Build Coastguard Worker } 1651*795d594fSAndroid Build Coastguard Worker 1652*795d594fSAndroid Build Coastguard Worker caught = false; 1653*795d594fSAndroid Build Coastguard Worker main = new Main(); 1654*795d594fSAndroid Build Coastguard Worker try { 1655*795d594fSAndroid Build Coastguard Worker main.foo2(new int[10], 0, 10, true); 1656*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 1657*795d594fSAndroid Build Coastguard Worker caught = true; 1658*795d594fSAndroid Build Coastguard Worker } 1659*795d594fSAndroid Build Coastguard Worker if (!caught || main.sum != 10) { 1660*795d594fSAndroid Build Coastguard Worker System.out.println("foo2 exception failed!"); 1661*795d594fSAndroid Build Coastguard Worker } 1662*795d594fSAndroid Build Coastguard Worker 1663*795d594fSAndroid Build Coastguard Worker main = new Main(); 1664*795d594fSAndroid Build Coastguard Worker main.foo3(new int[10], 9, false); 1665*795d594fSAndroid Build Coastguard Worker if (main.sum != 7) { 1666*795d594fSAndroid Build Coastguard Worker System.out.println("foo3 failed!"); 1667*795d594fSAndroid Build Coastguard Worker } 1668*795d594fSAndroid Build Coastguard Worker 1669*795d594fSAndroid Build Coastguard Worker caught = false; 1670*795d594fSAndroid Build Coastguard Worker main = new Main(); 1671*795d594fSAndroid Build Coastguard Worker try { 1672*795d594fSAndroid Build Coastguard Worker main.foo3(new int[10], 10, true); 1673*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 1674*795d594fSAndroid Build Coastguard Worker caught = true; 1675*795d594fSAndroid Build Coastguard Worker } 1676*795d594fSAndroid Build Coastguard Worker if (!caught || main.sum != 7) { 1677*795d594fSAndroid Build Coastguard Worker System.out.println("foo3 exception failed!"); 1678*795d594fSAndroid Build Coastguard Worker } 1679*795d594fSAndroid Build Coastguard Worker 1680*795d594fSAndroid Build Coastguard Worker main = new Main(); 1681*795d594fSAndroid Build Coastguard Worker main.foo4(new int[10], 10, false); 1682*795d594fSAndroid Build Coastguard Worker if (main.sum != 10) { 1683*795d594fSAndroid Build Coastguard Worker System.out.println("foo4 failed!"); 1684*795d594fSAndroid Build Coastguard Worker } 1685*795d594fSAndroid Build Coastguard Worker 1686*795d594fSAndroid Build Coastguard Worker caught = false; 1687*795d594fSAndroid Build Coastguard Worker main = new Main(); 1688*795d594fSAndroid Build Coastguard Worker try { 1689*795d594fSAndroid Build Coastguard Worker main.foo4(new int[10], 11, true); 1690*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 1691*795d594fSAndroid Build Coastguard Worker caught = true; 1692*795d594fSAndroid Build Coastguard Worker } 1693*795d594fSAndroid Build Coastguard Worker if (!caught || main.sum != 0) { 1694*795d594fSAndroid Build Coastguard Worker System.out.println("foo4 exception failed!"); 1695*795d594fSAndroid Build Coastguard Worker } 1696*795d594fSAndroid Build Coastguard Worker 1697*795d594fSAndroid Build Coastguard Worker main = new Main(); 1698*795d594fSAndroid Build Coastguard Worker main.foo5(new int[10], 10, false); 1699*795d594fSAndroid Build Coastguard Worker if (main.sum != 24) { 1700*795d594fSAndroid Build Coastguard Worker System.out.println("foo5 failed!"); 1701*795d594fSAndroid Build Coastguard Worker } 1702*795d594fSAndroid Build Coastguard Worker 1703*795d594fSAndroid Build Coastguard Worker caught = false; 1704*795d594fSAndroid Build Coastguard Worker main = new Main(); 1705*795d594fSAndroid Build Coastguard Worker try { 1706*795d594fSAndroid Build Coastguard Worker main.foo5(new int[10], 11, true); 1707*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 1708*795d594fSAndroid Build Coastguard Worker caught = true; 1709*795d594fSAndroid Build Coastguard Worker } 1710*795d594fSAndroid Build Coastguard Worker if (!caught || main.sum != 2) { 1711*795d594fSAndroid Build Coastguard Worker System.out.println("foo5 exception failed!"); 1712*795d594fSAndroid Build Coastguard Worker } 1713*795d594fSAndroid Build Coastguard Worker 1714*795d594fSAndroid Build Coastguard Worker main = new Main(); 1715*795d594fSAndroid Build Coastguard Worker main.foo6(new int[10], 2, 7, false); 1716*795d594fSAndroid Build Coastguard Worker 1717*795d594fSAndroid Build Coastguard Worker main = new Main(); 1718*795d594fSAndroid Build Coastguard Worker int[] array9 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 1719*795d594fSAndroid Build Coastguard Worker main.foo9(array9, false); 1720*795d594fSAndroid Build Coastguard Worker if (main.sum != 45) { 1721*795d594fSAndroid Build Coastguard Worker System.out.println("foo9 failed!"); 1722*795d594fSAndroid Build Coastguard Worker } 1723*795d594fSAndroid Build Coastguard Worker 1724*795d594fSAndroid Build Coastguard Worker main = new Main(); 1725*795d594fSAndroid Build Coastguard Worker int[] array = new int[4]; 1726*795d594fSAndroid Build Coastguard Worker main.partialLooping(new int[3], 0, 4); 1727*795d594fSAndroid Build Coastguard Worker if ((array[0] != 1) && (array[1] != 1) && 1728*795d594fSAndroid Build Coastguard Worker (array[2] != 0) && (array[3] != 0)) { 1729*795d594fSAndroid Build Coastguard Worker System.out.println("partialLooping failed!"); 1730*795d594fSAndroid Build Coastguard Worker } 1731*795d594fSAndroid Build Coastguard Worker 1732*795d594fSAndroid Build Coastguard Worker caught = false; 1733*795d594fSAndroid Build Coastguard Worker main = new Main(); 1734*795d594fSAndroid Build Coastguard Worker try { 1735*795d594fSAndroid Build Coastguard Worker main.foo6(new int[10], 2, 8, true); 1736*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 1737*795d594fSAndroid Build Coastguard Worker caught = true; 1738*795d594fSAndroid Build Coastguard Worker } 1739*795d594fSAndroid Build Coastguard Worker if (!caught) { 1740*795d594fSAndroid Build Coastguard Worker System.out.println("foo6 exception failed!"); 1741*795d594fSAndroid Build Coastguard Worker } 1742*795d594fSAndroid Build Coastguard Worker 1743*795d594fSAndroid Build Coastguard Worker caught = false; 1744*795d594fSAndroid Build Coastguard Worker main = new Main(); 1745*795d594fSAndroid Build Coastguard Worker try { 1746*795d594fSAndroid Build Coastguard Worker main.foo6(new int[10], 1, 7, true); 1747*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 1748*795d594fSAndroid Build Coastguard Worker caught = true; 1749*795d594fSAndroid Build Coastguard Worker } 1750*795d594fSAndroid Build Coastguard Worker if (!caught) { 1751*795d594fSAndroid Build Coastguard Worker System.out.println("foo6 exception failed!"); 1752*795d594fSAndroid Build Coastguard Worker } 1753*795d594fSAndroid Build Coastguard Worker 1754*795d594fSAndroid Build Coastguard Worker } 1755*795d594fSAndroid Build Coastguard Worker testExceptionMessage()1756*795d594fSAndroid Build Coastguard Worker public void testExceptionMessage() { 1757*795d594fSAndroid Build Coastguard Worker short[] B1 = new short[5]; 1758*795d594fSAndroid Build Coastguard Worker int[] B2 = new int[5]; 1759*795d594fSAndroid Build Coastguard Worker Exception err = null; 1760*795d594fSAndroid Build Coastguard Worker try { 1761*795d594fSAndroid Build Coastguard Worker testExceptionMessage1(B1, B2, null, -1, 6); 1762*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 1763*795d594fSAndroid Build Coastguard Worker err = e; 1764*795d594fSAndroid Build Coastguard Worker } 1765*795d594fSAndroid Build Coastguard Worker System.out.println(err); 1766*795d594fSAndroid Build Coastguard Worker } 1767*795d594fSAndroid Build Coastguard Worker testExceptionMessage1(short[] a1, int[] a2, long a3[], int start, int finish)1768*795d594fSAndroid Build Coastguard Worker void testExceptionMessage1(short[] a1, int[] a2, long a3[], int start, int finish) { 1769*795d594fSAndroid Build Coastguard Worker int j = finish + 77; 1770*795d594fSAndroid Build Coastguard Worker // Bug: 22665511 1771*795d594fSAndroid Build Coastguard Worker // A deoptimization will be triggered here right before the loop. Need to make 1772*795d594fSAndroid Build Coastguard Worker // sure the value of j is preserved for the interpreter. 1773*795d594fSAndroid Build Coastguard Worker for (int i = start; i <= finish; i++) { 1774*795d594fSAndroid Build Coastguard Worker a2[j - 1] = a1[i + 1]; 1775*795d594fSAndroid Build Coastguard Worker } 1776*795d594fSAndroid Build Coastguard Worker } 1777*795d594fSAndroid Build Coastguard Worker 1778*795d594fSAndroid Build Coastguard Worker // Tests `setZeroToRange` with a range of values. Checks for exceptions as well as the correctness 1779*795d594fSAndroid Build Coastguard Worker // of setting the right values to zero. $noinline$testSetZeroToRange()1780*795d594fSAndroid Build Coastguard Worker static void $noinline$testSetZeroToRange() { 1781*795d594fSAndroid Build Coastguard Worker for (int start = -2; start < 7; ++start) { 1782*795d594fSAndroid Build Coastguard Worker for (int len = -2; len < 7; ++len) { 1783*795d594fSAndroid Build Coastguard Worker int[] array = {1, 2, 3, 4, 5}; 1784*795d594fSAndroid Build Coastguard Worker final int lower = start; 1785*795d594fSAndroid Build Coastguard Worker final int upper = start + len - 1; 1786*795d594fSAndroid Build Coastguard Worker // We expect an exception if: 1787*795d594fSAndroid Build Coastguard Worker // * The first value is out of range, or 1788*795d594fSAndroid Build Coastguard Worker // * The last value is more than the length of the array. 1789*795d594fSAndroid Build Coastguard Worker // Note that if `upper < 0` it means that we will only do one iteration of the do while in 1790*795d594fSAndroid Build Coastguard Worker // `setZeroToRange` so we have the exception covered with the `lower` checks. 1791*795d594fSAndroid Build Coastguard Worker final boolean expected_exception = 1792*795d594fSAndroid Build Coastguard Worker (lower < 0) || (lower >= array.length) || (upper >= array.length); 1793*795d594fSAndroid Build Coastguard Worker try { 1794*795d594fSAndroid Build Coastguard Worker $noinline$setZeroToRange(array, start, len); 1795*795d594fSAndroid Build Coastguard Worker if (expected_exception) { 1796*795d594fSAndroid Build Coastguard Worker System.out.println("Missing ArrayIndexOutOfBoundsException for start " + start 1797*795d594fSAndroid Build Coastguard Worker + " and len " + len); 1798*795d594fSAndroid Build Coastguard Worker } 1799*795d594fSAndroid Build Coastguard Worker $noinline$checkZerosForSetZeroToRange(array, start, len); 1800*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException e) { 1801*795d594fSAndroid Build Coastguard Worker if (!expected_exception) { 1802*795d594fSAndroid Build Coastguard Worker System.out.println("Unexpected ArrayIndexOutOfBoundsException for start " + start 1803*795d594fSAndroid Build Coastguard Worker + " and len " + len); 1804*795d594fSAndroid Build Coastguard Worker } 1805*795d594fSAndroid Build Coastguard Worker } 1806*795d594fSAndroid Build Coastguard Worker } 1807*795d594fSAndroid Build Coastguard Worker } 1808*795d594fSAndroid Build Coastguard Worker } 1809*795d594fSAndroid Build Coastguard Worker 1810*795d594fSAndroid Build Coastguard Worker // TODO(solanes): Improve the code to replace the following BoundsCheck with HDeoptimize 1811*795d594fSAndroid Build Coastguard Worker // instructions. See b/304967775 and aosp/2804075. 1812*795d594fSAndroid Build Coastguard Worker 1813*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$setZeroToRange(int[], int, int) BCE (before) 1814*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1815*795d594fSAndroid Build Coastguard Worker 1816*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$setZeroToRange(int[], int, int) BCE (after) 1817*795d594fSAndroid Build Coastguard Worker /// CHECK: BoundsCheck 1818*795d594fSAndroid Build Coastguard Worker 1819*795d594fSAndroid Build Coastguard Worker // Sets to `0` the values of `arr` in the range `[start, len)`. $noinline$setZeroToRange(int[] arr, int start, int len)1820*795d594fSAndroid Build Coastguard Worker static void $noinline$setZeroToRange(int[] arr, int start, int len) { 1821*795d594fSAndroid Build Coastguard Worker int charPos = start; 1822*795d594fSAndroid Build Coastguard Worker do { 1823*795d594fSAndroid Build Coastguard Worker arr[charPos++] = 0; 1824*795d594fSAndroid Build Coastguard Worker } while (charPos < start + len); 1825*795d594fSAndroid Build Coastguard Worker } 1826*795d594fSAndroid Build Coastguard Worker $noinline$checkZerosForSetZeroToRange(int[] arr, int start, int len)1827*795d594fSAndroid Build Coastguard Worker static void $noinline$checkZerosForSetZeroToRange(int[] arr, int start, int len) { 1828*795d594fSAndroid Build Coastguard Worker // Non-zeroes before zeroes. 1829*795d594fSAndroid Build Coastguard Worker int i = 0; 1830*795d594fSAndroid Build Coastguard Worker for (; i < Math.min(start, arr.length); ++i) { 1831*795d594fSAndroid Build Coastguard Worker if (arr[i] == 0) { 1832*795d594fSAndroid Build Coastguard Worker System.out.println("Expected non-zero for arr " + Arrays.toString(arr) + " before zeroes i " 1833*795d594fSAndroid Build Coastguard Worker + i + " start " + start + " and len " + len); 1834*795d594fSAndroid Build Coastguard Worker } 1835*795d594fSAndroid Build Coastguard Worker } 1836*795d594fSAndroid Build Coastguard Worker 1837*795d594fSAndroid Build Coastguard Worker int bound = start + len; 1838*795d594fSAndroid Build Coastguard Worker if (bound < 1 || len < 1) { 1839*795d594fSAndroid Build Coastguard Worker // We always set one zero since it is a do-while. 1840*795d594fSAndroid Build Coastguard Worker bound = i + 1; 1841*795d594fSAndroid Build Coastguard Worker } 1842*795d594fSAndroid Build Coastguard Worker 1843*795d594fSAndroid Build Coastguard Worker for (; i < Math.min(bound, arr.length); ++i) { 1844*795d594fSAndroid Build Coastguard Worker if (arr[i] != 0) { 1845*795d594fSAndroid Build Coastguard Worker System.out.println("Expected zero for arr " + Arrays.toString(arr) + " i " + i + " start " 1846*795d594fSAndroid Build Coastguard Worker + start + " and len " + len); 1847*795d594fSAndroid Build Coastguard Worker } 1848*795d594fSAndroid Build Coastguard Worker } 1849*795d594fSAndroid Build Coastguard Worker 1850*795d594fSAndroid Build Coastguard Worker // Then zeroes until the end. 1851*795d594fSAndroid Build Coastguard Worker for (; i < arr.length; ++i) { 1852*795d594fSAndroid Build Coastguard Worker if (arr[i] == 0) { 1853*795d594fSAndroid Build Coastguard Worker System.out.println("Expected non-zero after zeroes for arr " + Arrays.toString(arr) + " i " 1854*795d594fSAndroid Build Coastguard Worker + i + " start " + start + " and len " + len); 1855*795d594fSAndroid Build Coastguard Worker } 1856*795d594fSAndroid Build Coastguard Worker } 1857*795d594fSAndroid Build Coastguard Worker } 1858*795d594fSAndroid Build Coastguard Worker 1859*795d594fSAndroid Build Coastguard Worker // Make sure this method is compiled with optimizing. 1860*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.main(java.lang.String[]) register (after) 1861*795d594fSAndroid Build Coastguard Worker /// CHECK: ParallelMove 1862*795d594fSAndroid Build Coastguard Worker main(String[] args)1863*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 1864*795d594fSAndroid Build Coastguard Worker System.loadLibrary(args[0]); 1865*795d594fSAndroid Build Coastguard Worker 1866*795d594fSAndroid Build Coastguard Worker if (!compiledWithOptimizing() || 1867*795d594fSAndroid Build Coastguard Worker !hasOatFile() || 1868*795d594fSAndroid Build Coastguard Worker runtimeIsSoftFail() || 1869*795d594fSAndroid Build Coastguard Worker isInterpreted()) { 1870*795d594fSAndroid Build Coastguard Worker disableStackFrameAsserts(); 1871*795d594fSAndroid Build Coastguard Worker } 1872*795d594fSAndroid Build Coastguard Worker 1873*795d594fSAndroid Build Coastguard Worker sieve(20); 1874*795d594fSAndroid Build Coastguard Worker 1875*795d594fSAndroid Build Coastguard Worker int[] x1 = new int[10]; 1876*795d594fSAndroid Build Coastguard Worker int[] x2 = new int[10]; 1877*795d594fSAndroid Build Coastguard Worker int[] x3 = new int[10]; 1878*795d594fSAndroid Build Coastguard Worker modArrayIndex5(x1, -1); 1879*795d594fSAndroid Build Coastguard Worker modArrayIndex5(x2, 0); 1880*795d594fSAndroid Build Coastguard Worker modArrayIndex5(x3, 5); 1881*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) { 1882*795d594fSAndroid Build Coastguard Worker int e1 = 0; 1883*795d594fSAndroid Build Coastguard Worker int e2 = i; 1884*795d594fSAndroid Build Coastguard Worker int e3 = i < 5 ? 0 : i; 1885*795d594fSAndroid Build Coastguard Worker if (x1[i] != e1 || x2[i] != e2 || x3[i] != e3) { 1886*795d594fSAndroid Build Coastguard Worker System.out.println("modarray failed!"); 1887*795d594fSAndroid Build Coastguard Worker } 1888*795d594fSAndroid Build Coastguard Worker } 1889*795d594fSAndroid Build Coastguard Worker 1890*795d594fSAndroid Build Coastguard Worker int[] array = {5, 2, 3, 7, 0, 1, 6, 4}; 1891*795d594fSAndroid Build Coastguard Worker bubbleSort(array); 1892*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 8; i++) { 1893*795d594fSAndroid Build Coastguard Worker if (array[i] != i) { 1894*795d594fSAndroid Build Coastguard Worker System.out.println("bubble sort failed!"); 1895*795d594fSAndroid Build Coastguard Worker } 1896*795d594fSAndroid Build Coastguard Worker } 1897*795d594fSAndroid Build Coastguard Worker 1898*795d594fSAndroid Build Coastguard Worker nonzeroLength(array); 1899*795d594fSAndroid Build Coastguard Worker if (array[0] != 112) { 1900*795d594fSAndroid Build Coastguard Worker System.out.println("nonzero length failed!"); 1901*795d594fSAndroid Build Coastguard Worker } 1902*795d594fSAndroid Build Coastguard Worker 1903*795d594fSAndroid Build Coastguard Worker knownLength(array); 1904*795d594fSAndroid Build Coastguard Worker if (array[0] != 112 || array[1] != 1) { 1905*795d594fSAndroid Build Coastguard Worker System.out.println("nonzero length failed!"); 1906*795d594fSAndroid Build Coastguard Worker } 1907*795d594fSAndroid Build Coastguard Worker array = new int[2]; 1908*795d594fSAndroid Build Coastguard Worker knownLength(array); 1909*795d594fSAndroid Build Coastguard Worker if (array[0] != -1 || array[1] != -2) { 1910*795d594fSAndroid Build Coastguard Worker System.out.println("nonzero length failed!"); 1911*795d594fSAndroid Build Coastguard Worker } 1912*795d594fSAndroid Build Coastguard Worker 1913*795d594fSAndroid Build Coastguard Worker array = new int[8]; 1914*795d594fSAndroid Build Coastguard Worker lengthAlias1(array, 8); 1915*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 8; i++) { 1916*795d594fSAndroid Build Coastguard Worker if (array[i] != 1) { 1917*795d594fSAndroid Build Coastguard Worker System.out.println("alias1 failed!"); 1918*795d594fSAndroid Build Coastguard Worker } 1919*795d594fSAndroid Build Coastguard Worker } 1920*795d594fSAndroid Build Coastguard Worker lengthAlias2(array, 8); 1921*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 8; i++) { 1922*795d594fSAndroid Build Coastguard Worker if (array[i] != 2) { 1923*795d594fSAndroid Build Coastguard Worker System.out.println("alias2 failed!"); 1924*795d594fSAndroid Build Coastguard Worker } 1925*795d594fSAndroid Build Coastguard Worker } 1926*795d594fSAndroid Build Coastguard Worker lengthAlias3(array, 8); 1927*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 8; i++) { 1928*795d594fSAndroid Build Coastguard Worker if (array[i] != 3) { 1929*795d594fSAndroid Build Coastguard Worker System.out.println("alias3 failed!"); 1930*795d594fSAndroid Build Coastguard Worker } 1931*795d594fSAndroid Build Coastguard Worker } 1932*795d594fSAndroid Build Coastguard Worker lengthAlias4(array); 1933*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 8; i++) { 1934*795d594fSAndroid Build Coastguard Worker if (array[i] != 4) { 1935*795d594fSAndroid Build Coastguard Worker System.out.println("alias4 failed!"); 1936*795d594fSAndroid Build Coastguard Worker } 1937*795d594fSAndroid Build Coastguard Worker } 1938*795d594fSAndroid Build Coastguard Worker 1939*795d594fSAndroid Build Coastguard Worker array = new int[10]; 1940*795d594fSAndroid Build Coastguard Worker lengthAlias1(array, /*mismatched value*/ 8); 1941*795d594fSAndroid Build Coastguard Worker lengthAlias2(array, /*mismatched value*/ 8); 1942*795d594fSAndroid Build Coastguard Worker lengthAlias3(array, /*mismatched value*/ 8); 1943*795d594fSAndroid Build Coastguard Worker lengthAlias4(array); // implicit mismatch 1944*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) { 1945*795d594fSAndroid Build Coastguard Worker if (array[i] != 0) { 1946*795d594fSAndroid Build Coastguard Worker System.out.println("mismatch failed!"); 1947*795d594fSAndroid Build Coastguard Worker } 1948*795d594fSAndroid Build Coastguard Worker } 1949*795d594fSAndroid Build Coastguard Worker 1950*795d594fSAndroid Build Coastguard Worker // Zero length array does not break. 1951*795d594fSAndroid Build Coastguard Worker array = new int[0]; 1952*795d594fSAndroid Build Coastguard Worker nonzeroLength(array); 1953*795d594fSAndroid Build Coastguard Worker knownLength(array); 1954*795d594fSAndroid Build Coastguard Worker lengthAlias1(array, 0); 1955*795d594fSAndroid Build Coastguard Worker lengthAlias2(array, 0); 1956*795d594fSAndroid Build Coastguard Worker lengthAlias3(array, 0); 1957*795d594fSAndroid Build Coastguard Worker 1958*795d594fSAndroid Build Coastguard Worker mA = new int[4][4]; 1959*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++) { 1960*795d594fSAndroid Build Coastguard Worker for (int j = 0; j < 4; j++) { 1961*795d594fSAndroid Build Coastguard Worker mA[i][j] = -1; 1962*795d594fSAndroid Build Coastguard Worker } 1963*795d594fSAndroid Build Coastguard Worker } 1964*795d594fSAndroid Build Coastguard Worker dynamicBCEAndIntrinsic(4); 1965*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++) { 1966*795d594fSAndroid Build Coastguard Worker for (int j = 0; j < 4; j++) { 1967*795d594fSAndroid Build Coastguard Worker if (mA[i][i] != 1) { 1968*795d594fSAndroid Build Coastguard Worker System.out.println("dynamic bce failed!"); 1969*795d594fSAndroid Build Coastguard Worker } 1970*795d594fSAndroid Build Coastguard Worker } 1971*795d594fSAndroid Build Coastguard Worker } 1972*795d594fSAndroid Build Coastguard Worker 1973*795d594fSAndroid Build Coastguard Worker array = new int[7]; 1974*795d594fSAndroid Build Coastguard Worker pyramid1(array); 1975*795d594fSAndroid Build Coastguard Worker if (!isPyramid(array)) { 1976*795d594fSAndroid Build Coastguard Worker System.out.println("pyramid1 failed!"); 1977*795d594fSAndroid Build Coastguard Worker } 1978*795d594fSAndroid Build Coastguard Worker 1979*795d594fSAndroid Build Coastguard Worker array = new int[8]; 1980*795d594fSAndroid Build Coastguard Worker pyramid2(array); 1981*795d594fSAndroid Build Coastguard Worker if (!isPyramid(array)) { 1982*795d594fSAndroid Build Coastguard Worker System.out.println("pyramid2 failed!"); 1983*795d594fSAndroid Build Coastguard Worker } 1984*795d594fSAndroid Build Coastguard Worker 1985*795d594fSAndroid Build Coastguard Worker java.util.Arrays.fill(array, -1); 1986*795d594fSAndroid Build Coastguard Worker pyramid3(array); 1987*795d594fSAndroid Build Coastguard Worker if (!isPyramid(array)) { 1988*795d594fSAndroid Build Coastguard Worker System.out.println("pyramid3 failed!"); 1989*795d594fSAndroid Build Coastguard Worker } 1990*795d594fSAndroid Build Coastguard Worker 1991*795d594fSAndroid Build Coastguard Worker // Make sure this value is kept after deoptimization. 1992*795d594fSAndroid Build Coastguard Worker int i = 1; 1993*795d594fSAndroid Build Coastguard Worker if (foo() + i != 100) { 1994*795d594fSAndroid Build Coastguard Worker System.out.println("foo failed!"); 1995*795d594fSAndroid Build Coastguard Worker } 1996*795d594fSAndroid Build Coastguard Worker 1997*795d594fSAndroid Build Coastguard Worker testUnknownBounds(); 1998*795d594fSAndroid Build Coastguard Worker new Main().testExceptionMessage(); 1999*795d594fSAndroid Build Coastguard Worker 2000*795d594fSAndroid Build Coastguard Worker $noinline$testSetZeroToRange(); 2001*795d594fSAndroid Build Coastguard Worker } 2002*795d594fSAndroid Build Coastguard Worker 2003*795d594fSAndroid Build Coastguard Worker public static native boolean compiledWithOptimizing(); 2004*795d594fSAndroid Build Coastguard Worker public static native void disableStackFrameAsserts(); 2005*795d594fSAndroid Build Coastguard Worker public static native void assertIsManaged(); 2006*795d594fSAndroid Build Coastguard Worker public static native void assertIsInterpreted(); 2007*795d594fSAndroid Build Coastguard Worker public static native boolean hasOatFile(); 2008*795d594fSAndroid Build Coastguard Worker public static native boolean runtimeIsSoftFail(); 2009*795d594fSAndroid Build Coastguard Worker public static native boolean isInterpreted(); 2010*795d594fSAndroid Build Coastguard Worker } 2011