xref: /aosp_15_r20/art/test/530-checker-loops-try-catch/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker //
18*795d594fSAndroid Build Coastguard Worker // Test on loop optimizations, in particular with try catches.
19*795d594fSAndroid Build Coastguard Worker //
20*795d594fSAndroid Build Coastguard Worker public class Main {
21*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
22*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo1(int) loop_optimization (before)
23*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo1(int) loop_optimization (before)
26*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
27*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Mul loop:<<Loop>>
28*795d594fSAndroid Build Coastguard Worker 
29*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo1(int) loop_optimization (after)
30*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>> ParameterValue         loop:none
31*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0          loop:none
32*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Int:i\d+>> IntConstant 1410065408 loop:none
33*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Mul:i\d+>> Mul [<<Par>>,<<Int>>]  loop:none
34*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>> Add [<<Mul>>,<<Zer>>]  loop:none
35*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Add>>]       loop:none
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo1(int) loop_optimization (after)
38*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
$noinline$geo1(int a)39*795d594fSAndroid Build Coastguard Worker   private static int $noinline$geo1(int a) {
40*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
41*795d594fSAndroid Build Coastguard Worker       a *= 10;
42*795d594fSAndroid Build Coastguard Worker     }
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker     // Outer try catch does not block loop optimizations.
45*795d594fSAndroid Build Coastguard Worker     try {
46*795d594fSAndroid Build Coastguard Worker       if (doThrow) {
47*795d594fSAndroid Build Coastguard Worker         $noinline$unreachable();
48*795d594fSAndroid Build Coastguard Worker       }
49*795d594fSAndroid Build Coastguard Worker     } catch (Error e) {
50*795d594fSAndroid Build Coastguard Worker       System.out.println("Not expected");
51*795d594fSAndroid Build Coastguard Worker     }
52*795d594fSAndroid Build Coastguard Worker     return a;
53*795d594fSAndroid Build Coastguard Worker   }
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
56*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo1_Blocking(int) loop_optimization (before)
57*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
58*795d594fSAndroid Build Coastguard Worker 
59*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo1_Blocking(int) loop_optimization (before)
60*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
61*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Mul loop:<<Loop>>
62*795d594fSAndroid Build Coastguard Worker 
63*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo1_Blocking(int) loop_optimization (after)
64*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
65*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Mul loop:<<Loop>>
$noinline$geo1_Blocking(int a)66*795d594fSAndroid Build Coastguard Worker   private static int $noinline$geo1_Blocking(int a) {
67*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
68*795d594fSAndroid Build Coastguard Worker       a *= 10;
69*795d594fSAndroid Build Coastguard Worker 
70*795d594fSAndroid Build Coastguard Worker       // Try catch blocks optimizations.
71*795d594fSAndroid Build Coastguard Worker       try {
72*795d594fSAndroid Build Coastguard Worker         if (doThrow) {
73*795d594fSAndroid Build Coastguard Worker           $noinline$unreachable();
74*795d594fSAndroid Build Coastguard Worker         }
75*795d594fSAndroid Build Coastguard Worker       } catch (Error e) {
76*795d594fSAndroid Build Coastguard Worker         System.out.println("Not expected");
77*795d594fSAndroid Build Coastguard Worker       }
78*795d594fSAndroid Build Coastguard Worker     }
79*795d594fSAndroid Build Coastguard Worker     return a;
80*795d594fSAndroid Build Coastguard Worker   }
81*795d594fSAndroid Build Coastguard Worker 
82*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
83*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo2(int) loop_optimization (before)
84*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
85*795d594fSAndroid Build Coastguard Worker 
86*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo2(int) loop_optimization (before)
87*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
88*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Shl loop:<<Loop>>
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo2(int) loop_optimization (after)
91*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>> ParameterValue        loop:none
92*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0         loop:none
93*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Int:i\d+>> IntConstant 1024      loop:none
94*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Mul:i\d+>> Mul [<<Par>>,<<Int>>] loop:none
95*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>> Add [<<Mul>>,<<Zer>>] loop:none
96*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Add>>]      loop:none
97*795d594fSAndroid Build Coastguard Worker 
98*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo2(int) loop_optimization (after)
99*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
$noinline$geo2(int a)100*795d594fSAndroid Build Coastguard Worker   private static int $noinline$geo2(int a) {
101*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
102*795d594fSAndroid Build Coastguard Worker       a <<= 1;
103*795d594fSAndroid Build Coastguard Worker     }
104*795d594fSAndroid Build Coastguard Worker 
105*795d594fSAndroid Build Coastguard Worker     // Outer try catch does not block loop optimizations.
106*795d594fSAndroid Build Coastguard Worker     try {
107*795d594fSAndroid Build Coastguard Worker       if (doThrow) {
108*795d594fSAndroid Build Coastguard Worker         $noinline$unreachable();
109*795d594fSAndroid Build Coastguard Worker       }
110*795d594fSAndroid Build Coastguard Worker     } catch (Error e) {
111*795d594fSAndroid Build Coastguard Worker       System.out.println("Not expected");
112*795d594fSAndroid Build Coastguard Worker     }
113*795d594fSAndroid Build Coastguard Worker     return a;
114*795d594fSAndroid Build Coastguard Worker   }
115*795d594fSAndroid Build Coastguard Worker 
116*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
117*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo2_Blocking(int) loop_optimization (before)
118*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
119*795d594fSAndroid Build Coastguard Worker 
120*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo2_Blocking(int) loop_optimization (before)
121*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
122*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Shl loop:<<Loop>>
123*795d594fSAndroid Build Coastguard Worker 
124*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo2_Blocking(int) loop_optimization (after)
125*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
126*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Shl loop:<<Loop>>
$noinline$geo2_Blocking(int a)127*795d594fSAndroid Build Coastguard Worker   private static int $noinline$geo2_Blocking(int a) {
128*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
129*795d594fSAndroid Build Coastguard Worker       a <<= 1;
130*795d594fSAndroid Build Coastguard Worker 
131*795d594fSAndroid Build Coastguard Worker       // Try catch blocks optimizations.
132*795d594fSAndroid Build Coastguard Worker       try {
133*795d594fSAndroid Build Coastguard Worker         if (doThrow) {
134*795d594fSAndroid Build Coastguard Worker           $noinline$unreachable();
135*795d594fSAndroid Build Coastguard Worker         }
136*795d594fSAndroid Build Coastguard Worker       } catch (Error e) {
137*795d594fSAndroid Build Coastguard Worker         System.out.println("Not expected");
138*795d594fSAndroid Build Coastguard Worker       }
139*795d594fSAndroid Build Coastguard Worker     }
140*795d594fSAndroid Build Coastguard Worker     return a;
141*795d594fSAndroid Build Coastguard Worker   }
142*795d594fSAndroid Build Coastguard Worker 
143*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
144*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo3(int) loop_optimization (before)
145*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
146*795d594fSAndroid Build Coastguard Worker 
147*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo3(int) loop_optimization (before)
148*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
149*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Div loop:<<Loop>>
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo3(int) loop_optimization (after)
152*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>> ParameterValue        loop:none
153*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0         loop:none
154*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Int:i\d+>> IntConstant 59049     loop:none
155*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Div:i\d+>> Div [<<Par>>,<<Int>>] loop:none
156*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>> Add [<<Div>>,<<Zer>>] loop:none
157*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Add>>]      loop:none
158*795d594fSAndroid Build Coastguard Worker 
159*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo3(int) loop_optimization (after)
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
$noinline$geo3(int a)161*795d594fSAndroid Build Coastguard Worker   private static int $noinline$geo3(int a) {
162*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
163*795d594fSAndroid Build Coastguard Worker       a /= 3;
164*795d594fSAndroid Build Coastguard Worker     }
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker     // Outer try catch does not block loop optimizations.
167*795d594fSAndroid Build Coastguard Worker     try {
168*795d594fSAndroid Build Coastguard Worker       if (doThrow) {
169*795d594fSAndroid Build Coastguard Worker         $noinline$unreachable();
170*795d594fSAndroid Build Coastguard Worker       }
171*795d594fSAndroid Build Coastguard Worker     } catch (Error e) {
172*795d594fSAndroid Build Coastguard Worker       System.out.println("Not expected");
173*795d594fSAndroid Build Coastguard Worker     }
174*795d594fSAndroid Build Coastguard Worker     return a;
175*795d594fSAndroid Build Coastguard Worker   }
176*795d594fSAndroid Build Coastguard Worker 
177*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
178*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo3_Blocking(int) loop_optimization (before)
179*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
180*795d594fSAndroid Build Coastguard Worker 
181*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo3_Blocking(int) loop_optimization (before)
182*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
183*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Div loop:<<Loop>>
184*795d594fSAndroid Build Coastguard Worker 
185*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo3_Blocking(int) loop_optimization (after)
186*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
187*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Div loop:<<Loop>>
$noinline$geo3_Blocking(int a)188*795d594fSAndroid Build Coastguard Worker   private static int $noinline$geo3_Blocking(int a) {
189*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
190*795d594fSAndroid Build Coastguard Worker       a /= 3;
191*795d594fSAndroid Build Coastguard Worker 
192*795d594fSAndroid Build Coastguard Worker       // Try catch blocks optimizations.
193*795d594fSAndroid Build Coastguard Worker       try {
194*795d594fSAndroid Build Coastguard Worker         if (doThrow) {
195*795d594fSAndroid Build Coastguard Worker           $noinline$unreachable();
196*795d594fSAndroid Build Coastguard Worker         }
197*795d594fSAndroid Build Coastguard Worker       } catch (Error e) {
198*795d594fSAndroid Build Coastguard Worker         System.out.println("Not expected");
199*795d594fSAndroid Build Coastguard Worker       }
200*795d594fSAndroid Build Coastguard Worker     }
201*795d594fSAndroid Build Coastguard Worker     return a;
202*795d594fSAndroid Build Coastguard Worker   }
203*795d594fSAndroid Build Coastguard Worker 
204*795d594fSAndroid Build Coastguard Worker 
205*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
206*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo4(int) loop_optimization (before)
207*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
208*795d594fSAndroid Build Coastguard Worker 
209*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo4(int) loop_optimization (before)
210*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
211*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Rem loop:<<Loop>>
212*795d594fSAndroid Build Coastguard Worker 
213*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo4(int) loop_optimization (after)
214*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>> ParameterValue        loop:none
215*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Int:i\d+>> IntConstant 7         loop:none
216*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Rem:i\d+>> Rem [<<Par>>,<<Int>>] loop:none
217*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Rem>>]      loop:none
218*795d594fSAndroid Build Coastguard Worker 
219*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo4(int) loop_optimization (after)
220*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
$noinline$geo4(int a)221*795d594fSAndroid Build Coastguard Worker   private static int $noinline$geo4(int a) {
222*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
223*795d594fSAndroid Build Coastguard Worker       a %= 7; // a wrap-around induction
224*795d594fSAndroid Build Coastguard Worker     }
225*795d594fSAndroid Build Coastguard Worker 
226*795d594fSAndroid Build Coastguard Worker     // Outer try catch does not block loop optimizations.
227*795d594fSAndroid Build Coastguard Worker     try {
228*795d594fSAndroid Build Coastguard Worker       if (doThrow) {
229*795d594fSAndroid Build Coastguard Worker         $noinline$unreachable();
230*795d594fSAndroid Build Coastguard Worker       }
231*795d594fSAndroid Build Coastguard Worker     } catch (Error e) {
232*795d594fSAndroid Build Coastguard Worker       System.out.println("Not expected");
233*795d594fSAndroid Build Coastguard Worker     }
234*795d594fSAndroid Build Coastguard Worker     return a;
235*795d594fSAndroid Build Coastguard Worker   }
236*795d594fSAndroid Build Coastguard Worker 
237*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
238*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo4_Blocking(int) loop_optimization (before)
239*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
240*795d594fSAndroid Build Coastguard Worker 
241*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo4_Blocking(int) loop_optimization (before)
242*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
243*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Rem loop:<<Loop>>
244*795d594fSAndroid Build Coastguard Worker 
245*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo4_Blocking(int) loop_optimization (after)
246*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
247*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Rem loop:<<Loop>>
$noinline$geo4_Blocking(int a)248*795d594fSAndroid Build Coastguard Worker   private static int $noinline$geo4_Blocking(int a) {
249*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
250*795d594fSAndroid Build Coastguard Worker       a %= 7; // a wrap-around induction
251*795d594fSAndroid Build Coastguard Worker 
252*795d594fSAndroid Build Coastguard Worker       // Try catch blocks optimizations.
253*795d594fSAndroid Build Coastguard Worker       try {
254*795d594fSAndroid Build Coastguard Worker         if (doThrow) {
255*795d594fSAndroid Build Coastguard Worker           $noinline$unreachable();
256*795d594fSAndroid Build Coastguard Worker         }
257*795d594fSAndroid Build Coastguard Worker       } catch (Error e) {
258*795d594fSAndroid Build Coastguard Worker         System.out.println("Not expected");
259*795d594fSAndroid Build Coastguard Worker       }
260*795d594fSAndroid Build Coastguard Worker     }
261*795d594fSAndroid Build Coastguard Worker     return a;
262*795d594fSAndroid Build Coastguard Worker   }
263*795d594fSAndroid Build Coastguard Worker 
264*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
265*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo5() loop_optimization (before)
266*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
267*795d594fSAndroid Build Coastguard Worker 
268*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo5() loop_optimization (before)
269*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
270*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Shr loop:<<Loop>>
271*795d594fSAndroid Build Coastguard Worker 
272*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo5() loop_optimization (after)
273*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0          loop:none
274*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Int1:i\d+>> IntConstant 2147483647 loop:none
275*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Int2:i\d+>> IntConstant 1024       loop:none
276*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Div:i\d+>>  Div [<<Int1>>,<<Int2>>] loop:none
277*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>  Add [<<Div>>,<<Zero>>]  loop:none
278*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Add>>]        loop:none
279*795d594fSAndroid Build Coastguard Worker 
280*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo5() loop_optimization (after)
281*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
$noinline$geo5()282*795d594fSAndroid Build Coastguard Worker   private static int $noinline$geo5() {
283*795d594fSAndroid Build Coastguard Worker     int a = 0x7fffffff;
284*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
285*795d594fSAndroid Build Coastguard Worker       a >>= 1;
286*795d594fSAndroid Build Coastguard Worker     }
287*795d594fSAndroid Build Coastguard Worker 
288*795d594fSAndroid Build Coastguard Worker     // Outer try catch does not block loop optimizations.
289*795d594fSAndroid Build Coastguard Worker     try {
290*795d594fSAndroid Build Coastguard Worker       if (doThrow) {
291*795d594fSAndroid Build Coastguard Worker         $noinline$unreachable();
292*795d594fSAndroid Build Coastguard Worker       }
293*795d594fSAndroid Build Coastguard Worker     } catch (Error e) {
294*795d594fSAndroid Build Coastguard Worker       System.out.println("Not expected");
295*795d594fSAndroid Build Coastguard Worker     }
296*795d594fSAndroid Build Coastguard Worker     return a;
297*795d594fSAndroid Build Coastguard Worker   }
298*795d594fSAndroid Build Coastguard Worker 
299*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
300*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo5_Blocking() loop_optimization (before)
301*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
302*795d594fSAndroid Build Coastguard Worker 
303*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo5_Blocking() loop_optimization (before)
304*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
305*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Shr loop:<<Loop>>
306*795d594fSAndroid Build Coastguard Worker 
307*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$geo5_Blocking() loop_optimization (after)
308*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
309*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Shr loop:<<Loop>>
$noinline$geo5_Blocking()310*795d594fSAndroid Build Coastguard Worker   private static int $noinline$geo5_Blocking() {
311*795d594fSAndroid Build Coastguard Worker     int a = 0x7fffffff;
312*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
313*795d594fSAndroid Build Coastguard Worker       a >>= 1;
314*795d594fSAndroid Build Coastguard Worker 
315*795d594fSAndroid Build Coastguard Worker       // Try catch blocks optimizations.
316*795d594fSAndroid Build Coastguard Worker       try {
317*795d594fSAndroid Build Coastguard Worker         if (doThrow) {
318*795d594fSAndroid Build Coastguard Worker           $noinline$unreachable();
319*795d594fSAndroid Build Coastguard Worker         }
320*795d594fSAndroid Build Coastguard Worker       } catch (Error e) {
321*795d594fSAndroid Build Coastguard Worker         System.out.println("Not expected");
322*795d594fSAndroid Build Coastguard Worker       }
323*795d594fSAndroid Build Coastguard Worker     }
324*795d594fSAndroid Build Coastguard Worker     return a;
325*795d594fSAndroid Build Coastguard Worker   }
326*795d594fSAndroid Build Coastguard Worker 
327*795d594fSAndroid Build Coastguard Worker   // Tests taken from 530-checker-loops4
$noinline$loops4Tests()328*795d594fSAndroid Build Coastguard Worker   private static void $noinline$loops4Tests() {
329*795d594fSAndroid Build Coastguard Worker     int m = 1410065408;
330*795d594fSAndroid Build Coastguard Worker     for (int i = -100; i <= 100; i++) {
331*795d594fSAndroid Build Coastguard Worker       expectEquals(m * i, $noinline$geo1(i));
332*795d594fSAndroid Build Coastguard Worker       expectEquals(m * i, $noinline$geo1_Blocking(i));
333*795d594fSAndroid Build Coastguard Worker     }
334*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i <= 1000000000; i *= 10) {
335*795d594fSAndroid Build Coastguard Worker       expectEquals(m * i, $noinline$geo1(i));
336*795d594fSAndroid Build Coastguard Worker       expectEquals(m * i, $noinline$geo1_Blocking(i));
337*795d594fSAndroid Build Coastguard Worker       expectEquals(-m * i, $noinline$geo1(-i));
338*795d594fSAndroid Build Coastguard Worker       expectEquals(-m * i, $noinline$geo1_Blocking(-i));
339*795d594fSAndroid Build Coastguard Worker     }
340*795d594fSAndroid Build Coastguard Worker 
341*795d594fSAndroid Build Coastguard Worker     for (int i = -100; i <= 100; i++) {
342*795d594fSAndroid Build Coastguard Worker       expectEquals(i << 10, $noinline$geo2(i));
343*795d594fSAndroid Build Coastguard Worker       expectEquals(i << 10, $noinline$geo2_Blocking(i));
344*795d594fSAndroid Build Coastguard Worker     }
345*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 22; i++) {
346*795d594fSAndroid Build Coastguard Worker       expectEquals(1 << (i + 10), $noinline$geo2(1 << i));
347*795d594fSAndroid Build Coastguard Worker       expectEquals(1 << (i + 10), $noinline$geo2_Blocking(1 << i));
348*795d594fSAndroid Build Coastguard Worker     }
349*795d594fSAndroid Build Coastguard Worker     expectEquals(0x80000400, $noinline$geo2(0x00200001));
350*795d594fSAndroid Build Coastguard Worker     expectEquals(0x80000400, $noinline$geo2_Blocking(0x00200001));
351*795d594fSAndroid Build Coastguard Worker     expectEquals(0x00000000, $noinline$geo2(0x00400000));
352*795d594fSAndroid Build Coastguard Worker     expectEquals(0x00000000, $noinline$geo2_Blocking(0x00400000));
353*795d594fSAndroid Build Coastguard Worker     expectEquals(0x00000400, $noinline$geo2(0x00400001));
354*795d594fSAndroid Build Coastguard Worker     expectEquals(0x00000400, $noinline$geo2_Blocking(0x00400001));
355*795d594fSAndroid Build Coastguard Worker 
356*795d594fSAndroid Build Coastguard Worker     int d = 59049;
357*795d594fSAndroid Build Coastguard Worker     for (int i = -100; i <= 100; i++) {
358*795d594fSAndroid Build Coastguard Worker       expectEquals(0, $noinline$geo3(i));
359*795d594fSAndroid Build Coastguard Worker       expectEquals(0, $noinline$geo3_Blocking(i));
360*795d594fSAndroid Build Coastguard Worker     }
361*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i <= 100; i++) {
362*795d594fSAndroid Build Coastguard Worker       expectEquals(i, $noinline$geo3(i * d));
363*795d594fSAndroid Build Coastguard Worker       expectEquals(i, $noinline$geo3_Blocking(i * d));
364*795d594fSAndroid Build Coastguard Worker       expectEquals(i, $noinline$geo3(i * d + 1));
365*795d594fSAndroid Build Coastguard Worker       expectEquals(i, $noinline$geo3_Blocking(i * d + 1));
366*795d594fSAndroid Build Coastguard Worker       expectEquals(-i, $noinline$geo3(-i * d));
367*795d594fSAndroid Build Coastguard Worker       expectEquals(-i, $noinline$geo3_Blocking(-i * d));
368*795d594fSAndroid Build Coastguard Worker       expectEquals(-i, $noinline$geo3(-i * d - 1));
369*795d594fSAndroid Build Coastguard Worker       expectEquals(-i, $noinline$geo3_Blocking(-i * d - 1));
370*795d594fSAndroid Build Coastguard Worker     }
371*795d594fSAndroid Build Coastguard Worker 
372*795d594fSAndroid Build Coastguard Worker     for (int i = -100; i <= 100; i++) {
373*795d594fSAndroid Build Coastguard Worker       expectEquals(i % 7, $noinline$geo4(i));
374*795d594fSAndroid Build Coastguard Worker       expectEquals(i % 7, $noinline$geo4_Blocking(i));
375*795d594fSAndroid Build Coastguard Worker     }
376*795d594fSAndroid Build Coastguard Worker 
377*795d594fSAndroid Build Coastguard Worker     expectEquals(0x1fffff, $noinline$geo5());
378*795d594fSAndroid Build Coastguard Worker     expectEquals(0x1fffff, $noinline$geo5_Blocking());
379*795d594fSAndroid Build Coastguard Worker   }
380*795d594fSAndroid Build Coastguard Worker 
381*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
382*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly1() loop_optimization (before)
383*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
384*795d594fSAndroid Build Coastguard Worker 
385*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly1() loop_optimization (before)
386*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
387*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
388*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
389*795d594fSAndroid Build Coastguard Worker 
390*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly1() loop_optimization (after)
391*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0         loop:none
392*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Int:i\d+>> IntConstant 55        loop:none
393*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>> Add [<<Int>>,<<Zer>>] loop:none
394*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Add>>]      loop:none
395*795d594fSAndroid Build Coastguard Worker 
396*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly1() instruction_simplifier$before_codegen (after)
397*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Int:i\d+>>  IntConstant 55 loop:none
398*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Int>>]  loop:none
399*795d594fSAndroid Build Coastguard Worker 
400*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly1() loop_optimization (after)
401*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
$noinline$poly1()402*795d594fSAndroid Build Coastguard Worker   private static int $noinline$poly1() {
403*795d594fSAndroid Build Coastguard Worker     int a = 0;
404*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i <= 10; i++) {
405*795d594fSAndroid Build Coastguard Worker       a += i;
406*795d594fSAndroid Build Coastguard Worker     }
407*795d594fSAndroid Build Coastguard Worker 
408*795d594fSAndroid Build Coastguard Worker     // Outer try catch does not block loop optimizations.
409*795d594fSAndroid Build Coastguard Worker     try {
410*795d594fSAndroid Build Coastguard Worker       if (doThrow) {
411*795d594fSAndroid Build Coastguard Worker         $noinline$unreachable();
412*795d594fSAndroid Build Coastguard Worker       }
413*795d594fSAndroid Build Coastguard Worker     } catch (Error e) {
414*795d594fSAndroid Build Coastguard Worker       System.out.println("Not expected");
415*795d594fSAndroid Build Coastguard Worker     }
416*795d594fSAndroid Build Coastguard Worker 
417*795d594fSAndroid Build Coastguard Worker     return a;
418*795d594fSAndroid Build Coastguard Worker   }
419*795d594fSAndroid Build Coastguard Worker 
420*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
421*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly1_Blocking() loop_optimization (before)
422*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
423*795d594fSAndroid Build Coastguard Worker 
424*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly1_Blocking() loop_optimization (before)
425*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
426*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
427*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
428*795d594fSAndroid Build Coastguard Worker 
429*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly1_Blocking() loop_optimization (after)
430*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
431*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
432*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
$noinline$poly1_Blocking()433*795d594fSAndroid Build Coastguard Worker   private static int $noinline$poly1_Blocking() {
434*795d594fSAndroid Build Coastguard Worker     int a = 0;
435*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i <= 10; i++) {
436*795d594fSAndroid Build Coastguard Worker       a += i;
437*795d594fSAndroid Build Coastguard Worker 
438*795d594fSAndroid Build Coastguard Worker       // Try catch blocks optimizations.
439*795d594fSAndroid Build Coastguard Worker       try {
440*795d594fSAndroid Build Coastguard Worker         if (doThrow) {
441*795d594fSAndroid Build Coastguard Worker           $noinline$unreachable();
442*795d594fSAndroid Build Coastguard Worker         }
443*795d594fSAndroid Build Coastguard Worker       } catch (Error e) {
444*795d594fSAndroid Build Coastguard Worker         System.out.println("Not expected");
445*795d594fSAndroid Build Coastguard Worker       }
446*795d594fSAndroid Build Coastguard Worker     }
447*795d594fSAndroid Build Coastguard Worker 
448*795d594fSAndroid Build Coastguard Worker     return a;
449*795d594fSAndroid Build Coastguard Worker   }
450*795d594fSAndroid Build Coastguard Worker 
451*795d594fSAndroid Build Coastguard Worker   // Multiplication in linear induction has been optimized earlier,
452*795d594fSAndroid Build Coastguard Worker   // but that does not stop the induction variable recognition
453*795d594fSAndroid Build Coastguard Worker   // and loop optimizer.
454*795d594fSAndroid Build Coastguard Worker   //
455*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
456*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly2(int) loop_optimization (before)
457*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
458*795d594fSAndroid Build Coastguard Worker 
459*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly2(int) loop_optimization (before)
460*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
461*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Shl loop:<<Loop>>
462*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
463*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
464*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
465*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
466*795d594fSAndroid Build Coastguard Worker 
467*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly2(int) loop_optimization (after)
468*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Par:i\d+>> ParameterValue        loop:none
469*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Int:i\d+>> IntConstant 185       loop:none
470*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>> Add [<<Int>>,<<Par>>] loop:none
471*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Add>>]      loop:none
472*795d594fSAndroid Build Coastguard Worker 
473*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly2(int) loop_optimization (after)
474*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
$noinline$poly2(int a)475*795d594fSAndroid Build Coastguard Worker   private static int $noinline$poly2(int a) {
476*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
477*795d594fSAndroid Build Coastguard Worker       int k = 3 * i + 5;
478*795d594fSAndroid Build Coastguard Worker       a += k;
479*795d594fSAndroid Build Coastguard Worker     }
480*795d594fSAndroid Build Coastguard Worker 
481*795d594fSAndroid Build Coastguard Worker     // Outer try catch does not block loop optimizations.
482*795d594fSAndroid Build Coastguard Worker     try {
483*795d594fSAndroid Build Coastguard Worker       if (doThrow) {
484*795d594fSAndroid Build Coastguard Worker         $noinline$unreachable();
485*795d594fSAndroid Build Coastguard Worker       }
486*795d594fSAndroid Build Coastguard Worker     } catch (Error e) {
487*795d594fSAndroid Build Coastguard Worker       System.out.println("Not expected");
488*795d594fSAndroid Build Coastguard Worker     }
489*795d594fSAndroid Build Coastguard Worker     return a;
490*795d594fSAndroid Build Coastguard Worker   }
491*795d594fSAndroid Build Coastguard Worker 
492*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
493*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly2_Blocking(int) loop_optimization (before)
494*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
495*795d594fSAndroid Build Coastguard Worker 
496*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly2_Blocking(int) loop_optimization (before)
497*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
498*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Shl loop:<<Loop>>
499*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
500*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
501*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
502*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
503*795d594fSAndroid Build Coastguard Worker 
504*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly2_Blocking(int) loop_optimization (after)
505*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
506*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Shl loop:<<Loop>>
507*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
508*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
509*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
510*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
$noinline$poly2_Blocking(int a)511*795d594fSAndroid Build Coastguard Worker   private static int $noinline$poly2_Blocking(int a) {
512*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
513*795d594fSAndroid Build Coastguard Worker       int k = 3 * i + 5;
514*795d594fSAndroid Build Coastguard Worker       a += k;
515*795d594fSAndroid Build Coastguard Worker 
516*795d594fSAndroid Build Coastguard Worker       // Try catch blocks optimizations.
517*795d594fSAndroid Build Coastguard Worker       try {
518*795d594fSAndroid Build Coastguard Worker         if (doThrow) {
519*795d594fSAndroid Build Coastguard Worker           $noinline$unreachable();
520*795d594fSAndroid Build Coastguard Worker         }
521*795d594fSAndroid Build Coastguard Worker       } catch (Error e) {
522*795d594fSAndroid Build Coastguard Worker         System.out.println("Not expected");
523*795d594fSAndroid Build Coastguard Worker       }
524*795d594fSAndroid Build Coastguard Worker     }
525*795d594fSAndroid Build Coastguard Worker 
526*795d594fSAndroid Build Coastguard Worker     return a;
527*795d594fSAndroid Build Coastguard Worker   }
528*795d594fSAndroid Build Coastguard Worker 
529*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
530*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly3() loop_optimization (before)
531*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
532*795d594fSAndroid Build Coastguard Worker 
533*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly3() loop_optimization (before)
534*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
535*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
536*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
537*795d594fSAndroid Build Coastguard Worker 
538*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly3() loop_optimization (after)
539*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Ini:i\d+>> IntConstant 12345       loop:none
540*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Int:i\d+>> IntConstant -2146736968 loop:none
541*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>> Add [<<Int>>,<<Ini>>]   loop:none
542*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              Return [<<Add>>]        loop:none
543*795d594fSAndroid Build Coastguard Worker 
544*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly3() instruction_simplifier$before_codegen (after)
545*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Int:i\d+>>  IntConstant -2146724623 loop:none
546*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:               Return [<<Int>>]        loop:none
547*795d594fSAndroid Build Coastguard Worker 
548*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly3() loop_optimization (after)
549*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
$noinline$poly3()550*795d594fSAndroid Build Coastguard Worker   private static int $noinline$poly3() {
551*795d594fSAndroid Build Coastguard Worker     int a = 12345;
552*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i <= 10; i++) {
553*795d594fSAndroid Build Coastguard Worker       a += (2147483646 * i + 67890);
554*795d594fSAndroid Build Coastguard Worker     }
555*795d594fSAndroid Build Coastguard Worker 
556*795d594fSAndroid Build Coastguard Worker     // Outer try catch does not block loop optimizations.
557*795d594fSAndroid Build Coastguard Worker     try {
558*795d594fSAndroid Build Coastguard Worker       if (doThrow) {
559*795d594fSAndroid Build Coastguard Worker         $noinline$unreachable();
560*795d594fSAndroid Build Coastguard Worker       }
561*795d594fSAndroid Build Coastguard Worker     } catch (Error e) {
562*795d594fSAndroid Build Coastguard Worker       System.out.println("Not expected");
563*795d594fSAndroid Build Coastguard Worker     }
564*795d594fSAndroid Build Coastguard Worker     return a;
565*795d594fSAndroid Build Coastguard Worker   }
566*795d594fSAndroid Build Coastguard Worker 
567*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
568*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly3_Blocking() loop_optimization (before)
569*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
570*795d594fSAndroid Build Coastguard Worker 
571*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly3_Blocking() loop_optimization (before)
572*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
573*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
574*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
575*795d594fSAndroid Build Coastguard Worker 
576*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$poly3_Blocking() loop_optimization (after)
577*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Phi loop:<<Loop:B\d+>>
578*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
579*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Add loop:<<Loop>>
$noinline$poly3_Blocking()580*795d594fSAndroid Build Coastguard Worker   private static int $noinline$poly3_Blocking() {
581*795d594fSAndroid Build Coastguard Worker     int a = 12345;
582*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i <= 10; i++) {
583*795d594fSAndroid Build Coastguard Worker       a += (2147483646 * i + 67890);
584*795d594fSAndroid Build Coastguard Worker 
585*795d594fSAndroid Build Coastguard Worker       // Try catch blocks optimizations.
586*795d594fSAndroid Build Coastguard Worker       try {
587*795d594fSAndroid Build Coastguard Worker         if (doThrow) {
588*795d594fSAndroid Build Coastguard Worker           $noinline$unreachable();
589*795d594fSAndroid Build Coastguard Worker         }
590*795d594fSAndroid Build Coastguard Worker       } catch (Error e) {
591*795d594fSAndroid Build Coastguard Worker         System.out.println("Not expected");
592*795d594fSAndroid Build Coastguard Worker       }
593*795d594fSAndroid Build Coastguard Worker     }
594*795d594fSAndroid Build Coastguard Worker     return a;
595*795d594fSAndroid Build Coastguard Worker   }
596*795d594fSAndroid Build Coastguard Worker 
597*795d594fSAndroid Build Coastguard Worker   // Tests taken from 530-checker-loops5
$noinline$loops5Tests()598*795d594fSAndroid Build Coastguard Worker   private static void $noinline$loops5Tests() {
599*795d594fSAndroid Build Coastguard Worker     expectEquals(55, $noinline$poly1());
600*795d594fSAndroid Build Coastguard Worker     expectEquals(55, $noinline$poly1_Blocking());
601*795d594fSAndroid Build Coastguard Worker     expectEquals(185, $noinline$poly2(0));
602*795d594fSAndroid Build Coastguard Worker     expectEquals(185, $noinline$poly2_Blocking(0));
603*795d594fSAndroid Build Coastguard Worker     expectEquals(192, $noinline$poly2(7));
604*795d594fSAndroid Build Coastguard Worker     expectEquals(192, $noinline$poly2_Blocking(7));
605*795d594fSAndroid Build Coastguard Worker     expectEquals(-2146724623, $noinline$poly3());
606*795d594fSAndroid Build Coastguard Worker     expectEquals(-2146724623, $noinline$poly3_Blocking());
607*795d594fSAndroid Build Coastguard Worker   }
608*795d594fSAndroid Build Coastguard Worker 
609*795d594fSAndroid Build Coastguard Worker   // Constants used for peel unroll tests.
610*795d594fSAndroid Build Coastguard Worker   private static final int LENGTH = 4 * 1024;
611*795d594fSAndroid Build Coastguard Worker   private static final int RESULT_POS = 4;
612*795d594fSAndroid Build Coastguard Worker 
initIntArray(int[] a)613*795d594fSAndroid Build Coastguard Worker   private static final void initIntArray(int[] a) {
614*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
615*795d594fSAndroid Build Coastguard Worker       a[i] = i % 4;
616*795d594fSAndroid Build Coastguard Worker     }
617*795d594fSAndroid Build Coastguard Worker   }
618*795d594fSAndroid Build Coastguard Worker 
619*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
620*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination(int[]) loop_optimization (after)
621*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
622*795d594fSAndroid Build Coastguard Worker 
623*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination(int[]) loop_optimization (before)
624*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
625*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
626*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   IntConstant 4094                          loop:none
627*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>     Phi                                       loop:<<Loop:B\d+>> outer_loop:none
628*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<Phi>>,<<Limit>>]    loop:<<Loop>>      outer_loop:none
629*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>      If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
630*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<Phi>>]              loop:<<Loop>>      outer_loop:none
631*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>  Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
632*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<IndAdd>>]           loop:<<Loop>>      outer_loop:none
633*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>     Add [<<Get0>>,<<Get1>>]                   loop:<<Loop>>      outer_loop:none
634*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<Phi>>,<<Add>>]      loop:<<Loop>>      outer_loop:none
635*795d594fSAndroid Build Coastguard Worker 
636*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination(int[]) loop_optimization (before)
637*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
638*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
639*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
640*795d594fSAndroid Build Coastguard Worker 
641*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination(int[]) loop_optimization (before)
642*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
643*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
644*795d594fSAndroid Build Coastguard Worker 
645*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination(int[]) loop_optimization (after)
646*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
647*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                             loop:none
648*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
649*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   IntConstant 4094                          loop:none
650*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>     Phi                                       loop:<<Loop:B\d+>> outer_loop:none
651*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<Phi>>,<<Limit>>]    loop:<<Loop>>      outer_loop:none
652*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>      If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
653*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<Phi>>]              loop:<<Loop>>      outer_loop:none
654*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>  Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
655*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<IndAdd>>]           loop:<<Loop>>      outer_loop:none
656*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>     Add [<<Get0>>,<<Get1>>]                   loop:<<Loop>>      outer_loop:none
657*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<Phi>>,<<Add>>]      loop:<<Loop>>      outer_loop:none
658*795d594fSAndroid Build Coastguard Worker   //
659*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CheckA:z\d+>>  GreaterThanOrEqual [<<IndAdd>>,<<Limit>>] loop:<<Loop>>      outer_loop:none
660*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IfA:v\d+>>     If [<<Const0>>]                           loop:<<Loop>>      outer_loop:none
661*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0A:i\d+>>   ArrayGet [<<Array>>,<<IndAdd>>]           loop:<<Loop>>      outer_loop:none
662*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAddA:i\d+>> Add [<<IndAdd>>,<<Const1>>]               loop:<<Loop>>      outer_loop:none
663*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1A:i\d+>>   ArrayGet [<<Array>>,<<IndAddA>>]          loop:<<Loop>>      outer_loop:none
664*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddA:i\d+>>    Add [<<Get0A>>,<<Get1A>>]                 loop:<<Loop>>      outer_loop:none
665*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<IndAdd>>,<<AddA>>]  loop:<<Loop>>      outer_loop:none
666*795d594fSAndroid Build Coastguard Worker 
667*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination(int[]) loop_optimization (after)
668*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
669*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
670*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
671*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
672*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
673*795d594fSAndroid Build Coastguard Worker 
674*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination(int[]) loop_optimization (after)
675*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
676*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
677*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
$noinline$unrollingLoadStoreElimination(int[] a)678*795d594fSAndroid Build Coastguard Worker   private static final void $noinline$unrollingLoadStoreElimination(int[] a) {
679*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH - 2; i++) {
680*795d594fSAndroid Build Coastguard Worker       a[i] += a[i + 1];
681*795d594fSAndroid Build Coastguard Worker     }
682*795d594fSAndroid Build Coastguard Worker 
683*795d594fSAndroid Build Coastguard Worker     // Outer try catch does not block loop optimizations.
684*795d594fSAndroid Build Coastguard Worker     try {
685*795d594fSAndroid Build Coastguard Worker       if (doThrow) {
686*795d594fSAndroid Build Coastguard Worker         $noinline$unreachable();
687*795d594fSAndroid Build Coastguard Worker       }
688*795d594fSAndroid Build Coastguard Worker     } catch (Error e) {
689*795d594fSAndroid Build Coastguard Worker       System.out.println("Not expected");
690*795d594fSAndroid Build Coastguard Worker     }
691*795d594fSAndroid Build Coastguard Worker   }
692*795d594fSAndroid Build Coastguard Worker 
693*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
694*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination_Blocking(int[]) loop_optimization (after)
695*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
696*795d594fSAndroid Build Coastguard Worker 
697*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination_Blocking(int[]) loop_optimization (before)
698*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
699*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
700*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   IntConstant 4094                          loop:none
701*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>     Phi                                       loop:<<Loop:B\d+>> outer_loop:none
702*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<Phi>>,<<Limit>>]    loop:<<Loop>>      outer_loop:none
703*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>      If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
704*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<Phi>>]              loop:<<Loop>>      outer_loop:none
705*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>  Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
706*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<IndAdd>>]           loop:<<Loop>>      outer_loop:none
707*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>     Add [<<Get0>>,<<Get1>>]                   loop:<<Loop>>      outer_loop:none
708*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<Phi>>,<<Add>>]      loop:<<Loop>>      outer_loop:none
709*795d594fSAndroid Build Coastguard Worker 
710*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination_Blocking(int[]) loop_optimization (before)
711*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
712*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
713*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
714*795d594fSAndroid Build Coastguard Worker 
715*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination_Blocking(int[]) loop_optimization (before)
716*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
717*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
718*795d594fSAndroid Build Coastguard Worker 
719*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination_Blocking(int[]) loop_optimization (after)
720*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
721*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
722*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   IntConstant 4094                          loop:none
723*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>     Phi                                       loop:<<Loop:B\d+>> outer_loop:none
724*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<Phi>>,<<Limit>>]    loop:<<Loop>>      outer_loop:none
725*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>      If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
726*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<Phi>>]              loop:<<Loop>>      outer_loop:none
727*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>  Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
728*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<IndAdd>>]           loop:<<Loop>>      outer_loop:none
729*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>     Add [<<Get0>>,<<Get1>>]                   loop:<<Loop>>      outer_loop:none
730*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<Phi>>,<<Add>>]      loop:<<Loop>>      outer_loop:none
731*795d594fSAndroid Build Coastguard Worker 
732*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination_Blocking(int[]) loop_optimization (after)
733*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
734*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
735*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
736*795d594fSAndroid Build Coastguard Worker 
737*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingLoadStoreElimination_Blocking(int[]) loop_optimization (after)
738*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
739*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
$noinline$unrollingLoadStoreElimination_Blocking(int[] a)740*795d594fSAndroid Build Coastguard Worker   private static final void $noinline$unrollingLoadStoreElimination_Blocking(int[] a) {
741*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH - 2; i++) {
742*795d594fSAndroid Build Coastguard Worker       a[i] += a[i + 1];
743*795d594fSAndroid Build Coastguard Worker 
744*795d594fSAndroid Build Coastguard Worker       // Try catch blocks optimizations.
745*795d594fSAndroid Build Coastguard Worker       try {
746*795d594fSAndroid Build Coastguard Worker         if (doThrow) {
747*795d594fSAndroid Build Coastguard Worker           $noinline$unreachable();
748*795d594fSAndroid Build Coastguard Worker         }
749*795d594fSAndroid Build Coastguard Worker       } catch (Error e) {
750*795d594fSAndroid Build Coastguard Worker         System.out.println("Not expected");
751*795d594fSAndroid Build Coastguard Worker       }
752*795d594fSAndroid Build Coastguard Worker     }
753*795d594fSAndroid Build Coastguard Worker   }
754*795d594fSAndroid Build Coastguard Worker 
755*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
756*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest(int[], int[], int) loop_optimization (after)
757*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
758*795d594fSAndroid Build Coastguard Worker 
759*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest(int[], int[], int) loop_optimization (before)
760*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
761*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
762*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
763*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
764*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
765*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop2>>
766*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop2>>
767*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check>>]                            loop:<<Loop3>>      outer_loop:<<Loop2>>
768*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
769*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
770*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
771*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
772*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop2>>
773*795d594fSAndroid Build Coastguard Worker 
774*795d594fSAndroid Build Coastguard Worker   // Each one of the three `for` loops has an `if`. The try catch has the 4th `if`.
775*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest(int[], int[], int) loop_optimization (before)
776*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
777*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
778*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
779*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
780*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
781*795d594fSAndroid Build Coastguard Worker 
782*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest(int[], int[], int) loop_optimization (before)
783*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
784*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
785*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
786*795d594fSAndroid Build Coastguard Worker 
787*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest(int[], int[], int) loop_optimization (before)
788*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
789*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
790*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
791*795d594fSAndroid Build Coastguard Worker 
792*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest(int[], int[], int) loop_optimization (after)
793*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
794*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
795*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
796*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
797*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
798*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop2>>
799*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop2>>
800*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check>>]                            loop:<<Loop3>>      outer_loop:<<Loop2>>
801*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
802*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
803*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
804*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
805*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI:i\d+>>     Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop2>>
806*795d594fSAndroid Build Coastguard Worker   //
807*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Const0>>]                           loop:<<Loop3>>      outer_loop:<<Loop2>>
808*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
809*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
810*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
811*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
812*795d594fSAndroid Build Coastguard Worker 
813*795d594fSAndroid Build Coastguard Worker   // Loop unrolling adds a 5th `if`. It is the one with `Const0` above.
814*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest(int[], int[], int) loop_optimization (after)
815*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
816*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
817*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
818*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
819*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
820*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
821*795d594fSAndroid Build Coastguard Worker 
822*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest(int[], int[], int) loop_optimization (after)
823*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
824*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
825*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
826*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
827*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
828*795d594fSAndroid Build Coastguard Worker 
829*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest(int[], int[], int) loop_optimization (after)
830*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
831*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
832*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
833*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
834*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
$noinline$unrollingInTheNest(int[] a, int[] b, int x)835*795d594fSAndroid Build Coastguard Worker   private static final void $noinline$unrollingInTheNest(int[] a, int[] b, int x) {
836*795d594fSAndroid Build Coastguard Worker     for (int k = 0; k < 16; k++) {
837*795d594fSAndroid Build Coastguard Worker       for (int j = 0; j < 16; j++) {
838*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 128; i++) {
839*795d594fSAndroid Build Coastguard Worker           b[x]++;
840*795d594fSAndroid Build Coastguard Worker           a[i] = a[i] + 1;
841*795d594fSAndroid Build Coastguard Worker         }
842*795d594fSAndroid Build Coastguard Worker       }
843*795d594fSAndroid Build Coastguard Worker     }
844*795d594fSAndroid Build Coastguard Worker 
845*795d594fSAndroid Build Coastguard Worker     // Outer try catch does not block loop optimizations.
846*795d594fSAndroid Build Coastguard Worker     try {
847*795d594fSAndroid Build Coastguard Worker       if (doThrow) {
848*795d594fSAndroid Build Coastguard Worker         $noinline$unreachable();
849*795d594fSAndroid Build Coastguard Worker       }
850*795d594fSAndroid Build Coastguard Worker     } catch (Error e) {
851*795d594fSAndroid Build Coastguard Worker       System.out.println("Not expected");
852*795d594fSAndroid Build Coastguard Worker     }
853*795d594fSAndroid Build Coastguard Worker   }
854*795d594fSAndroid Build Coastguard Worker 
855*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
856*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_Blocking(int[], int[], int) loop_optimization (after)
857*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
858*795d594fSAndroid Build Coastguard Worker 
859*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_Blocking(int[], int[], int) loop_optimization (before)
860*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
861*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
862*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
863*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
864*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
865*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop2>>
866*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop2>>
867*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check>>]                            loop:<<Loop3>>      outer_loop:<<Loop2>>
868*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
869*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
870*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
871*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
872*795d594fSAndroid Build Coastguard Worker   //
873*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop2>>
874*795d594fSAndroid Build Coastguard Worker 
875*795d594fSAndroid Build Coastguard Worker   // Each one of the three `for` loops has an `if`. The try catch has the 4th `if`.
876*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_Blocking(int[], int[], int) loop_optimization (before)
877*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
878*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
879*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
880*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
881*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
882*795d594fSAndroid Build Coastguard Worker 
883*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_Blocking(int[], int[], int) loop_optimization (before)
884*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
885*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
886*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
887*795d594fSAndroid Build Coastguard Worker 
888*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_Blocking(int[], int[], int) loop_optimization (before)
889*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
890*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
891*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
892*795d594fSAndroid Build Coastguard Worker 
893*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_Blocking(int[], int[], int) loop_optimization (after)
894*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
895*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
896*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
897*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
898*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
899*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop2>>
900*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop2>>
901*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check>>]                            loop:<<Loop3>>      outer_loop:<<Loop2>>
902*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
903*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
904*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
905*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
906*795d594fSAndroid Build Coastguard Worker   //
907*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop2>>
908*795d594fSAndroid Build Coastguard Worker 
909*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_Blocking(int[], int[], int) loop_optimization (after)
910*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
911*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
912*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
913*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
914*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
915*795d594fSAndroid Build Coastguard Worker 
916*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_Blocking(int[], int[], int) loop_optimization (after)
917*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
918*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
919*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
920*795d594fSAndroid Build Coastguard Worker 
921*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_Blocking(int[], int[], int) loop_optimization (after)
922*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
923*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
924*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
$noinline$unrollingInTheNest_Blocking(int[] a, int[] b, int x)925*795d594fSAndroid Build Coastguard Worker   private static final void $noinline$unrollingInTheNest_Blocking(int[] a, int[] b, int x) {
926*795d594fSAndroid Build Coastguard Worker     for (int k = 0; k < 16; k++) {
927*795d594fSAndroid Build Coastguard Worker       for (int j = 0; j < 16; j++) {
928*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 128; i++) {
929*795d594fSAndroid Build Coastguard Worker           b[x]++;
930*795d594fSAndroid Build Coastguard Worker           a[i] = a[i] + 1;
931*795d594fSAndroid Build Coastguard Worker 
932*795d594fSAndroid Build Coastguard Worker           // Try catch blocks optimizations.
933*795d594fSAndroid Build Coastguard Worker           try {
934*795d594fSAndroid Build Coastguard Worker             if (doThrow) {
935*795d594fSAndroid Build Coastguard Worker               $noinline$unreachable();
936*795d594fSAndroid Build Coastguard Worker             }
937*795d594fSAndroid Build Coastguard Worker           } catch (Error e) {
938*795d594fSAndroid Build Coastguard Worker             System.out.println("Not expected");
939*795d594fSAndroid Build Coastguard Worker           }
940*795d594fSAndroid Build Coastguard Worker         }
941*795d594fSAndroid Build Coastguard Worker       }
942*795d594fSAndroid Build Coastguard Worker     }
943*795d594fSAndroid Build Coastguard Worker   }
944*795d594fSAndroid Build Coastguard Worker 
945*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
946*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_TryCatchNotBlocking(int[], int[], int) loop_optimization (after)
947*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
948*795d594fSAndroid Build Coastguard Worker 
949*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_TryCatchNotBlocking(int[], int[], int) loop_optimization (before)
950*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
951*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
952*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
953*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
954*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
955*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop2>>
956*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop2>>
957*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check>>]                            loop:<<Loop3>>      outer_loop:<<Loop2>>
958*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
959*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
960*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
961*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
962*795d594fSAndroid Build Coastguard Worker   //
963*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop2>>
964*795d594fSAndroid Build Coastguard Worker 
965*795d594fSAndroid Build Coastguard Worker   // Each one of the three `for` loops has an `if`. The try catch has the 4th `if`.
966*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_TryCatchNotBlocking(int[], int[], int) loop_optimization (before)
967*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
968*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
969*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
970*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
971*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
972*795d594fSAndroid Build Coastguard Worker 
973*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_TryCatchNotBlocking(int[], int[], int) loop_optimization (before)
974*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
975*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
976*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
977*795d594fSAndroid Build Coastguard Worker 
978*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_TryCatchNotBlocking(int[], int[], int) loop_optimization (before)
979*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
980*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
981*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
982*795d594fSAndroid Build Coastguard Worker 
983*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_TryCatchNotBlocking(int[], int[], int) loop_optimization (after)
984*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
985*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
986*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
987*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
988*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
989*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop2>>
990*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop2>>
991*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check>>]                            loop:<<Loop3>>      outer_loop:<<Loop2>>
992*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
993*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
994*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
995*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
996*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI:i\d+>>     Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop2>>
997*795d594fSAndroid Build Coastguard Worker   //
998*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Const0>>]                           loop:<<Loop3>>      outer_loop:<<Loop2>>
999*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
1000*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
1001*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
1002*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
1003*795d594fSAndroid Build Coastguard Worker 
1004*795d594fSAndroid Build Coastguard Worker   // Loop unrolling adds a 5th `if`. It is the one with `Const0` above.
1005*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_TryCatchNotBlocking(int[], int[], int) loop_optimization (after)
1006*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1007*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1008*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1009*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1010*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1011*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
1012*795d594fSAndroid Build Coastguard Worker 
1013*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_TryCatchNotBlocking(int[], int[], int) loop_optimization (after)
1014*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1015*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1016*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1017*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1018*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
1019*795d594fSAndroid Build Coastguard Worker 
1020*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingInTheNest_TryCatchNotBlocking(int[], int[], int) loop_optimization (after)
1021*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1022*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1023*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1024*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1025*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
$noinline$unrollingInTheNest_TryCatchNotBlocking(int[] a, int[] b, int x)1026*795d594fSAndroid Build Coastguard Worker   private static final void $noinline$unrollingInTheNest_TryCatchNotBlocking(int[] a, int[] b, int x) {
1027*795d594fSAndroid Build Coastguard Worker     for (int k = 0; k < 16; k++) {
1028*795d594fSAndroid Build Coastguard Worker       for (int j = 0; j < 16; j++) {
1029*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 128; i++) {
1030*795d594fSAndroid Build Coastguard Worker           b[x]++;
1031*795d594fSAndroid Build Coastguard Worker           a[i] = a[i] + 1;
1032*795d594fSAndroid Build Coastguard Worker         }
1033*795d594fSAndroid Build Coastguard Worker         // Try catch does not block the optimization in the innermost loop.
1034*795d594fSAndroid Build Coastguard Worker         try {
1035*795d594fSAndroid Build Coastguard Worker           if (doThrow) {
1036*795d594fSAndroid Build Coastguard Worker             $noinline$unreachable();
1037*795d594fSAndroid Build Coastguard Worker           }
1038*795d594fSAndroid Build Coastguard Worker         } catch (Error e) {
1039*795d594fSAndroid Build Coastguard Worker           System.out.println("Not expected");
1040*795d594fSAndroid Build Coastguard Worker         }
1041*795d594fSAndroid Build Coastguard Worker       }
1042*795d594fSAndroid Build Coastguard Worker     }
1043*795d594fSAndroid Build Coastguard Worker   }
1044*795d594fSAndroid Build Coastguard Worker 
1045*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
1046*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (after)
1047*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
1048*795d594fSAndroid Build Coastguard Worker 
1049*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (before)
1050*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
1051*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
1052*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
1053*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<XThres:i\d+>>   IntConstant 100                           loop:none
1054*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
1055*795d594fSAndroid Build Coastguard Worker   //
1056*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
1057*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check2:z\d+>>   GreaterThanOrEqual [<<Phi2>>,<<Limit>>]   loop:<<Loop2>>      outer_loop:<<Loop1>>
1058*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check2>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
1059*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1060*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1061*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI2:i\d+>>    Add [<<Phi2>>,<<Const1>>]                 loop:<<Loop2>>      outer_loop:<<Loop1>>
1062*795d594fSAndroid Build Coastguard Worker   //
1063*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
1064*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check3:z\d+>>   GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop1>>
1065*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check3>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
1066*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1067*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1068*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI3:i\d+>>    Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop1>>
1069*795d594fSAndroid Build Coastguard Worker 
1070*795d594fSAndroid Build Coastguard Worker   // Each one of the three `for` loops has an `if`. Plus an `if` inside the outer `for`. The try catch has the 5th `if`.
1071*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (before)
1072*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1073*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1074*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1075*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1076*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1077*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
1078*795d594fSAndroid Build Coastguard Worker 
1079*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (before)
1080*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1081*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1082*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
1083*795d594fSAndroid Build Coastguard Worker 
1084*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (before)
1085*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1086*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1087*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
1088*795d594fSAndroid Build Coastguard Worker 
1089*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (after)
1090*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
1091*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
1092*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
1093*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<XThres:i\d+>>   IntConstant 100                           loop:none
1094*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
1095*795d594fSAndroid Build Coastguard Worker   //
1096*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
1097*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check2:z\d+>>   GreaterThanOrEqual [<<Phi2>>,<<Limit>>]   loop:<<Loop2>>      outer_loop:<<Loop1>>
1098*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check2>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
1099*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1100*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1101*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI2:i\d+>>    Add [<<Phi2>>,<<Const1>>]                 loop:<<Loop2>>      outer_loop:<<Loop1>>
1102*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Const0>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
1103*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1104*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1105*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<AddI2>>,<<Const1>>]                loop:<<Loop2>>      outer_loop:<<Loop1>>
1106*795d594fSAndroid Build Coastguard Worker   //
1107*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
1108*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check3:z\d+>>   GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop1>>
1109*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check3>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
1110*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1111*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1112*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI3:i\d+>>    Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop1>>
1113*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Const0>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
1114*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1115*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1116*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<AddI3>>,<<Const1>>]                loop:<<Loop3>>      outer_loop:<<Loop1>>
1117*795d594fSAndroid Build Coastguard Worker 
1118*795d594fSAndroid Build Coastguard Worker   // LoopOptimization adds two `if`s. One for each loop unrolling.
1119*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (after)
1120*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1121*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1122*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1123*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1124*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1125*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1126*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1127*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
1128*795d594fSAndroid Build Coastguard Worker 
1129*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (after)
1130*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1131*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1132*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1133*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1134*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
1135*795d594fSAndroid Build Coastguard Worker 
1136*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (after)
1137*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1138*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1139*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1140*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1141*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
$noinline$unrollingTwoLoopsInTheNest(int[] a, int[] b, int x)1142*795d594fSAndroid Build Coastguard Worker   private static final void $noinline$unrollingTwoLoopsInTheNest(int[] a, int[] b, int x) {
1143*795d594fSAndroid Build Coastguard Worker     for (int k = 0; k < 128; k++) {
1144*795d594fSAndroid Build Coastguard Worker       if (x > 100) {
1145*795d594fSAndroid Build Coastguard Worker         for (int j = 0; j < 128; j++) {
1146*795d594fSAndroid Build Coastguard Worker           a[x]++;
1147*795d594fSAndroid Build Coastguard Worker         }
1148*795d594fSAndroid Build Coastguard Worker       } else {
1149*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 128; i++) {
1150*795d594fSAndroid Build Coastguard Worker           b[x]++;
1151*795d594fSAndroid Build Coastguard Worker         }
1152*795d594fSAndroid Build Coastguard Worker       }
1153*795d594fSAndroid Build Coastguard Worker     }
1154*795d594fSAndroid Build Coastguard Worker 
1155*795d594fSAndroid Build Coastguard Worker     // Outer try catch does not block loop optimizations.
1156*795d594fSAndroid Build Coastguard Worker     try {
1157*795d594fSAndroid Build Coastguard Worker       if (doThrow) {
1158*795d594fSAndroid Build Coastguard Worker         $noinline$unreachable();
1159*795d594fSAndroid Build Coastguard Worker       }
1160*795d594fSAndroid Build Coastguard Worker     } catch (Error e) {
1161*795d594fSAndroid Build Coastguard Worker       System.out.println("Not expected");
1162*795d594fSAndroid Build Coastguard Worker     }
1163*795d594fSAndroid Build Coastguard Worker   }
1164*795d594fSAndroid Build Coastguard Worker 
1165*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
1166*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OneBlocking(int[], int[], int) loop_optimization (after)
1167*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
1168*795d594fSAndroid Build Coastguard Worker 
1169*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OneBlocking(int[], int[], int) loop_optimization (before)
1170*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
1171*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
1172*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
1173*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<XThres:i\d+>>   IntConstant 100                           loop:none
1174*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
1175*795d594fSAndroid Build Coastguard Worker   //
1176*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
1177*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check2:z\d+>>   GreaterThanOrEqual [<<Phi2>>,<<Limit>>]   loop:<<Loop2>>      outer_loop:<<Loop1>>
1178*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check2>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
1179*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1180*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1181*795d594fSAndroid Build Coastguard Worker   //
1182*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI2:i\d+>>    Add [<<Phi2>>,<<Const1>>]                 loop:<<Loop2>>      outer_loop:<<Loop1>>
1183*795d594fSAndroid Build Coastguard Worker   //
1184*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
1185*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check3:z\d+>>   GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop1>>
1186*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check3>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
1187*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1188*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1189*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI3:i\d+>>    Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop1>>
1190*795d594fSAndroid Build Coastguard Worker 
1191*795d594fSAndroid Build Coastguard Worker   // Each one of the three `for` loops has an `if`. Plus an `if` inside the outer `for`. The try catch has the 5th `if`.
1192*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OneBlocking(int[], int[], int) loop_optimization (before)
1193*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1194*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1195*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1196*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1197*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1198*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
1199*795d594fSAndroid Build Coastguard Worker 
1200*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OneBlocking(int[], int[], int) loop_optimization (before)
1201*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1202*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1203*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
1204*795d594fSAndroid Build Coastguard Worker 
1205*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OneBlocking(int[], int[], int) loop_optimization (before)
1206*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1207*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1208*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
1209*795d594fSAndroid Build Coastguard Worker 
1210*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OneBlocking(int[], int[], int) loop_optimization (after)
1211*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
1212*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
1213*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
1214*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<XThres:i\d+>>   IntConstant 100                           loop:none
1215*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
1216*795d594fSAndroid Build Coastguard Worker   //
1217*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
1218*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check2:z\d+>>   GreaterThanOrEqual [<<Phi2>>,<<Limit>>]   loop:<<Loop2>>      outer_loop:<<Loop1>>
1219*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check2>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
1220*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1221*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1222*795d594fSAndroid Build Coastguard Worker   //
1223*795d594fSAndroid Build Coastguard Worker   // Unrelated to the optimization itself, the try catch has an if.
1224*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:z\d+>>      StaticFieldGet field_name:Main.doThrow
1225*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Get>>]
1226*795d594fSAndroid Build Coastguard Worker   //
1227*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI2:i\d+>>    Add [<<Phi2>>,<<Const1>>]                 loop:<<Loop2>>      outer_loop:<<Loop1>>
1228*795d594fSAndroid Build Coastguard Worker   //
1229*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
1230*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check3:z\d+>>   GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop1>>
1231*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check3>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
1232*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1233*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1234*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI3:i\d+>>    Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop1>>
1235*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Const0>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
1236*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1237*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1238*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<AddI3>>,<<Const1>>]                loop:<<Loop3>>      outer_loop:<<Loop1>>
1239*795d594fSAndroid Build Coastguard Worker 
1240*795d594fSAndroid Build Coastguard Worker   // LoopOptimization adds two `if`s. One for each loop unrolling.
1241*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OneBlocking(int[], int[], int) loop_optimization (after)
1242*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1243*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1244*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1245*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1246*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1247*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1248*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
1249*795d594fSAndroid Build Coastguard Worker 
1250*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OneBlocking(int[], int[], int) loop_optimization (after)
1251*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1252*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1253*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1254*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
1255*795d594fSAndroid Build Coastguard Worker 
1256*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OneBlocking(int[], int[], int) loop_optimization (after)
1257*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1258*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1259*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1260*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
$noinline$unrollingTwoLoopsInTheNest_OneBlocking(int[] a, int[] b, int x)1261*795d594fSAndroid Build Coastguard Worker   private static final void $noinline$unrollingTwoLoopsInTheNest_OneBlocking(int[] a, int[] b, int x) {
1262*795d594fSAndroid Build Coastguard Worker     for (int k = 0; k < 128; k++) {
1263*795d594fSAndroid Build Coastguard Worker       if (x > 100) {
1264*795d594fSAndroid Build Coastguard Worker         for (int j = 0; j < 128; j++) {
1265*795d594fSAndroid Build Coastguard Worker           a[x]++;
1266*795d594fSAndroid Build Coastguard Worker           // Try catch blocks optimizations.
1267*795d594fSAndroid Build Coastguard Worker           try {
1268*795d594fSAndroid Build Coastguard Worker             if (doThrow) {
1269*795d594fSAndroid Build Coastguard Worker               $noinline$unreachable();
1270*795d594fSAndroid Build Coastguard Worker             }
1271*795d594fSAndroid Build Coastguard Worker           } catch (Error e) {
1272*795d594fSAndroid Build Coastguard Worker             System.out.println("Not expected");
1273*795d594fSAndroid Build Coastguard Worker           }
1274*795d594fSAndroid Build Coastguard Worker         }
1275*795d594fSAndroid Build Coastguard Worker       } else {
1276*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 128; i++) {
1277*795d594fSAndroid Build Coastguard Worker           b[x]++;
1278*795d594fSAndroid Build Coastguard Worker         }
1279*795d594fSAndroid Build Coastguard Worker       }
1280*795d594fSAndroid Build Coastguard Worker     }
1281*795d594fSAndroid Build Coastguard Worker   }
1282*795d594fSAndroid Build Coastguard Worker 
1283*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
1284*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OtherBlocking(int[], int[], int) loop_optimization (after)
1285*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
1286*795d594fSAndroid Build Coastguard Worker 
1287*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OtherBlocking(int[], int[], int) loop_optimization (before)
1288*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
1289*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
1290*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
1291*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<XThres:i\d+>>   IntConstant 100                           loop:none
1292*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
1293*795d594fSAndroid Build Coastguard Worker   //
1294*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
1295*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check2:z\d+>>   GreaterThanOrEqual [<<Phi2>>,<<Limit>>]   loop:<<Loop2>>      outer_loop:<<Loop1>>
1296*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check2>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
1297*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1298*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1299*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI2:i\d+>>    Add [<<Phi2>>,<<Const1>>]                 loop:<<Loop2>>      outer_loop:<<Loop1>>
1300*795d594fSAndroid Build Coastguard Worker   //
1301*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
1302*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check3:z\d+>>   GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop1>>
1303*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check3>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
1304*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1305*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1306*795d594fSAndroid Build Coastguard Worker   //
1307*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI3:i\d+>>    Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop1>>
1308*795d594fSAndroid Build Coastguard Worker 
1309*795d594fSAndroid Build Coastguard Worker   // Each one of the three `for` loops has an `if`. Plus an `if` inside the outer `for`. The try catch has the 5th `if`.
1310*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OtherBlocking(int[], int[], int) loop_optimization (before)
1311*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1312*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1313*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1314*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1315*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1316*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
1317*795d594fSAndroid Build Coastguard Worker 
1318*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OtherBlocking(int[], int[], int) loop_optimization (before)
1319*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1320*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1321*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
1322*795d594fSAndroid Build Coastguard Worker 
1323*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OtherBlocking(int[], int[], int) loop_optimization (before)
1324*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1325*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1326*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
1327*795d594fSAndroid Build Coastguard Worker 
1328*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OtherBlocking(int[], int[], int) loop_optimization (after)
1329*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
1330*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
1331*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
1332*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<XThres:i\d+>>   IntConstant 100                           loop:none
1333*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
1334*795d594fSAndroid Build Coastguard Worker   //
1335*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
1336*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check2:z\d+>>   GreaterThanOrEqual [<<Phi2>>,<<Limit>>]   loop:<<Loop2>>      outer_loop:<<Loop1>>
1337*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check2>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
1338*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1339*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1340*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI2:i\d+>>    Add [<<Phi2>>,<<Const1>>]                 loop:<<Loop2>>      outer_loop:<<Loop1>>
1341*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Const0>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
1342*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1343*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1344*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<AddI2>>,<<Const1>>]                loop:<<Loop2>>      outer_loop:<<Loop1>>
1345*795d594fSAndroid Build Coastguard Worker   //
1346*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
1347*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check3:z\d+>>   GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop1>>
1348*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check3>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
1349*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1350*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1351*795d594fSAndroid Build Coastguard Worker   //
1352*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI3:i\d+>>    Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop1>>
1353*795d594fSAndroid Build Coastguard Worker 
1354*795d594fSAndroid Build Coastguard Worker   // LoopOptimization adds two `if`s. One for each loop unrolling.
1355*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OtherBlocking(int[], int[], int) loop_optimization (after)
1356*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1357*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1358*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1359*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1360*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1361*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1362*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
1363*795d594fSAndroid Build Coastguard Worker 
1364*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OtherBlocking(int[], int[], int) loop_optimization (after)
1365*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1366*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1367*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1368*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
1369*795d594fSAndroid Build Coastguard Worker 
1370*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_OtherBlocking(int[], int[], int) loop_optimization (after)
1371*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1372*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1373*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1374*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
$noinline$unrollingTwoLoopsInTheNest_OtherBlocking(int[] a, int[] b, int x)1375*795d594fSAndroid Build Coastguard Worker   private static final void $noinline$unrollingTwoLoopsInTheNest_OtherBlocking(int[] a, int[] b, int x) {
1376*795d594fSAndroid Build Coastguard Worker     for (int k = 0; k < 128; k++) {
1377*795d594fSAndroid Build Coastguard Worker       if (x > 100) {
1378*795d594fSAndroid Build Coastguard Worker         for (int j = 0; j < 128; j++) {
1379*795d594fSAndroid Build Coastguard Worker           a[x]++;
1380*795d594fSAndroid Build Coastguard Worker         }
1381*795d594fSAndroid Build Coastguard Worker       } else {
1382*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 128; i++) {
1383*795d594fSAndroid Build Coastguard Worker           b[x]++;
1384*795d594fSAndroid Build Coastguard Worker           // Try catch blocks optimizations.
1385*795d594fSAndroid Build Coastguard Worker           try {
1386*795d594fSAndroid Build Coastguard Worker             if (doThrow) {
1387*795d594fSAndroid Build Coastguard Worker               $noinline$unreachable();
1388*795d594fSAndroid Build Coastguard Worker             }
1389*795d594fSAndroid Build Coastguard Worker           } catch (Error e) {
1390*795d594fSAndroid Build Coastguard Worker             System.out.println("Not expected");
1391*795d594fSAndroid Build Coastguard Worker           }
1392*795d594fSAndroid Build Coastguard Worker         }
1393*795d594fSAndroid Build Coastguard Worker       }
1394*795d594fSAndroid Build Coastguard Worker     }
1395*795d594fSAndroid Build Coastguard Worker   }
1396*795d594fSAndroid Build Coastguard Worker 
1397*795d594fSAndroid Build Coastguard Worker   // Consistency check to see we haven't eliminated the try/catch.
1398*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_BothBlocking(int[], int[], int) loop_optimization (after)
1399*795d594fSAndroid Build Coastguard Worker   /// CHECK:     TryBoundary
1400*795d594fSAndroid Build Coastguard Worker 
1401*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_BothBlocking(int[], int[], int) loop_optimization (before)
1402*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
1403*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
1404*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
1405*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<XThres:i\d+>>   IntConstant 100                           loop:none
1406*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
1407*795d594fSAndroid Build Coastguard Worker   //
1408*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
1409*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check2:z\d+>>   GreaterThanOrEqual [<<Phi2>>,<<Limit>>]   loop:<<Loop2>>      outer_loop:<<Loop1>>
1410*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check2>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
1411*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1412*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1413*795d594fSAndroid Build Coastguard Worker   //
1414*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI2:i\d+>>    Add [<<Phi2>>,<<Const1>>]                 loop:<<Loop2>>      outer_loop:<<Loop1>>
1415*795d594fSAndroid Build Coastguard Worker   //
1416*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
1417*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check3:z\d+>>   GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop1>>
1418*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check3>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
1419*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1420*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1421*795d594fSAndroid Build Coastguard Worker   //
1422*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI3:i\d+>>    Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop1>>
1423*795d594fSAndroid Build Coastguard Worker 
1424*795d594fSAndroid Build Coastguard Worker   // Each one of the three `for` loops has an `if`. Plus an `if` inside the outer `for`. The try catchs have the 5th and 6th `if`.
1425*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_BothBlocking(int[], int[], int) loop_optimization (before)
1426*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1427*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1428*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1429*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1430*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1431*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1432*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
1433*795d594fSAndroid Build Coastguard Worker 
1434*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_BothBlocking(int[], int[], int) loop_optimization (before)
1435*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1436*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1437*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
1438*795d594fSAndroid Build Coastguard Worker 
1439*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_BothBlocking(int[], int[], int) loop_optimization (before)
1440*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1441*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1442*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
1443*795d594fSAndroid Build Coastguard Worker 
1444*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_BothBlocking(int[], int[], int) loop_optimization (after)
1445*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
1446*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
1447*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
1448*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<XThres:i\d+>>   IntConstant 100                           loop:none
1449*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
1450*795d594fSAndroid Build Coastguard Worker   //
1451*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
1452*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check2:z\d+>>   GreaterThanOrEqual [<<Phi2>>,<<Limit>>]   loop:<<Loop2>>      outer_loop:<<Loop1>>
1453*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check2>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
1454*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1455*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
1456*795d594fSAndroid Build Coastguard Worker   //
1457*795d594fSAndroid Build Coastguard Worker   // Unrelated to the optimization itself, the try catch has an if.
1458*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:z\d+>>     StaticFieldGet field_name:Main.doThrow
1459*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Get1>>]
1460*795d594fSAndroid Build Coastguard Worker   //
1461*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI2:i\d+>>    Add [<<Phi2>>,<<Const1>>]                 loop:<<Loop2>>      outer_loop:<<Loop1>>
1462*795d594fSAndroid Build Coastguard Worker   //
1463*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
1464*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check3:z\d+>>   GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop1>>
1465*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check3>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
1466*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1467*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
1468*795d594fSAndroid Build Coastguard Worker   //
1469*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI3:i\d+>>    Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop1>>
1470*795d594fSAndroid Build Coastguard Worker 
1471*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_BothBlocking(int[], int[], int) loop_optimization (after)
1472*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1473*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1474*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1475*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1476*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1477*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
1478*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
1479*795d594fSAndroid Build Coastguard Worker 
1480*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_BothBlocking(int[], int[], int) loop_optimization (after)
1481*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1482*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1483*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
1484*795d594fSAndroid Build Coastguard Worker 
1485*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$unrollingTwoLoopsInTheNest_BothBlocking(int[], int[], int) loop_optimization (after)
1486*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1487*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1488*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
$noinline$unrollingTwoLoopsInTheNest_BothBlocking(int[] a, int[] b, int x)1489*795d594fSAndroid Build Coastguard Worker   private static final void $noinline$unrollingTwoLoopsInTheNest_BothBlocking(int[] a, int[] b, int x) {
1490*795d594fSAndroid Build Coastguard Worker     for (int k = 0; k < 128; k++) {
1491*795d594fSAndroid Build Coastguard Worker       if (x > 100) {
1492*795d594fSAndroid Build Coastguard Worker         for (int j = 0; j < 128; j++) {
1493*795d594fSAndroid Build Coastguard Worker           a[x]++;
1494*795d594fSAndroid Build Coastguard Worker           // Try catch blocks optimizations.
1495*795d594fSAndroid Build Coastguard Worker           try {
1496*795d594fSAndroid Build Coastguard Worker             if (doThrow) {
1497*795d594fSAndroid Build Coastguard Worker               $noinline$unreachable();
1498*795d594fSAndroid Build Coastguard Worker             }
1499*795d594fSAndroid Build Coastguard Worker           } catch (Error e) {
1500*795d594fSAndroid Build Coastguard Worker             System.out.println("Not expected");
1501*795d594fSAndroid Build Coastguard Worker           }
1502*795d594fSAndroid Build Coastguard Worker         }
1503*795d594fSAndroid Build Coastguard Worker       } else {
1504*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 128; i++) {
1505*795d594fSAndroid Build Coastguard Worker           b[x]++;
1506*795d594fSAndroid Build Coastguard Worker           // Try catch blocks optimizations.
1507*795d594fSAndroid Build Coastguard Worker           try {
1508*795d594fSAndroid Build Coastguard Worker             if (doThrow) {
1509*795d594fSAndroid Build Coastguard Worker               $noinline$unreachable();
1510*795d594fSAndroid Build Coastguard Worker             }
1511*795d594fSAndroid Build Coastguard Worker           } catch (Error e) {
1512*795d594fSAndroid Build Coastguard Worker             System.out.println("Not expected");
1513*795d594fSAndroid Build Coastguard Worker           }
1514*795d594fSAndroid Build Coastguard Worker         }
1515*795d594fSAndroid Build Coastguard Worker       }
1516*795d594fSAndroid Build Coastguard Worker     }
1517*795d594fSAndroid Build Coastguard Worker   }
1518*795d594fSAndroid Build Coastguard Worker 
1519*795d594fSAndroid Build Coastguard Worker   // Tests taken from 530-checker-peel-unroll
$noinline$peelUnrollTests()1520*795d594fSAndroid Build Coastguard Worker   private static void $noinline$peelUnrollTests() {
1521*795d594fSAndroid Build Coastguard Worker     int[] a = new int[LENGTH];
1522*795d594fSAndroid Build Coastguard Worker     int[] b = new int[LENGTH];
1523*795d594fSAndroid Build Coastguard Worker     initIntArray(a);
1524*795d594fSAndroid Build Coastguard Worker     initIntArray(b);
1525*795d594fSAndroid Build Coastguard Worker 
1526*795d594fSAndroid Build Coastguard Worker     $noinline$unrollingLoadStoreElimination(a);
1527*795d594fSAndroid Build Coastguard Worker     $noinline$unrollingLoadStoreElimination_Blocking(a);
1528*795d594fSAndroid Build Coastguard Worker     $noinline$unrollingInTheNest(a, b, RESULT_POS);
1529*795d594fSAndroid Build Coastguard Worker     $noinline$unrollingInTheNest_Blocking(a, b, RESULT_POS);
1530*795d594fSAndroid Build Coastguard Worker     $noinline$unrollingInTheNest_TryCatchNotBlocking(a, b, RESULT_POS);
1531*795d594fSAndroid Build Coastguard Worker     $noinline$unrollingTwoLoopsInTheNest(a, b, RESULT_POS);
1532*795d594fSAndroid Build Coastguard Worker     $noinline$unrollingTwoLoopsInTheNest_OneBlocking(a, b, RESULT_POS);
1533*795d594fSAndroid Build Coastguard Worker     $noinline$unrollingTwoLoopsInTheNest_OtherBlocking(a, b, RESULT_POS);
1534*795d594fSAndroid Build Coastguard Worker     $noinline$unrollingTwoLoopsInTheNest_BothBlocking(a, b, RESULT_POS);
1535*795d594fSAndroid Build Coastguard Worker   }
1536*795d594fSAndroid Build Coastguard Worker 
main(String[] args)1537*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
1538*795d594fSAndroid Build Coastguard Worker     // Use existing tests to show that the difference between having a try catch inside or outside
1539*795d594fSAndroid Build Coastguard Worker     // the loop.
1540*795d594fSAndroid Build Coastguard Worker     $noinline$loops4Tests();
1541*795d594fSAndroid Build Coastguard Worker     $noinline$loops5Tests();
1542*795d594fSAndroid Build Coastguard Worker     $noinline$peelUnrollTests();
1543*795d594fSAndroid Build Coastguard Worker 
1544*795d594fSAndroid Build Coastguard Worker     System.out.println("passed");
1545*795d594fSAndroid Build Coastguard Worker   }
1546*795d594fSAndroid Build Coastguard Worker 
expectEquals(int expected, int result)1547*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(int expected, int result) {
1548*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
1549*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
1550*795d594fSAndroid Build Coastguard Worker     }
1551*795d594fSAndroid Build Coastguard Worker   }
1552*795d594fSAndroid Build Coastguard Worker 
$noinline$unreachable()1553*795d594fSAndroid Build Coastguard Worker   private static void $noinline$unreachable() {
1554*795d594fSAndroid Build Coastguard Worker     throw new Error("Unreachable");
1555*795d594fSAndroid Build Coastguard Worker   }
1556*795d594fSAndroid Build Coastguard Worker 
1557*795d594fSAndroid Build Coastguard Worker   private static boolean doThrow = false;
1558*795d594fSAndroid Build Coastguard Worker }
1559