xref: /aosp_15_r20/art/test/530-checker-peel-unroll/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Method;
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker //
20*795d594fSAndroid Build Coastguard Worker // Test loop optimizations, in particular scalar loop peeling and unrolling.
21*795d594fSAndroid Build Coastguard Worker public class Main {
22*795d594fSAndroid Build Coastguard Worker 
23*795d594fSAndroid Build Coastguard Worker   static final int LENGTH = 4 * 1024;
24*795d594fSAndroid Build Coastguard Worker   int[] a = new int[LENGTH];
25*795d594fSAndroid Build Coastguard Worker   int[] b = new int[LENGTH];
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker   private static final int LENGTH_A = LENGTH;
28*795d594fSAndroid Build Coastguard Worker   private static final int LENGTH_B = 16;
29*795d594fSAndroid Build Coastguard Worker   private static final int RESULT_POS = 4;
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker   double[][] mA;
32*795d594fSAndroid Build Coastguard Worker   double[][] mB;
33*795d594fSAndroid Build Coastguard Worker   double[][] mC;
34*795d594fSAndroid Build Coastguard Worker 
Main()35*795d594fSAndroid Build Coastguard Worker   public Main() {
36*795d594fSAndroid Build Coastguard Worker     mA = new double[LENGTH_A][];
37*795d594fSAndroid Build Coastguard Worker     mB = new double[LENGTH_B][];
38*795d594fSAndroid Build Coastguard Worker     mC = new double[LENGTH_B][];
39*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH_A; i++) {
40*795d594fSAndroid Build Coastguard Worker       mA[i] = new double[LENGTH_B];
41*795d594fSAndroid Build Coastguard Worker     }
42*795d594fSAndroid Build Coastguard Worker 
43*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH_B; i++) {
44*795d594fSAndroid Build Coastguard Worker       mB[i] = new double[LENGTH_A];
45*795d594fSAndroid Build Coastguard Worker       mC[i] = new double[LENGTH_B];
46*795d594fSAndroid Build Coastguard Worker     }
47*795d594fSAndroid Build Coastguard Worker   }
48*795d594fSAndroid Build Coastguard Worker 
initMatrix(double[][] m)49*795d594fSAndroid Build Coastguard Worker   private static final void initMatrix(double[][] m) {
50*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < m.length; i++) {
51*795d594fSAndroid Build Coastguard Worker       for (int j = 0; j < m[i].length; j++) {
52*795d594fSAndroid Build Coastguard Worker         m[i][j] = (double) (i * LENGTH / (j + 1));
53*795d594fSAndroid Build Coastguard Worker       }
54*795d594fSAndroid Build Coastguard Worker     }
55*795d594fSAndroid Build Coastguard Worker   }
56*795d594fSAndroid Build Coastguard Worker 
initIntArray(int[] a)57*795d594fSAndroid Build Coastguard Worker   private static final void initIntArray(int[] a) {
58*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
59*795d594fSAndroid Build Coastguard Worker       a[i] = i % 4;
60*795d594fSAndroid Build Coastguard Worker     }
61*795d594fSAndroid Build Coastguard Worker   }
62*795d594fSAndroid Build Coastguard Worker 
initDoubleArray(double[] a)63*795d594fSAndroid Build Coastguard Worker   private static final void initDoubleArray(double[] a) {
64*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
65*795d594fSAndroid Build Coastguard Worker       a[i] = (double)(i % 4);
66*795d594fSAndroid Build Coastguard Worker     }
67*795d594fSAndroid Build Coastguard Worker   }
68*795d594fSAndroid Build Coastguard Worker 
69*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingLoadStoreElimination(int[]) loop_optimization (before)
70*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
72*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   IntConstant 4094                          loop:none
73*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>     Phi                                       loop:<<Loop:B\d+>> outer_loop:none
74*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<Phi>>,<<Limit>>]    loop:<<Loop>>      outer_loop:none
75*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>      If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
76*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<Phi>>]              loop:<<Loop>>      outer_loop:none
77*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>  Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
78*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<IndAdd>>]           loop:<<Loop>>      outer_loop:none
79*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>     Add [<<Get0>>,<<Get1>>]                   loop:<<Loop>>      outer_loop:none
80*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<Phi>>,<<Add>>]      loop:<<Loop>>      outer_loop:none
81*795d594fSAndroid Build Coastguard Worker 
82*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingLoadStoreElimination(int[]) loop_optimization (before)
83*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
84*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
85*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
86*795d594fSAndroid Build Coastguard Worker 
87*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingLoadStoreElimination(int[]) loop_optimization (before)
88*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
89*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
90*795d594fSAndroid Build Coastguard Worker 
91*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingLoadStoreElimination(int[]) loop_optimization (after)
92*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
93*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                             loop:none
94*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
95*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   IntConstant 4094                          loop:none
96*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>     Phi                                       loop:<<Loop:B\d+>> outer_loop:none
97*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<Phi>>,<<Limit>>]    loop:<<Loop>>      outer_loop:none
98*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>      If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
99*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<Phi>>]              loop:<<Loop>>      outer_loop:none
100*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>  Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
101*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<IndAdd>>]           loop:<<Loop>>      outer_loop:none
102*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>     Add [<<Get0>>,<<Get1>>]                   loop:<<Loop>>      outer_loop:none
103*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<Phi>>,<<Add>>]      loop:<<Loop>>      outer_loop:none
104*795d594fSAndroid Build Coastguard Worker   //
105*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CheckA:z\d+>>  GreaterThanOrEqual [<<IndAdd>>,<<Limit>>] loop:<<Loop>>      outer_loop:none
106*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IfA:v\d+>>     If [<<Const0>>]                           loop:<<Loop>>      outer_loop:none
107*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0A:i\d+>>   ArrayGet [<<Array>>,<<IndAdd>>]           loop:<<Loop>>      outer_loop:none
108*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAddA:i\d+>> Add [<<IndAdd>>,<<Const1>>]               loop:<<Loop>>      outer_loop:none
109*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1A:i\d+>>   ArrayGet [<<Array>>,<<IndAddA>>]          loop:<<Loop>>      outer_loop:none
110*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddA:i\d+>>    Add [<<Get0A>>,<<Get1A>>]                 loop:<<Loop>>      outer_loop:none
111*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<IndAdd>>,<<AddA>>]  loop:<<Loop>>      outer_loop:none
112*795d594fSAndroid Build Coastguard Worker 
113*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingLoadStoreElimination(int[]) loop_optimization (after)
114*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
115*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
116*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
117*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
118*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
119*795d594fSAndroid Build Coastguard Worker 
120*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingLoadStoreElimination(int[]) loop_optimization (after)
121*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
122*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
123*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
unrollingLoadStoreElimination(int[] a)124*795d594fSAndroid Build Coastguard Worker   private static final void unrollingLoadStoreElimination(int[] a) {
125*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH - 2; i++) {
126*795d594fSAndroid Build Coastguard Worker       a[i] += a[i + 1];
127*795d594fSAndroid Build Coastguard Worker     }
128*795d594fSAndroid Build Coastguard Worker   }
129*795d594fSAndroid Build Coastguard Worker 
130*795d594fSAndroid Build Coastguard Worker   // Simple check that loop unrolling has happened.
131*795d594fSAndroid Build Coastguard Worker   //
132*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwitch(int[]) loop_optimization (before)
133*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
134*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
135*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 4096                          loop:none
136*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiI:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
137*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
138*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>       If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
139*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
140*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
141*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
142*795d594fSAndroid Build Coastguard Worker 
143*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwitch(int[]) loop_optimization (before)
144*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
145*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
146*795d594fSAndroid Build Coastguard Worker 
147*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwitch(int[]) loop_optimization (before)
148*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
149*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwitch(int[]) loop_optimization (after)
152*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
153*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
154*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 4096                          loop:none
155*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiI:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
156*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
157*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>       If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
158*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
159*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI:i\d+>>     Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
161*795d594fSAndroid Build Coastguard Worker   //
162*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CheckA:z\d+>>   GreaterThanOrEqual [<<AddI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
163*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IfA:v\d+>>      If [<<Const0>>]                           loop:<<Loop>>      outer_loop:none
164*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
165*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
166*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<AddI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
167*795d594fSAndroid Build Coastguard Worker 
168*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwitch(int[]) loop_optimization (after)
169*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
170*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
171*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
172*795d594fSAndroid Build Coastguard Worker 
173*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwitch(int[]) loop_optimization (after)
174*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
175*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
176*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
unrollingSwitch(int[] a)177*795d594fSAndroid Build Coastguard Worker   private static final void unrollingSwitch(int[] a) {
178*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH; i++) {
179*795d594fSAndroid Build Coastguard Worker       switch (i % 3) {
180*795d594fSAndroid Build Coastguard Worker         case 2:
181*795d594fSAndroid Build Coastguard Worker           a[i]++;
182*795d594fSAndroid Build Coastguard Worker           break;
183*795d594fSAndroid Build Coastguard Worker         default:
184*795d594fSAndroid Build Coastguard Worker           break;
185*795d594fSAndroid Build Coastguard Worker       }
186*795d594fSAndroid Build Coastguard Worker     }
187*795d594fSAndroid Build Coastguard Worker   }
188*795d594fSAndroid Build Coastguard Worker 
189*795d594fSAndroid Build Coastguard Worker   // Simple check that loop unrolling has happened.
190*795d594fSAndroid Build Coastguard Worker   //
191*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwapElements(int[]) loop_optimization (before)
192*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
193*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
194*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 4094                          loop:none
195*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiI:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
196*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
197*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>       If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
198*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
199*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
200*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
201*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
202*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
203*795d594fSAndroid Build Coastguard Worker 
204*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwapElements(int[]) loop_optimization (before)
205*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
206*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
207*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
208*795d594fSAndroid Build Coastguard Worker 
209*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwapElements(int[]) loop_optimization (before)
210*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
211*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
212*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
213*795d594fSAndroid Build Coastguard Worker 
214*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwapElements(int[]) loop_optimization (after)
215*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
216*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
217*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 4094                          loop:none
218*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiI:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
219*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
220*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>       If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
221*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
222*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
223*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
224*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
225*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI:i\d+>>     Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
226*795d594fSAndroid Build Coastguard Worker   //
227*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CheckA:z\d+>>   GreaterThanOrEqual [<<AddI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
228*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IfA:v\d+>>      If [<<Const0>>]                           loop:<<Loop>>      outer_loop:none
229*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
230*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
231*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
232*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
233*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<AddI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
234*795d594fSAndroid Build Coastguard Worker 
235*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwapElements(int[]) loop_optimization (after)
236*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
237*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
238*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
239*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
240*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
241*795d594fSAndroid Build Coastguard Worker 
242*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingSwapElements(int[]) loop_optimization (after)
243*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
244*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
245*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
246*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
247*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
unrollingSwapElements(int[] array)248*795d594fSAndroid Build Coastguard Worker   private static final void unrollingSwapElements(int[] array) {
249*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH - 2; i++) {
250*795d594fSAndroid Build Coastguard Worker       if (array[i] > array[i + 1]) {
251*795d594fSAndroid Build Coastguard Worker         int temp = array[i + 1];
252*795d594fSAndroid Build Coastguard Worker         array[i + 1] = array[i];
253*795d594fSAndroid Build Coastguard Worker         array[i] = temp;
254*795d594fSAndroid Build Coastguard Worker       }
255*795d594fSAndroid Build Coastguard Worker     }
256*795d594fSAndroid Build Coastguard Worker   }
257*795d594fSAndroid Build Coastguard Worker 
258*795d594fSAndroid Build Coastguard Worker   // Simple check that loop unrolling has happened.
259*795d594fSAndroid Build Coastguard Worker   //
260*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingRInnerproduct(double[][], double[][], double[][], int, int) loop_optimization (before)
261*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
262*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
263*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 16                            loop:none
264*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiI:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
265*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
266*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>       If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
267*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
268*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
269*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
270*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
271*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
272*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
273*795d594fSAndroid Build Coastguard Worker 
274*795d594fSAndroid Build Coastguard Worker   // We have two other `ArrayGet` before the `If` that appears in the CHECK-DAG above.
275*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingRInnerproduct(double[][], double[][], double[][], int, int) loop_optimization (before)
276*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
277*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
278*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
279*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
280*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
281*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
282*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
283*795d594fSAndroid Build Coastguard Worker 
284*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingRInnerproduct(double[][], double[][], double[][], int, int) loop_optimization (before)
285*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
286*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
287*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
288*795d594fSAndroid Build Coastguard Worker 
289*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingRInnerproduct(double[][], double[][], double[][], int, int) loop_optimization (after)
290*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
291*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
292*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 16                            loop:none
293*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiI:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
294*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
295*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>       If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
296*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
297*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
298*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
299*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
300*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
301*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI:i\d+>>     Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
302*795d594fSAndroid Build Coastguard Worker   //
303*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CheckA:z\d+>>   GreaterThanOrEqual [<<AddI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
304*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IfA:v\d+>>      If [<<Const0>>]                           loop:<<Loop>>      outer_loop:none
305*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
306*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
307*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
308*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop>>      outer_loop:none
309*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop>>      outer_loop:none
310*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<AddI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
311*795d594fSAndroid Build Coastguard Worker 
312*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingRInnerproduct(double[][], double[][], double[][], int, int) loop_optimization (after)
313*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
314*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
315*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
316*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
317*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
318*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
319*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
320*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
321*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
322*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
323*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
324*795d594fSAndroid Build Coastguard Worker 
325*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingRInnerproduct(double[][], double[][], double[][], int, int) loop_optimization (after)
326*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
327*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
328*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
329*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
unrollingRInnerproduct(double[][] result, double[][] a, double[][] b, int row, int column)330*795d594fSAndroid Build Coastguard Worker   private static final void unrollingRInnerproduct(double[][] result,
331*795d594fSAndroid Build Coastguard Worker                                                    double[][] a,
332*795d594fSAndroid Build Coastguard Worker                                                    double[][] b,
333*795d594fSAndroid Build Coastguard Worker                                                    int row,
334*795d594fSAndroid Build Coastguard Worker                                                    int column) {
335*795d594fSAndroid Build Coastguard Worker     // computes the inner product of A[row,*] and B[*,column]
336*795d594fSAndroid Build Coastguard Worker     int i;
337*795d594fSAndroid Build Coastguard Worker     result[row][column] = 0.0f;
338*795d594fSAndroid Build Coastguard Worker     for (i = 0; i < LENGTH_B; i++) {
339*795d594fSAndroid Build Coastguard Worker       result[row][column] = result[row][column] + a[row][i] * b[i][column];
340*795d594fSAndroid Build Coastguard Worker     }
341*795d594fSAndroid Build Coastguard Worker   }
342*795d594fSAndroid Build Coastguard Worker 
343*795d594fSAndroid Build Coastguard Worker   // nested loop
344*795d594fSAndroid Build Coastguard Worker   // [[[]]]
345*795d594fSAndroid Build Coastguard Worker 
346*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInTheNest(int[], int[], int) loop_optimization (before)
347*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
348*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
349*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
350*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
351*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
352*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop2>>
353*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop2>>
354*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check>>]                            loop:<<Loop3>>      outer_loop:<<Loop2>>
355*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
356*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
357*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
358*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
359*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop2>>
360*795d594fSAndroid Build Coastguard Worker 
361*795d594fSAndroid Build Coastguard Worker   // Each one of the three `for` loops has an `if`.
362*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInTheNest(int[], int[], int) loop_optimization (before)
363*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
364*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
365*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
366*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
367*795d594fSAndroid Build Coastguard Worker 
368*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInTheNest(int[], int[], int) loop_optimization (before)
369*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
370*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
371*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
372*795d594fSAndroid Build Coastguard Worker 
373*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInTheNest(int[], int[], int) loop_optimization (before)
374*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
375*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
376*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
377*795d594fSAndroid Build Coastguard Worker 
378*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInTheNest(int[], int[], int) loop_optimization (after)
379*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
380*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
381*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
382*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
383*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
384*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop2>>
385*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>    GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop2>>
386*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check>>]                            loop:<<Loop3>>      outer_loop:<<Loop2>>
387*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
388*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
389*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
390*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
391*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI:i\d+>>     Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop2>>
392*795d594fSAndroid Build Coastguard Worker   //
393*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Const0>>]                           loop:<<Loop3>>      outer_loop:<<Loop2>>
394*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
395*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
396*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
397*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop2>>
398*795d594fSAndroid Build Coastguard Worker 
399*795d594fSAndroid Build Coastguard Worker   // Loop unrolling adds a 4th `if`. It is the one with `Const0` above.
400*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInTheNest(int[], int[], int) loop_optimization (after)
401*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
402*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
403*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
404*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
405*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
406*795d594fSAndroid Build Coastguard Worker 
407*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInTheNest(int[], int[], int) loop_optimization (after)
408*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
409*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
410*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
411*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
412*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
413*795d594fSAndroid Build Coastguard Worker 
414*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInTheNest(int[], int[], int) loop_optimization (after)
415*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
416*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
417*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
418*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
419*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
unrollingInTheNest(int[] a, int[] b, int x)420*795d594fSAndroid Build Coastguard Worker   private static final void unrollingInTheNest(int[] a, int[] b, int x) {
421*795d594fSAndroid Build Coastguard Worker     for (int k = 0; k < 16; k++) {
422*795d594fSAndroid Build Coastguard Worker       for (int j = 0; j < 16; j++) {
423*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 128; i++) {
424*795d594fSAndroid Build Coastguard Worker           b[x]++;
425*795d594fSAndroid Build Coastguard Worker           a[i] = a[i] + 1;
426*795d594fSAndroid Build Coastguard Worker         }
427*795d594fSAndroid Build Coastguard Worker       }
428*795d594fSAndroid Build Coastguard Worker     }
429*795d594fSAndroid Build Coastguard Worker   }
430*795d594fSAndroid Build Coastguard Worker 
431*795d594fSAndroid Build Coastguard Worker   // nested loop:
432*795d594fSAndroid Build Coastguard Worker   // [
433*795d594fSAndroid Build Coastguard Worker   //   if [] else []
434*795d594fSAndroid Build Coastguard Worker   // ]
435*795d594fSAndroid Build Coastguard Worker 
436*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (before)
437*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
438*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
439*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
440*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<XThres:i\d+>>   IntConstant 100                           loop:none
441*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
442*795d594fSAndroid Build Coastguard Worker   //
443*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
444*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check2:z\d+>>   GreaterThanOrEqual [<<Phi2>>,<<Limit>>]   loop:<<Loop2>>      outer_loop:<<Loop1>>
445*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check2>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
446*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
447*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
448*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI2:i\d+>>    Add [<<Phi2>>,<<Const1>>]                 loop:<<Loop2>>      outer_loop:<<Loop1>>
449*795d594fSAndroid Build Coastguard Worker   //
450*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
451*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check3:z\d+>>   GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop1>>
452*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check3>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
453*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
454*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
455*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI3:i\d+>>    Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop1>>
456*795d594fSAndroid Build Coastguard Worker 
457*795d594fSAndroid Build Coastguard Worker   // Each one of the three `for` loops has an `if`. Plus an `if` inside the outer `for`.
458*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (before)
459*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
460*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
461*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
462*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
463*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
464*795d594fSAndroid Build Coastguard Worker 
465*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (before)
466*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
467*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
468*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
469*795d594fSAndroid Build Coastguard Worker 
470*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (before)
471*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
472*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
473*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
474*795d594fSAndroid Build Coastguard Worker 
475*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (after)
476*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
477*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>   IntConstant 1                             loop:none
478*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>    IntConstant 128                           loop:none
479*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<XThres:i\d+>>   IntConstant 100                           loop:none
480*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:none
481*795d594fSAndroid Build Coastguard Worker   //
482*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
483*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check2:z\d+>>   GreaterThanOrEqual [<<Phi2>>,<<Limit>>]   loop:<<Loop2>>      outer_loop:<<Loop1>>
484*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check2>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
485*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
486*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
487*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI2:i\d+>>    Add [<<Phi2>>,<<Const1>>]                 loop:<<Loop2>>      outer_loop:<<Loop1>>
488*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Const0>>]                           loop:<<Loop2>>      outer_loop:<<Loop1>>
489*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
490*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop2>>      outer_loop:<<Loop1>>
491*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<AddI2>>,<<Const1>>]                loop:<<Loop2>>      outer_loop:<<Loop1>>
492*795d594fSAndroid Build Coastguard Worker   //
493*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi3:i\d+>>     Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
494*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check3:z\d+>>   GreaterThanOrEqual [<<Phi3>>,<<Limit>>]   loop:<<Loop3>>      outer_loop:<<Loop1>>
495*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Check3>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
496*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
497*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
498*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI3:i\d+>>    Add [<<Phi3>>,<<Const1>>]                 loop:<<Loop3>>      outer_loop:<<Loop1>>
499*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   If [<<Const0>>]                           loop:<<Loop3>>      outer_loop:<<Loop1>>
500*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArrayGet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
501*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   ArraySet                                  loop:<<Loop3>>      outer_loop:<<Loop1>>
502*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Add [<<AddI3>>,<<Const1>>]                loop:<<Loop3>>      outer_loop:<<Loop1>>
503*795d594fSAndroid Build Coastguard Worker 
504*795d594fSAndroid Build Coastguard Worker   // LoopOptimization adds two `if`s. One for each loop unrolling.
505*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (after)
506*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
507*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
508*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
509*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
510*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
511*795d594fSAndroid Build Coastguard Worker   /// CHECK:                       If
512*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                   If
513*795d594fSAndroid Build Coastguard Worker 
514*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (after)
515*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
516*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
517*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
518*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
519*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
520*795d594fSAndroid Build Coastguard Worker 
521*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTwoLoopsInTheNest(int[], int[], int) loop_optimization (after)
522*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
523*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
524*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
525*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
526*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
unrollingTwoLoopsInTheNest(int[] a, int[] b, int x)527*795d594fSAndroid Build Coastguard Worker   private static final void unrollingTwoLoopsInTheNest(int[] a, int[] b, int x) {
528*795d594fSAndroid Build Coastguard Worker     for (int k = 0; k < 128; k++) {
529*795d594fSAndroid Build Coastguard Worker       if (x > 100) {
530*795d594fSAndroid Build Coastguard Worker         for (int j = 0; j < 128; j++) {
531*795d594fSAndroid Build Coastguard Worker           a[x]++;
532*795d594fSAndroid Build Coastguard Worker         }
533*795d594fSAndroid Build Coastguard Worker       } else {
534*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 128; i++) {
535*795d594fSAndroid Build Coastguard Worker           b[x]++;
536*795d594fSAndroid Build Coastguard Worker         }
537*795d594fSAndroid Build Coastguard Worker       }
538*795d594fSAndroid Build Coastguard Worker     }
539*795d594fSAndroid Build Coastguard Worker   }
540*795d594fSAndroid Build Coastguard Worker 
541*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingSimpleLiveOuts(int[]) loop_optimization (before)
542*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
543*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                             loop:none
544*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
545*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const2:i\d+>>  IntConstant 2                             loop:none
546*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   IntConstant 4094                          loop:none
547*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiS:i\d+>>    Phi [<<Const1>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
548*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiT:i\d+>>    Phi [<<Const2>>,{{i\d+}}]                 loop:<<Loop>>      outer_loop:none
549*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiI:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop>>      outer_loop:none
550*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
551*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
552*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI:i\d+>>    Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
553*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<AddI>>]             loop:<<Loop>>      outer_loop:none
554*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddS:i\d+>>    Add [<<PhiS>>,<<Get0>>]                   loop:<<Loop>>      outer_loop:none
555*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddT:i\d+>>    Mul [<<PhiT>>,<<Get0>>]                   loop:<<Loop>>      outer_loop:none
556*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<PhiI>>]             loop:<<Loop>>      outer_loop:none
557*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddArr:i\d+>>  Add [<<AddS>>,<<Get1>>]                   loop:<<Loop>>      outer_loop:none
558*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<PhiI>>,<<AddArr>>]  loop:<<Loop>>      outer_loop:none
559*795d594fSAndroid Build Coastguard Worker   //
560*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<STAdd:i\d+>>   Add [<<PhiS>>,<<PhiT>>]                   loop:none
561*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ZCheck:i\d+>>  DivZeroCheck [<<STAdd>>] env:[[<<PhiS>>,<<PhiT>>,<<STAdd>>,<<Const1>>,_,<<Array>>]] loop:none
562*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Div:i\d+>>     Div [<<Const1>>,<<ZCheck>>]               loop:none
563*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Return [<<Div>>]                          loop:none
564*795d594fSAndroid Build Coastguard Worker 
565*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingSimpleLiveOuts(int[]) loop_optimization (before)
566*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
567*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
568*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
569*795d594fSAndroid Build Coastguard Worker 
570*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingSimpleLiveOuts(int[]) loop_optimization (before)
571*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
572*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
573*795d594fSAndroid Build Coastguard Worker 
574*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingSimpleLiveOuts(int[]) loop_optimization (after)
575*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
576*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                             loop:none
577*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
578*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const2:i\d+>>  IntConstant 2                             loop:none
579*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   IntConstant 4094                          loop:none
580*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiS:i\d+>>    Phi [<<Const1>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
581*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiT:i\d+>>    Phi [<<Const2>>,{{i\d+}}]                 loop:<<Loop>>      outer_loop:none
582*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiI:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop>>      outer_loop:none
583*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
584*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
585*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI:i\d+>>    Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
586*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<AddI>>]             loop:<<Loop>>      outer_loop:none
587*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddS:i\d+>>    Add [<<PhiS>>,<<Get0>>]                   loop:<<Loop>>      outer_loop:none
588*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddT:i\d+>>    Mul [<<PhiT>>,<<Get0>>]                   loop:<<Loop>>      outer_loop:none
589*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<PhiI>>]             loop:<<Loop>>      outer_loop:none
590*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddArr:i\d+>>  Add [<<AddS>>,<<Get1>>]                   loop:<<Loop>>      outer_loop:none
591*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<PhiI>>,<<AddArr>>]  loop:<<Loop>>      outer_loop:none
592*795d594fSAndroid Build Coastguard Worker   //
593*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  GreaterThanOrEqual [<<AddI>>,<<Limit>>]   loop:<<Loop>>      outer_loop:none
594*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  If [<<Const0>>]                           loop:<<Loop>>      outer_loop:none
595*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddIA:i\d+>>   Add [<<AddI>>,<<Const1>>]                 loop:<<Loop>>      outer_loop:none
596*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0A:i\d+>>   ArrayGet [<<Array>>,<<AddIA>>]            loop:<<Loop>>      outer_loop:none
597*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddSA:i\d+>>   Add [<<AddS>>,<<Get0A>>]                  loop:<<Loop>>      outer_loop:none
598*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddTA:i\d+>>   Mul [<<AddT>>,<<Get0A>>]                  loop:<<Loop>>      outer_loop:none
599*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1A:i\d+>>   ArrayGet [<<Array>>,<<AddI>>]             loop:<<Loop>>      outer_loop:none
600*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddArrA:i\d+>> Add [<<AddSA>>,<<Get1A>>]                 loop:<<Loop>>      outer_loop:none
601*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<AddI>>,<<AddArrA>>] loop:<<Loop>>      outer_loop:none
602*795d594fSAndroid Build Coastguard Worker   //
603*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<RetPhiS:i\d+>> Phi [<<PhiS>>,<<AddS>>]                   loop:none
604*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<RetPhiT:i\d+>> Phi [<<PhiT>>,<<AddT>>]                   loop:none
605*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<STAdd:i\d+>>   Add [<<RetPhiS>>,<<RetPhiT>>]             loop:none
606*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ZCheck:i\d+>>  DivZeroCheck [<<STAdd>>] env:[[<<RetPhiS>>,<<RetPhiT>>,<<STAdd>>,<<Const1>>,_,<<Array>>]] loop:none
607*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Div:i\d+>>     Div [<<Const1>>,<<ZCheck>>]               loop:none
608*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Return [<<Div>>]                          loop:none
609*795d594fSAndroid Build Coastguard Worker 
610*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingSimpleLiveOuts(int[]) loop_optimization (after)
611*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
612*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
613*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
614*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
615*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
616*795d594fSAndroid Build Coastguard Worker 
617*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingSimpleLiveOuts(int[]) loop_optimization (after)
618*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
619*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
620*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
unrollingSimpleLiveOuts(int[] a)621*795d594fSAndroid Build Coastguard Worker   private static final int unrollingSimpleLiveOuts(int[] a) {
622*795d594fSAndroid Build Coastguard Worker     int s = 1;
623*795d594fSAndroid Build Coastguard Worker     int t = 2;
624*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH - 2; i++) {
625*795d594fSAndroid Build Coastguard Worker       int temp = a[i + 1];
626*795d594fSAndroid Build Coastguard Worker       s += temp;
627*795d594fSAndroid Build Coastguard Worker       t *= temp;
628*795d594fSAndroid Build Coastguard Worker       a[i] += s;
629*795d594fSAndroid Build Coastguard Worker     }
630*795d594fSAndroid Build Coastguard Worker 
631*795d594fSAndroid Build Coastguard Worker     return 1 / (s + t);
632*795d594fSAndroid Build Coastguard Worker   }
633*795d594fSAndroid Build Coastguard Worker 
634*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingLiveOutsNested(int[]) loop_optimization (before)
635*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
636*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                             loop:none
637*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
638*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const2:i\d+>>  IntConstant 2                             loop:none
639*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   IntConstant 4094                          loop:none
640*795d594fSAndroid Build Coastguard Worker   //
641*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<OutPhiJ:i\d+>> Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop0:B\d+>> outer_loop:none
642*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<OutPhiS:i\d+>> Phi [<<Const1>>,{{i\d+}}]                 loop:<<Loop0>>      outer_loop:none
643*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<OutPhiT:i\d+>> Phi [<<Const2>>,{{i\d+}}]                 loop:<<Loop0>>      outer_loop:none
644*795d594fSAndroid Build Coastguard Worker   //
645*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiI:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:<<Loop0>>
646*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiS:i\d+>>    Phi [<<OutPhiS>>,{{i\d+}}]                loop:<<Loop1>>      outer_loop:<<Loop0>>
647*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiT:i\d+>>    Phi [<<OutPhiT>>,{{i\d+}}]                loop:<<Loop1>>      outer_loop:<<Loop0>>
648*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop1>>      outer_loop:<<Loop0>>
649*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  If [<<Check>>]                            loop:<<Loop1>>      outer_loop:<<Loop0>>
650*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI:i\d+>>    Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop1>>      outer_loop:<<Loop0>>
651*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<AddI>>]             loop:<<Loop1>>      outer_loop:<<Loop0>>
652*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddS:i\d+>>    Add [<<PhiS>>,<<Get0>>]                   loop:<<Loop1>>      outer_loop:<<Loop0>>
653*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddT:i\d+>>    Mul [<<PhiT>>,<<Get0>>]                   loop:<<Loop1>>      outer_loop:<<Loop0>>
654*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<PhiI>>]             loop:<<Loop1>>      outer_loop:<<Loop0>>
655*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddArr:i\d+>>  Add [<<AddS>>,<<Get1>>]                   loop:<<Loop1>>      outer_loop:<<Loop0>>
656*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<PhiI>>,<<AddArr>>]  loop:<<Loop1>>      outer_loop:<<Loop0>>
657*795d594fSAndroid Build Coastguard Worker   //
658*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<OutPhiJ>>,<<Const1>>]              loop:<<Loop0>>      outer_loop:none
659*795d594fSAndroid Build Coastguard Worker 
660*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingLiveOutsNested(int[]) loop_optimization (before)
661*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
662*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
663*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
664*795d594fSAndroid Build Coastguard Worker 
665*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingLiveOutsNested(int[]) loop_optimization (before)
666*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
667*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
668*795d594fSAndroid Build Coastguard Worker 
669*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingLiveOutsNested(int[]) loop_optimization (after)
670*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
671*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                             loop:none
672*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
673*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const2:i\d+>>  IntConstant 2                             loop:none
674*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   IntConstant 4094                          loop:none
675*795d594fSAndroid Build Coastguard Worker   //
676*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<OutPhiJ:i\d+>> Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop0:B\d+>> outer_loop:none
677*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<OutPhiS:i\d+>> Phi [<<Const1>>,{{i\d+}}]                 loop:<<Loop0>>      outer_loop:none
678*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<OutPhiT:i\d+>> Phi [<<Const2>>,{{i\d+}}]                 loop:<<Loop0>>      outer_loop:none
679*795d594fSAndroid Build Coastguard Worker   //
680*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiI:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop1:B\d+>> outer_loop:<<Loop0>>
681*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiS:i\d+>>    Phi [<<OutPhiS>>,{{i\d+}}]                loop:<<Loop1>>      outer_loop:<<Loop0>>
682*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<PhiT:i\d+>>    Phi [<<OutPhiT>>,{{i\d+}}]                loop:<<Loop1>>      outer_loop:<<Loop0>>
683*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<PhiI>>,<<Limit>>]   loop:<<Loop1>>      outer_loop:<<Loop0>>
684*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  If [<<Check>>]                            loop:<<Loop1>>      outer_loop:<<Loop0>>
685*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddI:i\d+>>    Add [<<PhiI>>,<<Const1>>]                 loop:<<Loop1>>      outer_loop:<<Loop0>>
686*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<AddI>>]             loop:<<Loop1>>      outer_loop:<<Loop0>>
687*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddS:i\d+>>    Add [<<PhiS>>,<<Get0>>]                   loop:<<Loop1>>      outer_loop:<<Loop0>>
688*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddT:i\d+>>    Mul [<<PhiT>>,<<Get0>>]                   loop:<<Loop1>>      outer_loop:<<Loop0>>
689*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<PhiI>>]             loop:<<Loop1>>      outer_loop:<<Loop0>>
690*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddArr:i\d+>>  Add [<<AddS>>,<<Get1>>]                   loop:<<Loop1>>      outer_loop:<<Loop0>>
691*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<PhiI>>,<<AddArr>>]  loop:<<Loop1>>      outer_loop:<<Loop0>>
692*795d594fSAndroid Build Coastguard Worker   //
693*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  If [<<Const0>>]                           loop:<<Loop1>>      outer_loop:<<Loop0>>
694*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddIA:i\d+>>   Add [<<AddI>>,<<Const1>>]                 loop:<<Loop1>>      outer_loop:<<Loop0>>
695*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0A:i\d+>>   ArrayGet [<<Array>>,<<AddIA>>]            loop:<<Loop1>>      outer_loop:<<Loop0>>
696*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddSA:i\d+>>   Add [<<AddS>>,<<Get0A>>]                  loop:<<Loop1>>      outer_loop:<<Loop0>>
697*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddTA:i\d+>>   Mul [<<AddT>>,<<Get0A>>]                  loop:<<Loop1>>      outer_loop:<<Loop0>>
698*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1A:i\d+>>   ArrayGet [<<Array>>,<<AddI>>]             loop:<<Loop1>>      outer_loop:<<Loop0>>
699*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddArrA:i\d+>> Add [<<AddSA>>,<<Get1A>>]                 loop:<<Loop1>>      outer_loop:<<Loop0>>
700*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<AddI>>,<<AddArrA>>] loop:<<Loop1>>      outer_loop:<<Loop0>>
701*795d594fSAndroid Build Coastguard Worker   //
702*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<RetPhiS:i\d+>> Phi [<<PhiS>>,<<AddS>>]                   loop:<<Loop0>>      outer_loop:none
703*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<RetPhiT:i\d+>> Phi [<<PhiT>>,<<AddT>>]                   loop:<<Loop0>>      outer_loop:none
704*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<OutPhiJ>>,<<Const1>>]              loop:<<Loop0>>      outer_loop:none
705*795d594fSAndroid Build Coastguard Worker   //
706*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<RetAdd:i\d+>>  Add [<<OutPhiS>>,<<OutPhiT>>]             loop:none
707*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Return [<<RetAdd>>]                       loop:none
708*795d594fSAndroid Build Coastguard Worker 
709*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingLiveOutsNested(int[]) loop_optimization (after)
710*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
711*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
712*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
713*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
714*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
715*795d594fSAndroid Build Coastguard Worker 
716*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.unrollingLiveOutsNested(int[]) loop_optimization (after)
717*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
718*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
719*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
unrollingLiveOutsNested(int[] a)720*795d594fSAndroid Build Coastguard Worker   private static final int unrollingLiveOutsNested(int[] a) {
721*795d594fSAndroid Build Coastguard Worker     int s = 1;
722*795d594fSAndroid Build Coastguard Worker     int t = 2;
723*795d594fSAndroid Build Coastguard Worker     for (int j = 0; j < 16; j++) {
724*795d594fSAndroid Build Coastguard Worker       for (int i = 0; i < LENGTH - 2; i++) {
725*795d594fSAndroid Build Coastguard Worker         int temp = a[i + 1];
726*795d594fSAndroid Build Coastguard Worker         s += temp;
727*795d594fSAndroid Build Coastguard Worker         t *= temp;
728*795d594fSAndroid Build Coastguard Worker         a[i] += s;
729*795d594fSAndroid Build Coastguard Worker       }
730*795d594fSAndroid Build Coastguard Worker     }
731*795d594fSAndroid Build Coastguard Worker     return s + t;
732*795d594fSAndroid Build Coastguard Worker   }
733*795d594fSAndroid Build Coastguard Worker 
734*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInstanceOf(int[], java.lang.Object[]) loop_optimization (before)
735*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
736*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
737*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   InstanceOf                                loop:<<Loop>>      outer_loop:none
738*795d594fSAndroid Build Coastguard Worker 
739*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInstanceOf(int[], java.lang.Object[]) loop_optimization (before)
740*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      InstanceOf
741*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  InstanceOf
742*795d594fSAndroid Build Coastguard Worker 
743*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInstanceOf(int[], java.lang.Object[]) loop_optimization (after)
744*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
745*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
746*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   InstanceOf                                loop:<<Loop>>      outer_loop:none
747*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   InstanceOf                                loop:<<Loop>>      outer_loop:none
748*795d594fSAndroid Build Coastguard Worker 
749*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingInstanceOf(int[], java.lang.Object[]) loop_optimization (after)
750*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      InstanceOf
751*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      InstanceOf
752*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  InstanceOf
unrollingInstanceOf(int[] a, Object[] obj_array)753*795d594fSAndroid Build Coastguard Worker   public void unrollingInstanceOf(int[] a, Object[] obj_array) {
754*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH_B; i++) {
755*795d594fSAndroid Build Coastguard Worker       if (obj_array[i] instanceof Integer) {
756*795d594fSAndroid Build Coastguard Worker         a[i] += 1;
757*795d594fSAndroid Build Coastguard Worker       }
758*795d594fSAndroid Build Coastguard Worker     }
759*795d594fSAndroid Build Coastguard Worker   }
760*795d594fSAndroid Build Coastguard Worker 
761*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingDivZeroCheck(int[], int) loop_optimization (before)
762*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
763*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
764*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   DivZeroCheck                              loop:<<Loop>>      outer_loop:none
765*795d594fSAndroid Build Coastguard Worker 
766*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingDivZeroCheck(int[], int) loop_optimization (before)
767*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      DivZeroCheck
768*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  DivZeroCheck
769*795d594fSAndroid Build Coastguard Worker 
770*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingDivZeroCheck(int[], int) loop_optimization (after)
771*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
772*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
773*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   DivZeroCheck                              loop:<<Loop>>      outer_loop:none
774*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   DivZeroCheck                              loop:<<Loop>>      outer_loop:none
775*795d594fSAndroid Build Coastguard Worker 
776*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingDivZeroCheck(int[], int) loop_optimization (after)
777*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      DivZeroCheck
778*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      DivZeroCheck
779*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  DivZeroCheck
unrollingDivZeroCheck(int[] a, int r)780*795d594fSAndroid Build Coastguard Worker   public void unrollingDivZeroCheck(int[] a, int r) {
781*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH_B; i++) {
782*795d594fSAndroid Build Coastguard Worker       a[i] += a[i] / r;
783*795d594fSAndroid Build Coastguard Worker     }
784*795d594fSAndroid Build Coastguard Worker   }
785*795d594fSAndroid Build Coastguard Worker 
786*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTypeConversion(int[], double[]) loop_optimization (before)
787*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
788*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
789*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   TypeConversion                            loop:<<Loop>>      outer_loop:none
790*795d594fSAndroid Build Coastguard Worker 
791*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTypeConversion(int[], double[]) loop_optimization (before)
792*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      TypeConversion
793*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  TypeConversion
794*795d594fSAndroid Build Coastguard Worker 
795*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTypeConversion(int[], double[]) loop_optimization (after)
796*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
797*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
798*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   TypeConversion                            loop:<<Loop>>      outer_loop:none
799*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   TypeConversion                            loop:<<Loop>>      outer_loop:none
800*795d594fSAndroid Build Coastguard Worker 
801*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingTypeConversion(int[], double[]) loop_optimization (after)
802*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      TypeConversion
803*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      TypeConversion
804*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  TypeConversion
unrollingTypeConversion(int[] a, double[] b)805*795d594fSAndroid Build Coastguard Worker   public void unrollingTypeConversion(int[] a, double[] b) {
806*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH_B; i++) {
807*795d594fSAndroid Build Coastguard Worker       a[i] = (int) b[i];
808*795d594fSAndroid Build Coastguard Worker     }
809*795d594fSAndroid Build Coastguard Worker   }
810*795d594fSAndroid Build Coastguard Worker 
811*795d594fSAndroid Build Coastguard Worker   interface Itf {
812*795d594fSAndroid Build Coastguard Worker   }
813*795d594fSAndroid Build Coastguard Worker 
814*795d594fSAndroid Build Coastguard Worker   class SubMain extends Main implements Itf {
815*795d594fSAndroid Build Coastguard Worker   }
816*795d594fSAndroid Build Coastguard Worker 
817*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingCheckCast(int[], java.lang.Object) loop_optimization (before)
818*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
819*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
820*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   CheckCast                                 loop:<<Loop>>      outer_loop:none
821*795d594fSAndroid Build Coastguard Worker 
822*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingCheckCast(int[], java.lang.Object) loop_optimization (before)
823*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      CheckCast
824*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  CheckCast
825*795d594fSAndroid Build Coastguard Worker 
826*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingCheckCast(int[], java.lang.Object) loop_optimization (after)
827*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>   IntConstant 0                             loop:none
828*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
829*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   CheckCast                                 loop:<<Loop>>      outer_loop:none
830*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                   CheckCast                                 loop:<<Loop>>      outer_loop:none
831*795d594fSAndroid Build Coastguard Worker 
832*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingCheckCast(int[], java.lang.Object) loop_optimization (after)
833*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      CheckCast
834*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      CheckCast
835*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  CheckCast
unrollingCheckCast(int[] a, Object o)836*795d594fSAndroid Build Coastguard Worker   public void unrollingCheckCast(int[] a, Object o) {
837*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH_B; i++) {
838*795d594fSAndroid Build Coastguard Worker       if (((SubMain)o) == o) {
839*795d594fSAndroid Build Coastguard Worker         a[i] = i;
840*795d594fSAndroid Build Coastguard Worker       }
841*795d594fSAndroid Build Coastguard Worker     }
842*795d594fSAndroid Build Coastguard Worker   }
843*795d594fSAndroid Build Coastguard Worker 
844*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingOddTripCount(int[]) loop_optimization (before)
845*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
846*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
847*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   IntConstant 4095                          loop:none
848*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>     Phi                                       loop:<<Loop:B\d+>> outer_loop:none
849*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<Phi>>,<<Limit>>]    loop:<<Loop>>      outer_loop:none
850*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>      If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
851*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<Phi>>]              loop:<<Loop>>      outer_loop:none
852*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>  Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
853*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<IndAdd>>]           loop:<<Loop>>      outer_loop:none
854*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>     Add [<<Get0>>,<<Get1>>]                   loop:<<Loop>>      outer_loop:none
855*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<Phi>>,<<Add>>]      loop:<<Loop>>      outer_loop:none
856*795d594fSAndroid Build Coastguard Worker 
857*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingOddTripCount(int[]) loop_optimization (before)
858*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Phi
859*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  Phi
860*795d594fSAndroid Build Coastguard Worker 
861*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingOddTripCount(int[]) loop_optimization (before)
862*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      If
863*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  If
864*795d594fSAndroid Build Coastguard Worker 
865*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingOddTripCount(int[]) loop_optimization (before)
866*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
867*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
868*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
869*795d594fSAndroid Build Coastguard Worker 
870*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingOddTripCount(int[]) loop_optimization (before)
871*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
872*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
873*795d594fSAndroid Build Coastguard Worker 
874*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingOddTripCount(int[]) loop_optimization (after)
875*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Phi                                       loop:<<Loop:B\d+>> outer_loop:none
876*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  If                                        loop:<<Loop>>      outer_loop:none
877*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArrayGet                                  loop:<<Loop>>      outer_loop:none
878*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArrayGet                                  loop:<<Loop>>      outer_loop:none
879*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet                                  loop:<<Loop>>      outer_loop:none
880*795d594fSAndroid Build Coastguard Worker 
881*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingOddTripCount(int[]) loop_optimization (after)
882*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Phi
883*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  Phi
884*795d594fSAndroid Build Coastguard Worker 
885*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingOddTripCount(int[]) loop_optimization (after)
886*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      If
887*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  If
888*795d594fSAndroid Build Coastguard Worker 
889*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingOddTripCount(int[]) loop_optimization (after)
890*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
891*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
892*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
893*795d594fSAndroid Build Coastguard Worker 
894*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingOddTripCount(int[]) loop_optimization (after)
895*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
896*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
noUnrollingOddTripCount(int[] a)897*795d594fSAndroid Build Coastguard Worker   private static final void noUnrollingOddTripCount(int[] a) {
898*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH - 1; i++) {
899*795d594fSAndroid Build Coastguard Worker       a[i] += a[i + 1];
900*795d594fSAndroid Build Coastguard Worker     }
901*795d594fSAndroid Build Coastguard Worker   }
902*795d594fSAndroid Build Coastguard Worker 
903*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingNotKnownTripCount(int[], int) loop_optimization (before)
904*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Array:l\d+>>   ParameterValue                            loop:none
905*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>   ParameterValue                            loop:none
906*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                             loop:none
907*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>     Phi                                       loop:<<Loop:B\d+>> outer_loop:none
908*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>   GreaterThanOrEqual [<<Phi>>,<<Limit>>]    loop:<<Loop>>      outer_loop:none
909*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<If:v\d+>>      If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
910*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get0:i\d+>>    ArrayGet [<<Array>>,<<Phi>>]              loop:<<Loop>>      outer_loop:none
911*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>  Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
912*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:i\d+>>    ArrayGet [<<Array>>,<<IndAdd>>]           loop:<<Loop>>      outer_loop:none
913*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>     Add [<<Get0>>,<<Get1>>]                   loop:<<Loop>>      outer_loop:none
914*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet [<<Array>>,<<Phi>>,<<Add>>]      loop:<<Loop>>      outer_loop:none
915*795d594fSAndroid Build Coastguard Worker 
916*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingNotKnownTripCount(int[], int) loop_optimization (before)
917*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Phi
918*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  Phi
919*795d594fSAndroid Build Coastguard Worker 
920*795d594fSAndroid Build Coastguard Worker   // One `if` for the `for` loop, and another one for a deoptimize.
921*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingNotKnownTripCount(int[], int) loop_optimization (before)
922*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      If
923*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      If
924*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  If
925*795d594fSAndroid Build Coastguard Worker 
926*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingNotKnownTripCount(int[], int) loop_optimization (before)
927*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
928*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
929*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
930*795d594fSAndroid Build Coastguard Worker 
931*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingNotKnownTripCount(int[], int) loop_optimization (before)
932*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
933*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
934*795d594fSAndroid Build Coastguard Worker 
935*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingNotKnownTripCount(int[], int) loop_optimization (after)
936*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Phi                                       loop:<<Loop:B\d+>> outer_loop:none
937*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  If                                        loop:<<Loop>>      outer_loop:none
938*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArrayGet                                  loop:<<Loop>>      outer_loop:none
939*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArrayGet                                  loop:<<Loop>>      outer_loop:none
940*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  ArraySet                                  loop:<<Loop>>      outer_loop:none
941*795d594fSAndroid Build Coastguard Worker 
942*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingNotKnownTripCount(int[], int) loop_optimization (after)
943*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      Phi
944*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  Phi
945*795d594fSAndroid Build Coastguard Worker 
946*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingNotKnownTripCount(int[], int) loop_optimization (after)
947*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      If
948*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      If
949*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  If
950*795d594fSAndroid Build Coastguard Worker 
951*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingNotKnownTripCount(int[], int) loop_optimization (after)
952*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
953*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
954*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
955*795d594fSAndroid Build Coastguard Worker 
956*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.noUnrollingNotKnownTripCount(int[], int) loop_optimization (after)
957*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
958*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
noUnrollingNotKnownTripCount(int[] a, int n)959*795d594fSAndroid Build Coastguard Worker   private static final void noUnrollingNotKnownTripCount(int[] a, int n) {
960*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; i++) {
961*795d594fSAndroid Build Coastguard Worker       a[i] += a[i + 1];
962*795d594fSAndroid Build Coastguard Worker     }
963*795d594fSAndroid Build Coastguard Worker   }
964*795d594fSAndroid Build Coastguard Worker 
965*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingSimple(int[], boolean) loop_optimization (before)
966*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:z\d+>>     ParameterValue                            loop:none
967*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>    IntConstant 0                             loop:none
968*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>    IntConstant 1                             loop:none
969*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>     IntConstant 4096                          loop:none
970*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>       Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
971*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>     GreaterThanOrEqual [<<Phi>>,<<Limit>>]    loop:<<Loop>>      outer_loop:none
972*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
973*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Param>>]                            loop:<<Loop>>      outer_loop:none
974*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                  loop:<<Loop>>      outer_loop:none
975*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                  loop:<<Loop>>      outer_loop:none
976*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>    Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
977*795d594fSAndroid Build Coastguard Worker 
978*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingSimple(int[], boolean) loop_optimization (before)
979*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      If
980*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      If
981*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  If
982*795d594fSAndroid Build Coastguard Worker 
983*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingSimple(int[], boolean) loop_optimization (before)
984*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
985*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
986*795d594fSAndroid Build Coastguard Worker 
987*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingSimple(int[], boolean) loop_optimization (after)
988*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:z\d+>>     ParameterValue                            loop:none
989*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>    IntConstant 0                             loop:none
990*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>    IntConstant 1                             loop:none
991*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>     IntConstant 4096                          loop:none
992*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<CheckA:z\d+>>    GreaterThanOrEqual [<<Const0>>,<<Limit>>] loop:none
993*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<CheckA>>]                           loop:none
994*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Param>>]                            loop:none
995*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                  loop:none
996*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                  loop:none
997*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAddA:i\d+>>   Add [<<Const0>>,<<Const1>>]               loop:none
998*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>       Phi [<<IndAddA>>,{{i\d+}}]                loop:<<Loop:B\d+>> outer_loop:none
999*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>     GreaterThanOrEqual [<<Phi>>,<<Limit>>]    loop:<<Loop>>      outer_loop:none
1000*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
1001*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Const0>>]                           loop:<<Loop>>      outer_loop:none
1002*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                  loop:<<Loop>>      outer_loop:none
1003*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                  loop:<<Loop>>      outer_loop:none
1004*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>    Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
1005*795d594fSAndroid Build Coastguard Worker 
1006*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingSimple(int[], boolean) loop_optimization (after)
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.peelingSimple(int[], boolean) loop_optimization (after)
1014*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1015*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1016*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
1017*795d594fSAndroid Build Coastguard Worker 
1018*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingSimple(int[], boolean) dead_code_elimination$before_codegen (after)
1019*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:z\d+>>     ParameterValue                            loop:none
1020*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>    IntConstant 0                             loop:none
1021*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>    IntConstant 1                             loop:none
1022*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>     IntConstant 4096                          loop:none
1023*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Param>>]                            loop:none
1024*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                  loop:none
1025*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                  loop:none
1026*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>       Phi [<<Const1>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
1027*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>     GreaterThanOrEqual [<<Phi>>,<<Limit>>]    loop:<<Loop>>      outer_loop:none
1028*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
1029*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                  loop:<<Loop>>      outer_loop:none
1030*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                  loop:<<Loop>>      outer_loop:none
1031*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>    Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
1032*795d594fSAndroid Build Coastguard Worker 
1033*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingSimple(int[], boolean) dead_code_elimination$before_codegen (after)
1034*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      GreaterThanOrEqual
1035*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  GreaterThanOrEqual
1036*795d594fSAndroid Build Coastguard Worker 
1037*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingSimple(int[], boolean) dead_code_elimination$before_codegen (after)
1038*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      If
1039*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      If
1040*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  If
1041*795d594fSAndroid Build Coastguard Worker 
1042*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingSimple(int[], boolean) dead_code_elimination$before_codegen (after)
1043*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1044*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArrayGet
1045*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArrayGet
1046*795d594fSAndroid Build Coastguard Worker 
1047*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingSimple(int[], boolean) dead_code_elimination$before_codegen (after)
1048*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1049*795d594fSAndroid Build Coastguard Worker   /// CHECK:                      ArraySet
1050*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  ArraySet
peelingSimple(int[] a, boolean f)1051*795d594fSAndroid Build Coastguard Worker   private static final void peelingSimple(int[] a, boolean f) {
1052*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH; i++) {
1053*795d594fSAndroid Build Coastguard Worker       if (f) {
1054*795d594fSAndroid Build Coastguard Worker         break;
1055*795d594fSAndroid Build Coastguard Worker       }
1056*795d594fSAndroid Build Coastguard Worker       a[i] += 1;
1057*795d594fSAndroid Build Coastguard Worker     }
1058*795d594fSAndroid Build Coastguard Worker   }
1059*795d594fSAndroid Build Coastguard Worker 
1060*795d594fSAndroid Build Coastguard Worker   // Often used idiom that, when not hoisted, prevents BCE and vectorization.
1061*795d594fSAndroid Build Coastguard Worker   //
1062*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingAddInts(int[]) loop_optimization (before)
1063*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:l\d+>>     ParameterValue                        loop:none
1064*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConstNull:l\d+>> NullConstant                          loop:none
1065*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Eq:z\d+>>        Equal [<<Param>>,<<ConstNull>>]       loop:none
1066*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>       Phi                                   loop:<<Loop:B\d+>> outer_loop:none
1067*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Eq>>]                           loop:<<Loop>>      outer_loop:none
1068*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>     GreaterThanOrEqual [<<Phi>>,{{i\d+}}] loop:<<Loop>>      outer_loop:none
1069*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Check>>]                        loop:<<Loop>>      outer_loop:none
1070*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                              loop:<<Loop>>      outer_loop:none
1071*795d594fSAndroid Build Coastguard Worker 
1072*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingAddInts(int[]) dead_code_elimination$before_codegen (after)
1073*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:l\d+>>     ParameterValue                        loop:none
1074*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConstNull:l\d+>> NullConstant                          loop:none
1075*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Eq:z\d+>>        Equal [<<Param>>,<<ConstNull>>]       loop:none
1076*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Eq>>]                           loop:none
1077*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                              loop:none
1078*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>       Phi                                   loop:<<Loop:B\d+>> outer_loop:none
1079*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>     GreaterThanOrEqual [<<Phi>>,{{i\d+}}] loop:<<Loop>>      outer_loop:none
1080*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Check>>]                        loop:<<Loop>>      outer_loop:none
1081*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                              loop:<<Loop>>      outer_loop:none
1082*795d594fSAndroid Build Coastguard Worker 
1083*795d594fSAndroid Build Coastguard Worker   // There's a 3rd `if` due to bounds checks.
1084*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingAddInts(int[]) dead_code_elimination$before_codegen (after)
1085*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        If
1086*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        If
1087*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        If
1088*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    If
peelingAddInts(int[] a)1089*795d594fSAndroid Build Coastguard Worker   private static final void peelingAddInts(int[] a) {
1090*795d594fSAndroid Build Coastguard Worker     for (int i = 0; a != null && i < a.length; i++) {
1091*795d594fSAndroid Build Coastguard Worker       a[i] += 1;
1092*795d594fSAndroid Build Coastguard Worker     }
1093*795d594fSAndroid Build Coastguard Worker   }
1094*795d594fSAndroid Build Coastguard Worker 
1095*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingBreakFromNest(int[], boolean) loop_optimization (before)
1096*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:z\d+>>     ParameterValue                          loop:none
1097*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>    IntConstant 0                           loop:none
1098*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>    IntConstant 1                           loop:none
1099*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>     IntConstant 4096                        loop:none
1100*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi0:i\d+>>      Phi [<<Const1>>,{{i\d+}}]               loop:<<Loop0:B\d+>> outer_loop:none
1101*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>      Phi [<<Const0>>,{{i\d+}}]               loop:<<Loop1:B\d+>> outer_loop:<<Loop0>>
1102*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>     GreaterThanOrEqual [<<Phi1>>,<<Limit>>] loop:<<Loop1>>      outer_loop:<<Loop0>>
1103*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Check>>]                          loop:<<Loop1>>      outer_loop:<<Loop0>>
1104*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Param>>]                          loop:<<Loop1>>      outer_loop:<<Loop0>>
1105*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                loop:<<Loop1>>      outer_loop:<<Loop0>>
1106*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                loop:<<Loop1>>      outer_loop:<<Loop0>>
1107*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd1:i\d+>>   Add [<<Phi1>>,<<Const1>>]               loop:<<Loop1>>      outer_loop:<<Loop0>>
1108*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd0:i\d+>>   Add [<<Phi0>>,<<Const1>>]               loop:<<Loop0>>      outer_loop:none
1109*795d594fSAndroid Build Coastguard Worker 
1110*795d594fSAndroid Build Coastguard Worker   // The two loops have an `if`. The 3rd `if` is the explicit one in the innermost loop.
1111*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingBreakFromNest(int[], boolean) loop_optimization (before)
1112*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        If
1113*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        If
1114*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        If
1115*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    If
1116*795d594fSAndroid Build Coastguard Worker 
1117*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingBreakFromNest(int[], boolean) loop_optimization (before)
1118*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArraySet
1119*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    ArraySet
1120*795d594fSAndroid Build Coastguard Worker 
1121*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingBreakFromNest(int[], boolean) dead_code_elimination$before_codegen (after)
1122*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:z\d+>>     ParameterValue                          loop:none
1123*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>    IntConstant 0                           loop:none
1124*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>    IntConstant 1                           loop:none
1125*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>     IntConstant 4096                        loop:none
1126*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi0:i\d+>>      Phi [<<Const1>>,{{i\d+}}]               loop:<<Loop0:B\d+>> outer_loop:none
1127*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Param>>]                          loop:<<Loop0>>      outer_loop:none
1128*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                loop:<<Loop0>>      outer_loop:none
1129*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                loop:<<Loop0>>      outer_loop:none
1130*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>      Phi [<<Const1>>,{{i\d+}}]               loop:<<Loop1:B\d+>> outer_loop:<<Loop0>>
1131*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>     GreaterThanOrEqual [<<Phi1>>,<<Limit>>] loop:<<Loop1>>      outer_loop:<<Loop0>>
1132*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Check>>]                          loop:<<Loop1>>      outer_loop:<<Loop0>>
1133*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                loop:<<Loop1>>      outer_loop:<<Loop0>>
1134*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                loop:<<Loop1>>      outer_loop:<<Loop0>>
1135*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd1:i\d+>>   Add [<<Phi1>>,<<Const1>>]               loop:<<Loop1>>      outer_loop:<<Loop0>>
1136*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd0:i\d+>>   Add [<<Phi0>>,<<Const1>>]               loop:<<Loop0>>      outer_loop:none
1137*795d594fSAndroid Build Coastguard Worker 
1138*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingBreakFromNest(int[], boolean) dead_code_elimination$before_codegen (after)
1139*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        If
1140*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        If
1141*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        If
1142*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    If
1143*795d594fSAndroid Build Coastguard Worker 
1144*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.peelingBreakFromNest(int[], boolean) dead_code_elimination$before_codegen (after)
1145*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArraySet
1146*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArraySet
1147*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    ArraySet
peelingBreakFromNest(int[] a, boolean f)1148*795d594fSAndroid Build Coastguard Worker   private static final void peelingBreakFromNest(int[] a, boolean f) {
1149*795d594fSAndroid Build Coastguard Worker     outer:
1150*795d594fSAndroid Build Coastguard Worker     for (int i = 1; i < 32; i++) {
1151*795d594fSAndroid Build Coastguard Worker       for (int j = 0; j < LENGTH; j++) {
1152*795d594fSAndroid Build Coastguard Worker         if (f) {
1153*795d594fSAndroid Build Coastguard Worker           break outer;
1154*795d594fSAndroid Build Coastguard Worker         }
1155*795d594fSAndroid Build Coastguard Worker         a[j] += 1;
1156*795d594fSAndroid Build Coastguard Worker       }
1157*795d594fSAndroid Build Coastguard Worker     }
1158*795d594fSAndroid Build Coastguard Worker   }
1159*795d594fSAndroid Build Coastguard Worker 
1160*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistOneControl(int) loop_optimization (before)
1161*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:i\d+>>     ParameterValue                            loop:none
1162*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>    IntConstant 0                             loop:none
1163*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>    IntConstant 1                             loop:none
1164*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>     NotEqual [<<Param>>,<<Const0>>]           loop:none
1165*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>       Phi [<<Const0>>,{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
1166*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Check>>]                            loop:<<Loop>>      outer_loop:none
1167*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<IndAdd:i\d+>>    Add [<<Phi>>,<<Const1>>]                  loop:<<Loop>>      outer_loop:none
1168*795d594fSAndroid Build Coastguard Worker 
1169*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistOneControl(int) loop_optimization (before)
1170*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        If
1171*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    If
1172*795d594fSAndroid Build Coastguard Worker 
1173*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistOneControl(int) dead_code_elimination$before_codegen (after)
1174*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:i\d+>>     ParameterValue                            loop:none
1175*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>    IntConstant 0                             loop:none
1176*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Check:z\d+>>     NotEqual [<<Param>>,<<Const0>>]           loop:none
1177*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Check>>]                            loop:none
1178*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    SuspendCheck                              loop:<<Loop:B\d+>> outer_loop:none
1179*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Goto                                      loop:<<Loop>>      outer_loop:none
1180*795d594fSAndroid Build Coastguard Worker   //
1181*795d594fSAndroid Build Coastguard Worker   //  Check that the loop has no instruction except SuspendCheck and Goto (indefinite loop).
1182*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                                                              loop:<<Loop>>      outer_loop:none
1183*795d594fSAndroid Build Coastguard Worker 
1184*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistOneControl(int) dead_code_elimination$before_codegen (after)
1185*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        If
1186*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    If
1187*795d594fSAndroid Build Coastguard Worker 
1188*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistOneControl(int) dead_code_elimination$before_codegen (after)
1189*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    Phi
1190*795d594fSAndroid Build Coastguard Worker 
1191*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistOneControl(int) dead_code_elimination$before_codegen (after)
1192*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    Add
peelingHoistOneControl(int x)1193*795d594fSAndroid Build Coastguard Worker   private static final int peelingHoistOneControl(int x) {
1194*795d594fSAndroid Build Coastguard Worker     int i = 0;
1195*795d594fSAndroid Build Coastguard Worker     while (true) {
1196*795d594fSAndroid Build Coastguard Worker       if (x == 0)
1197*795d594fSAndroid Build Coastguard Worker         return 1;
1198*795d594fSAndroid Build Coastguard Worker       i++;
1199*795d594fSAndroid Build Coastguard Worker     }
1200*795d594fSAndroid Build Coastguard Worker   }
1201*795d594fSAndroid Build Coastguard Worker 
1202*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistOneControl(int, int) loop_optimization (before)
1203*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
1204*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              If   loop:<<Loop>>      outer_loop:none
1205*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              If   loop:<<Loop>>      outer_loop:none
1206*795d594fSAndroid Build Coastguard Worker 
1207*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistOneControl(int, int) dead_code_elimination$before_codegen (after)
1208*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
1209*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              If   loop:<<Loop>>      outer_loop:none
1210*795d594fSAndroid Build Coastguard Worker 
1211*795d594fSAndroid Build Coastguard Worker   // One `if` inside the loop (the one no longer invariant), two outside of it.
1212*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistOneControl(int, int) dead_code_elimination$before_codegen (after)
1213*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  If
1214*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  If
1215*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  If
1216*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              If
peelingHoistOneControl(int x, int y)1217*795d594fSAndroid Build Coastguard Worker   private static final int peelingHoistOneControl(int x, int y) {
1218*795d594fSAndroid Build Coastguard Worker     while (true) {
1219*795d594fSAndroid Build Coastguard Worker       if (x == 0)
1220*795d594fSAndroid Build Coastguard Worker         return 1;
1221*795d594fSAndroid Build Coastguard Worker       if (y == 0)  // no longer invariant
1222*795d594fSAndroid Build Coastguard Worker         return 2;
1223*795d594fSAndroid Build Coastguard Worker       y--;
1224*795d594fSAndroid Build Coastguard Worker     }
1225*795d594fSAndroid Build Coastguard Worker   }
1226*795d594fSAndroid Build Coastguard Worker 
1227*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistTwoControl(int, int, int) loop_optimization (before)
1228*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
1229*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              If   loop:<<Loop>>      outer_loop:none
1230*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              If   loop:<<Loop>>      outer_loop:none
1231*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              If   loop:<<Loop>>      outer_loop:none
1232*795d594fSAndroid Build Coastguard Worker 
1233*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistTwoControl(int, int, int) dead_code_elimination$before_codegen (after)
1234*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
1235*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:              If   loop:<<Loop>>      outer_loop:none
1236*795d594fSAndroid Build Coastguard Worker 
1237*795d594fSAndroid Build Coastguard Worker   // One `if` inside the loop (the one no longer invariant), three outside of it.
1238*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.peelingHoistTwoControl(int, int, int) dead_code_elimination$before_codegen (after)
1239*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  If
1240*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  If
1241*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  If
1242*795d594fSAndroid Build Coastguard Worker   /// CHECK:                  If
1243*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:              If
peelingHoistTwoControl(int x, int y, int z)1244*795d594fSAndroid Build Coastguard Worker   private static final int peelingHoistTwoControl(int x, int y, int z) {
1245*795d594fSAndroid Build Coastguard Worker     while (true) {
1246*795d594fSAndroid Build Coastguard Worker       if (x == 0)
1247*795d594fSAndroid Build Coastguard Worker         return 1;
1248*795d594fSAndroid Build Coastguard Worker       if (y == 0)
1249*795d594fSAndroid Build Coastguard Worker         return 2;
1250*795d594fSAndroid Build Coastguard Worker       if (z == 0)  // no longer invariant
1251*795d594fSAndroid Build Coastguard Worker         return 3;
1252*795d594fSAndroid Build Coastguard Worker       z--;
1253*795d594fSAndroid Build Coastguard Worker     }
1254*795d594fSAndroid Build Coastguard Worker   }
1255*795d594fSAndroid Build Coastguard Worker 
1256*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingFull(int[]) loop_optimization (before)
1257*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:l\d+>>     ParameterValue                          loop:none
1258*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>    IntConstant 0                           loop:none
1259*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>    IntConstant 1                           loop:none
1260*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>     IntConstant 2                           loop:none
1261*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>       Phi [<<Const0>>,{{i\d+}}]               loop:<<Loop:B\d+>> outer_loop:none
1262*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                loop:<<Loop>>      outer_loop:none
1263*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                loop:<<Loop>>      outer_loop:none
1264*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                loop:<<Loop>>      outer_loop:none
1265*795d594fSAndroid Build Coastguard Worker 
1266*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingFull(int[]) loop_optimization (before)
1267*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArrayGet
1268*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArrayGet
1269*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    ArrayGet
1270*795d594fSAndroid Build Coastguard Worker 
1271*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingFull(int[]) loop_optimization (before)
1272*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArraySet
1273*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    ArraySet
1274*795d594fSAndroid Build Coastguard Worker 
1275*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingFull(int[]) loop_optimization (after)
1276*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:l\d+>>     ParameterValue                          loop:none
1277*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>    IntConstant 0                           loop:none
1278*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>    IntConstant 1                           loop:none
1279*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Limit:i\d+>>     IntConstant 2                           loop:none
1280*795d594fSAndroid Build Coastguard Worker   //            Two peeled iterations
1281*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                loop:none
1282*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                loop:none
1283*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                loop:none
1284*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                loop:none
1285*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                loop:none
1286*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                loop:none
1287*795d594fSAndroid Build Coastguard Worker   //            Loop
1288*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>       Phi [{{i\d+}},{{i\d+}}]                 loop:<<Loop:B\d+>> outer_loop:none
1289*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                loop:<<Loop>>      outer_loop:none
1290*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArrayGet                                loop:<<Loop>>      outer_loop:none
1291*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    ArraySet                                loop:<<Loop>>      outer_loop:none
1292*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    If [<<Const1>>]                         loop:<<Loop>>      outer_loop:none
1293*795d594fSAndroid Build Coastguard Worker 
1294*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingFull(int[]) loop_optimization (after)
1295*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArrayGet
1296*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArrayGet
1297*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArrayGet
1298*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArrayGet
1299*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArrayGet
1300*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArrayGet
1301*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    ArrayGet
1302*795d594fSAndroid Build Coastguard Worker 
1303*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.unrollingFull(int[]) loop_optimization (after)
1304*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArraySet
1305*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArraySet
1306*795d594fSAndroid Build Coastguard Worker   /// CHECK:                        ArraySet
1307*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                    ArraySet
unrollingFull(int[] a)1308*795d594fSAndroid Build Coastguard Worker   private static final void unrollingFull(int[] a) {
1309*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 2; i++) {
1310*795d594fSAndroid Build Coastguard Worker       a[i] += a[i + 1];
1311*795d594fSAndroid Build Coastguard Worker     }
1312*795d594fSAndroid Build Coastguard Worker   }
1313*795d594fSAndroid Build Coastguard Worker 
expectEquals(int expected, int result)1314*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(int expected, int result) {
1315*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
1316*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
1317*795d594fSAndroid Build Coastguard Worker     }
1318*795d594fSAndroid Build Coastguard Worker   }
1319*795d594fSAndroid Build Coastguard Worker 
verifyUnrolling()1320*795d594fSAndroid Build Coastguard Worker   public void verifyUnrolling() throws Exception {
1321*795d594fSAndroid Build Coastguard Worker     initIntArray(a);
1322*795d594fSAndroid Build Coastguard Worker     initIntArray(b);
1323*795d594fSAndroid Build Coastguard Worker 
1324*795d594fSAndroid Build Coastguard Worker     initMatrix(mA);
1325*795d594fSAndroid Build Coastguard Worker     initMatrix(mB);
1326*795d594fSAndroid Build Coastguard Worker     initMatrix(mC);
1327*795d594fSAndroid Build Coastguard Worker 
1328*795d594fSAndroid Build Coastguard Worker     int expected = 174291515;
1329*795d594fSAndroid Build Coastguard Worker     int found = 0;
1330*795d594fSAndroid Build Coastguard Worker 
1331*795d594fSAndroid Build Coastguard Worker     double[] doubleArray = new double[LENGTH_B];
1332*795d594fSAndroid Build Coastguard Worker     initDoubleArray(doubleArray);
1333*795d594fSAndroid Build Coastguard Worker 
1334*795d594fSAndroid Build Coastguard Worker     unrollingInstanceOf(a, new Integer[LENGTH_B]);
1335*795d594fSAndroid Build Coastguard Worker     unrollingDivZeroCheck(a, 15);
1336*795d594fSAndroid Build Coastguard Worker     unrollingTypeConversion(a, doubleArray);
1337*795d594fSAndroid Build Coastguard Worker     unrollingCheckCast(a, new SubMain());
1338*795d594fSAndroid Build Coastguard Worker 
1339*795d594fSAndroid Build Coastguard Worker     // Call unrollingWhile(a);
1340*795d594fSAndroid Build Coastguard Worker     Class<?> c = Class.forName("PeelUnroll");
1341*795d594fSAndroid Build Coastguard Worker     Method m = c.getMethod("unrollingWhile", Class.forName("[I"));
1342*795d594fSAndroid Build Coastguard Worker     Object[] arguments = { a };
1343*795d594fSAndroid Build Coastguard Worker     m.invoke(null, arguments);
1344*795d594fSAndroid Build Coastguard Worker 
1345*795d594fSAndroid Build Coastguard Worker     unrollingLoadStoreElimination(a);
1346*795d594fSAndroid Build Coastguard Worker     unrollingSwitch(a);
1347*795d594fSAndroid Build Coastguard Worker     unrollingSwapElements(a);
1348*795d594fSAndroid Build Coastguard Worker     unrollingRInnerproduct(mC, mA, mB, RESULT_POS, RESULT_POS);
1349*795d594fSAndroid Build Coastguard Worker     unrollingInTheNest(a, b, RESULT_POS);
1350*795d594fSAndroid Build Coastguard Worker     unrollingTwoLoopsInTheNest(a, b, RESULT_POS);
1351*795d594fSAndroid Build Coastguard Worker 
1352*795d594fSAndroid Build Coastguard Worker     noUnrollingOddTripCount(b);
1353*795d594fSAndroid Build Coastguard Worker     noUnrollingNotKnownTripCount(b, 128);
1354*795d594fSAndroid Build Coastguard Worker 
1355*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < LENGTH; i++) {
1356*795d594fSAndroid Build Coastguard Worker       found += a[i];
1357*795d594fSAndroid Build Coastguard Worker       found += b[i];
1358*795d594fSAndroid Build Coastguard Worker     }
1359*795d594fSAndroid Build Coastguard Worker     found += (int)mC[RESULT_POS][RESULT_POS];
1360*795d594fSAndroid Build Coastguard Worker 
1361*795d594fSAndroid Build Coastguard Worker     expectEquals(expected, found);
1362*795d594fSAndroid Build Coastguard Worker   }
1363*795d594fSAndroid Build Coastguard Worker 
verifyPeeling()1364*795d594fSAndroid Build Coastguard Worker   public void verifyPeeling() throws Exception {
1365*795d594fSAndroid Build Coastguard Worker     expectEquals(1, peelingHoistOneControl(0));  // anything else loops
1366*795d594fSAndroid Build Coastguard Worker     expectEquals(1, peelingHoistOneControl(0, 0));
1367*795d594fSAndroid Build Coastguard Worker     expectEquals(1, peelingHoistOneControl(0, 1));
1368*795d594fSAndroid Build Coastguard Worker     expectEquals(2, peelingHoistOneControl(1, 0));
1369*795d594fSAndroid Build Coastguard Worker     expectEquals(2, peelingHoistOneControl(1, 1));
1370*795d594fSAndroid Build Coastguard Worker     expectEquals(1, peelingHoistTwoControl(0, 0, 0));
1371*795d594fSAndroid Build Coastguard Worker     expectEquals(1, peelingHoistTwoControl(0, 0, 1));
1372*795d594fSAndroid Build Coastguard Worker     expectEquals(1, peelingHoistTwoControl(0, 1, 0));
1373*795d594fSAndroid Build Coastguard Worker     expectEquals(1, peelingHoistTwoControl(0, 1, 1));
1374*795d594fSAndroid Build Coastguard Worker     expectEquals(2, peelingHoistTwoControl(1, 0, 0));
1375*795d594fSAndroid Build Coastguard Worker     expectEquals(2, peelingHoistTwoControl(1, 0, 1));
1376*795d594fSAndroid Build Coastguard Worker     expectEquals(3, peelingHoistTwoControl(1, 1, 0));
1377*795d594fSAndroid Build Coastguard Worker     expectEquals(3, peelingHoistTwoControl(1, 1, 1));
1378*795d594fSAndroid Build Coastguard Worker 
1379*795d594fSAndroid Build Coastguard Worker     initIntArray(a);
1380*795d594fSAndroid Build Coastguard Worker     peelingSimple(a, false);
1381*795d594fSAndroid Build Coastguard Worker     peelingSimple(a, true);
1382*795d594fSAndroid Build Coastguard Worker     peelingAddInts(a);
1383*795d594fSAndroid Build Coastguard Worker     peelingAddInts(null);  // okay
1384*795d594fSAndroid Build Coastguard Worker     peelingBreakFromNest(a, false);
1385*795d594fSAndroid Build Coastguard Worker     peelingBreakFromNest(a, true);
1386*795d594fSAndroid Build Coastguard Worker 
1387*795d594fSAndroid Build Coastguard Worker     unrollingSimpleLiveOuts(a);
1388*795d594fSAndroid Build Coastguard Worker 
1389*795d594fSAndroid Build Coastguard Worker     // Call unrollingWhileLiveOuts(a);
1390*795d594fSAndroid Build Coastguard Worker     Class<?> c = Class.forName("PeelUnroll");
1391*795d594fSAndroid Build Coastguard Worker     Method m = c.getMethod("unrollingWhileLiveOuts", Class.forName("[I"));
1392*795d594fSAndroid Build Coastguard Worker     Object[] arguments = { a };
1393*795d594fSAndroid Build Coastguard Worker     m.invoke(null, arguments);
1394*795d594fSAndroid Build Coastguard Worker 
1395*795d594fSAndroid Build Coastguard Worker     unrollingLiveOutsNested(a);
1396*795d594fSAndroid Build Coastguard Worker 
1397*795d594fSAndroid Build Coastguard Worker     int expected = 51565978;
1398*795d594fSAndroid Build Coastguard Worker     int found = 0;
1399*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < a.length; i++) {
1400*795d594fSAndroid Build Coastguard Worker       found += a[i];
1401*795d594fSAndroid Build Coastguard Worker     }
1402*795d594fSAndroid Build Coastguard Worker 
1403*795d594fSAndroid Build Coastguard Worker     expectEquals(expected, found);
1404*795d594fSAndroid Build Coastguard Worker   }
1405*795d594fSAndroid Build Coastguard Worker 
main(String[] args)1406*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) throws Exception {
1407*795d594fSAndroid Build Coastguard Worker     Main obj = new Main();
1408*795d594fSAndroid Build Coastguard Worker 
1409*795d594fSAndroid Build Coastguard Worker     obj.verifyUnrolling();
1410*795d594fSAndroid Build Coastguard Worker     obj.verifyPeeling();
1411*795d594fSAndroid Build Coastguard Worker 
1412*795d594fSAndroid Build Coastguard Worker     System.out.println("passed");
1413*795d594fSAndroid Build Coastguard Worker   }
1414*795d594fSAndroid Build Coastguard Worker }
1415