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