xref: /aosp_15_r20/art/test/449-checker-bce/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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