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