1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2016 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 public class Main { 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker public class ExampleObj { 20*795d594fSAndroid Build Coastguard Worker int n1; 21*795d594fSAndroid Build Coastguard Worker int n2; 22*795d594fSAndroid Build Coastguard Worker ExampleObj(int n1, int n2)23*795d594fSAndroid Build Coastguard Worker public ExampleObj(int n1, int n2) { 24*795d594fSAndroid Build Coastguard Worker this.n1 = n1; 25*795d594fSAndroid Build Coastguard Worker this.n2 = n2; 26*795d594fSAndroid Build Coastguard Worker } 27*795d594fSAndroid Build Coastguard Worker } 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker static int static_variable = 0; 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker public ExampleObj my_obj; 32*795d594fSAndroid Build Coastguard Worker public static int number1; 33*795d594fSAndroid Build Coastguard Worker public static int number2; 34*795d594fSAndroid Build Coastguard Worker public static volatile int number3; 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.arrayAccess() scheduler (before) 37*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const1:i\d+>> IntConstant 1 38*795d594fSAndroid Build Coastguard Worker /// CHECK: <<res0:i\d+>> Phi 39*795d594fSAndroid Build Coastguard Worker /// CHECK: <<i0:i\d+>> Phi 40*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 41*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet [<<Array>>,<<i0>>] 42*795d594fSAndroid Build Coastguard Worker /// CHECK: <<res1:i\d+>> Add [<<res0>>,<<ArrayGet1>>] 43*795d594fSAndroid Build Coastguard Worker /// CHECK: <<i1:i\d+>> Add [<<i0>>,<<Const1>>] 44*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet [<<Array>>,<<i1>>] 45*795d594fSAndroid Build Coastguard Worker /// CHECK: Add [<<res1>>,<<ArrayGet2>>] 46*795d594fSAndroid Build Coastguard Worker 47*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.arrayAccess() scheduler (after) 48*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const1:i\d+>> IntConstant 1 49*795d594fSAndroid Build Coastguard Worker /// CHECK: <<res0:i\d+>> Phi 50*795d594fSAndroid Build Coastguard Worker /// CHECK: <<i0:i\d+>> Phi 51*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 52*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet [<<Array>>,<<i0>>] 53*795d594fSAndroid Build Coastguard Worker /// CHECK: <<i1:i\d+>> Add [<<i0>>,<<Const1>>] 54*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet [<<Array>>,<<i1>>] 55*795d594fSAndroid Build Coastguard Worker /// CHECK: <<res1:i\d+>> Add [<<res0>>,<<ArrayGet1>>] 56*795d594fSAndroid Build Coastguard Worker /// CHECK: Add [<<res1>>,<<ArrayGet2>>] 57*795d594fSAndroid Build Coastguard Worker arrayAccess()58*795d594fSAndroid Build Coastguard Worker public static int arrayAccess() { 59*795d594fSAndroid Build Coastguard Worker int res = 0; 60*795d594fSAndroid Build Coastguard Worker int [] array = new int[10]; 61*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 9; i++) { 62*795d594fSAndroid Build Coastguard Worker res += array[i]; 63*795d594fSAndroid Build Coastguard Worker res += array[i + 1]; 64*795d594fSAndroid Build Coastguard Worker } 65*795d594fSAndroid Build Coastguard Worker return res; 66*795d594fSAndroid Build Coastguard Worker } 67*795d594fSAndroid Build Coastguard Worker 68*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.arrayAccessVariable(int) scheduler (before) 69*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Param:i\d+>> ParameterValue 70*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 71*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 72*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const3:i\d+>> IntConstant -1 73*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Param>>,<<Const1>>] 74*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:i\d+>> Add [<<Param>>,<<Const2>>] 75*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Param>>,<<Const3>>] 76*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array:i\d+>> IntermediateAddress 77*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGet1:i\d+>> ArrayGet [<<Array>>,<<Add1>>] 78*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGet2:i\d+>> ArrayGet [<<Array>>,<<Add2>>] 79*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGet3:i\d+>> ArrayGet [<<Array>>,<<Add3>>] 80*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddArray1:i\d+>> Add [<<ArrayGet1>>,<<Const2>>] 81*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: {{v\d+}} ArraySet [<<Array>>,<<Add1>>,<<AddArray1>>] 82*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddArray2:i\d+>> Add [<<ArrayGet2>>,<<Const2>>] 83*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: {{v\d+}} ArraySet [<<Array>>,<<Add2>>,<<AddArray2>>] 84*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddArray3:i\d+>> Add [<<ArrayGet3>>,<<Const2>>] 85*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: {{v\d+}} ArraySet [<<Array>>,<<Add3>>,<<AddArray3>>] 86*795d594fSAndroid Build Coastguard Worker 87*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.arrayAccessVariable(int) scheduler (after) 88*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Param:i\d+>> ParameterValue 89*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 90*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 91*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const3:i\d+>> IntConstant -1 92*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add1:i\d+>> Add [<<Param>>,<<Const1>>] 93*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add2:i\d+>> Add [<<Param>>,<<Const2>>] 94*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add3:i\d+>> Add [<<Param>>,<<Const3>>] 95*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 96*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,{{i\d+}}] 97*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,{{i\d+}}] 98*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,{{i\d+}}] 99*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 100*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 101*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 102*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 103*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 104*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 105*795d594fSAndroid Build Coastguard Worker 106*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.arrayAccessVariable(int) scheduler (before) 107*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Param:i\d+>> ParameterValue 108*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 109*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 110*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const3:i\d+>> IntConstant -1 111*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Param>>,<<Const1>>] 112*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:i\d+>> Add [<<Param>>,<<Const2>>] 113*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Param>>,<<Const3>>] 114*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array:i\d+>> IntermediateAddress 115*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGet1:i\d+>> ArrayGet [<<Array>>,<<Add1>>] 116*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGet2:i\d+>> ArrayGet [<<Array>>,<<Add2>>] 117*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGet3:i\d+>> ArrayGet [<<Array>>,<<Add3>>] 118*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddArray1:i\d+>> Add [<<ArrayGet1>>,<<Const2>>] 119*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: {{v\d+}} ArraySet [<<Array>>,<<Add1>>,<<AddArray1>>] 120*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddArray2:i\d+>> Add [<<ArrayGet2>>,<<Const2>>] 121*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: {{v\d+}} ArraySet [<<Array>>,<<Add2>>,<<AddArray2>>] 122*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddArray3:i\d+>> Add [<<ArrayGet3>>,<<Const2>>] 123*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet [<<Array>>,<<Add3>>,<<AddArray3>>] 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.arrayAccessVariable(int) scheduler (after) 126*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Param:i\d+>> ParameterValue 127*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 128*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 129*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const3:i\d+>> IntConstant -1 130*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add1:i\d+>> Add [<<Param>>,<<Const1>>] 131*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add2:i\d+>> Add [<<Param>>,<<Const2>>] 132*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add3:i\d+>> Add [<<Param>>,<<Const3>>] 133*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 134*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,<<Add3>>] 135*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,<<Add2>>] 136*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,<<Add1>>] 137*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 138*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 139*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 140*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 141*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 142*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet arrayAccessVariable(int i)143*795d594fSAndroid Build Coastguard Worker public static void arrayAccessVariable(int i) { 144*795d594fSAndroid Build Coastguard Worker int [] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 145*795d594fSAndroid Build Coastguard Worker for (int j = 0; j < 100; j++) { 146*795d594fSAndroid Build Coastguard Worker array[i + 1]++; 147*795d594fSAndroid Build Coastguard Worker array[i + 2]++; 148*795d594fSAndroid Build Coastguard Worker array[i - 1]++; 149*795d594fSAndroid Build Coastguard Worker } 150*795d594fSAndroid Build Coastguard Worker } 151*795d594fSAndroid Build Coastguard Worker 152*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.arrayAccessSub(int) scheduler (before) 153*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Param:i\d+>> ParameterValue 154*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant -1 155*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 9 156*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const3:i\d+>> IntConstant 1 157*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add1:i\d+>> Add [<<Param>>,<<Const1>>] 158*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Sub2:i\d+>> Sub [<<Const2>>,<<Param>>] 159*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 160*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet [<<Array>>,<<Add1>>] 161*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray1:i\d+>> Add [<<ArrayGet1>>,<<Const3>>] 162*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet1:v\d+>> ArraySet [<<Array>>,<<Add1>>,<<AddArray1>>] 163*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet [<<Array>>,<<Sub2>>] 164*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray2:i\d+>> Add [<<ArrayGet2>>,<<Const3>>] 165*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet2:v\d+>> ArraySet [<<Array>>,<<Sub2>>,<<AddArray2>>] 166*795d594fSAndroid Build Coastguard Worker 167*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.arrayAccessSub(int) scheduler (after) 168*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Param:i\d+>> ParameterValue 169*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant -1 170*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 9 171*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const3:i\d+>> IntConstant 1 172*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add1:i\d+>> Add [<<Param>>,<<Const1>>] 173*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Sub2:i\d+>> Sub [<<Const2>>,<<Param>>] 174*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 175*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet [<<Array>>,<<Add1>>] 176*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray1:i\d+>> Add [<<ArrayGet1>>,<<Const3>>] 177*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet1:v\d+>> ArraySet [<<Array>>,<<Add1>>,<<AddArray1>>] 178*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet [<<Array>>,<<Sub2>>] 179*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray2:i\d+>> Add [<<ArrayGet2>>,<<Const3>>] 180*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet2:v\d+>> ArraySet [<<Array>>,<<Sub2>>,<<AddArray2>>] 181*795d594fSAndroid Build Coastguard Worker 182*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.arrayAccessSub(int) scheduler (before) 183*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Param:i\d+>> ParameterValue 184*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant -1 185*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 9 186*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const3:i\d+>> IntConstant 1 187*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add1:i\d+>> Add [<<Param>>,<<Const1>>] 188*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Sub2:i\d+>> Sub [<<Const2>>,<<Param>>] 189*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 190*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet [<<Array>>,<<Add1>>] 191*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray1:i\d+>> Add [<<ArrayGet1>>,<<Const3>>] 192*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet1:v\d+>> ArraySet [<<Array>>,<<Add1>>,<<AddArray1>>] 193*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet [<<Array>>,<<Sub2>>] 194*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray2:i\d+>> Add [<<ArrayGet2>>,<<Const3>>] 195*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet2:v\d+>> ArraySet [<<Array>>,<<Sub2>>,<<AddArray2>>] 196*795d594fSAndroid Build Coastguard Worker 197*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.arrayAccessSub(int) scheduler (after) 198*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Param:i\d+>> ParameterValue 199*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant -1 200*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 9 201*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const3:i\d+>> IntConstant 1 202*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add1:i\d+>> Add [<<Param>>,<<Const1>>] 203*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Sub2:i\d+>> Sub [<<Const2>>,<<Param>>] 204*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 205*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet [<<Array>>,<<Add1>>] 206*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray1:i\d+>> Add [<<ArrayGet1>>,<<Const3>>] 207*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet1:v\d+>> ArraySet [<<Array>>,<<Add1>>,<<AddArray1>>] 208*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet [<<Array>>,<<Sub2>>] 209*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray2:i\d+>> Add [<<ArrayGet2>>,<<Const3>>] 210*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet2:v\d+>> ArraySet [<<Array>>,<<Sub2>>,<<AddArray2>>] arrayAccessSub(int i)211*795d594fSAndroid Build Coastguard Worker public static void arrayAccessSub(int i) { 212*795d594fSAndroid Build Coastguard Worker int [] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 213*795d594fSAndroid Build Coastguard Worker for (int j = 0; j < 100; j++) { 214*795d594fSAndroid Build Coastguard Worker // These two accesses MAY ALIAS 215*795d594fSAndroid Build Coastguard Worker array[i - 1]++; 216*795d594fSAndroid Build Coastguard Worker array[9 - i]++; 217*795d594fSAndroid Build Coastguard Worker } 218*795d594fSAndroid Build Coastguard Worker } 219*795d594fSAndroid Build Coastguard Worker 220*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.arrayAccessLoopVariable() scheduler (before) 221*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 222*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 223*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Phi:i\d+>> Phi 224*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 225*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet 226*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray1:i\d+>> Add 227*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet1:v\d+>> ArraySet 228*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddVar:i\d+>> Add 229*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet 230*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray2:i\d+>> Add 231*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet2:v\d+>> ArraySet 232*795d594fSAndroid Build Coastguard Worker 233*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.arrayAccessLoopVariable() scheduler (after) 234*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 235*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 236*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Phi:i\d+>> Phi 237*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 238*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddVar:i\d+>> Add 239*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet 240*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet 241*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray1:i\d+>> Add 242*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray2:i\d+>> Add 243*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet1:v\d+>> ArraySet 244*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet2:v\d+>> ArraySet 245*795d594fSAndroid Build Coastguard Worker 246*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.arrayAccessLoopVariable() scheduler (before) 247*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 248*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 249*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Phi:i\d+>> Phi 250*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 251*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet 252*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray1:i\d+>> Add 253*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet1:v\d+>> ArraySet 254*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddVar:i\d+>> Add 255*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet 256*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray2:i\d+>> Add 257*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet2:v\d+>> ArraySet 258*795d594fSAndroid Build Coastguard Worker 259*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.arrayAccessLoopVariable() scheduler (after) 260*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 261*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 262*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Phi:i\d+>> Phi 263*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:i\d+>> IntermediateAddress 264*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddVar:i\d+>> Add 265*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet 266*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet 267*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray1:i\d+>> Add 268*795d594fSAndroid Build Coastguard Worker /// CHECK: <<AddArray2:i\d+>> Add 269*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet1:v\d+>> ArraySet 270*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet2:v\d+>> ArraySet arrayAccessLoopVariable()271*795d594fSAndroid Build Coastguard Worker public static void arrayAccessLoopVariable() { 272*795d594fSAndroid Build Coastguard Worker int [] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 273*795d594fSAndroid Build Coastguard Worker for (int j = 0; j < 9; j++) { 274*795d594fSAndroid Build Coastguard Worker array[j]++; 275*795d594fSAndroid Build Coastguard Worker array[j + 1]++; 276*795d594fSAndroid Build Coastguard Worker } 277*795d594fSAndroid Build Coastguard Worker } 278*795d594fSAndroid Build Coastguard Worker 279*795d594fSAndroid Build Coastguard Worker // This case tests a bug found in LSA where LSA doesn't understand IntermediateAddress, 280*795d594fSAndroid Build Coastguard Worker // and incorrectly reported no alias between ArraySet1 and ArrayGet2, 281*795d594fSAndroid Build Coastguard Worker // thus ArrayGet2 is scheduled above ArraySet1 incorrectly. 282*795d594fSAndroid Build Coastguard Worker 283*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.CrossOverLoop(int[], int[]) scheduler (before) 284*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ParamA:l\d+>> ParameterValue loop:none 285*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ParamB:l\d+>> ParameterValue loop:none 286*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NullB:l\d+>> NullCheck [<<ParamB>>] loop:none 287*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NullA:l\d+>> NullCheck [<<ParamA>>] loop:none 288*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi loop:<<Loop:B\d+>> outer_loop:none 289*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet [<<NullB>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 290*795d594fSAndroid Build Coastguard Worker /// CHECK: Add loop:<<Loop>> outer_loop:none 291*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Addr1:i\d+>> IntermediateAddress [<<NullA>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 292*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet1:v\d+>> ArraySet [<<Addr1>>,{{i\d+}},{{i\d+}}] loop:<<Loop>> outer_loop:none 293*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet [<<NullB>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 294*795d594fSAndroid Build Coastguard Worker /// CHECK: Add loop:<<Loop>> outer_loop:none 295*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet2:v\d+>> ArraySet [<<Addr1>>,{{i\d+}},{{i\d+}}] loop:<<Loop>> outer_loop:none 296*795d594fSAndroid Build Coastguard Worker /// CHECK: Add loop:<<Loop>> outer_loop:none 297*795d594fSAndroid Build Coastguard Worker 298*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.CrossOverLoop(int[], int[]) scheduler (after) 299*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ParamA:l\d+>> ParameterValue loop:none 300*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ParamB:l\d+>> ParameterValue loop:none 301*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NullB:l\d+>> NullCheck [<<ParamB>>] loop:none 302*795d594fSAndroid Build Coastguard Worker /// CHECK: <<NullA:l\d+>> NullCheck [<<ParamA>>] loop:none 303*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi loop:<<Loop:B\d+>> outer_loop:none 304*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet1:i\d+>> ArrayGet [<<NullB>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 305*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Addr1:i\d+>> IntermediateAddress [<<NullA>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 306*795d594fSAndroid Build Coastguard Worker /// CHECK: Add [<<ArrayGet1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 307*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet1:v\d+>> ArraySet [<<Addr1>>,{{i\d+}},{{i\d+}}] loop:<<Loop>> outer_loop:none 308*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet2:i\d+>> ArrayGet [<<NullB>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 309*795d594fSAndroid Build Coastguard Worker /// CHECK: Add loop:<<Loop>> outer_loop:none 310*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArraySet2:v\d+>> ArraySet [<<Addr1>>,{{i\d+}},{{i\d+}}] loop:<<Loop>> outer_loop:none 311*795d594fSAndroid Build Coastguard Worker /// CHECK: Add loop:<<Loop>> outer_loop:none CrossOverLoop(int a[], int b[])312*795d594fSAndroid Build Coastguard Worker private static void CrossOverLoop(int a[], int b[]) { 313*795d594fSAndroid Build Coastguard Worker b[20] = 99; 314*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length; i++) { 315*795d594fSAndroid Build Coastguard Worker a[i] = b[20] - 7; 316*795d594fSAndroid Build Coastguard Worker i++; 317*795d594fSAndroid Build Coastguard Worker a[i] = b[20] - 7; 318*795d594fSAndroid Build Coastguard Worker } 319*795d594fSAndroid Build Coastguard Worker } 320*795d594fSAndroid Build Coastguard Worker 321*795d594fSAndroid Build Coastguard Worker // This test case is similar to above cross over loop, 322*795d594fSAndroid Build Coastguard Worker // but has more complex chains of transforming the original references: 323*795d594fSAndroid Build Coastguard Worker // ParameterValue --> BoundType --> NullCheck --> ArrayGet. 324*795d594fSAndroid Build Coastguard Worker // ParameterValue --> BoundType --> NullCheck --> IntermediateAddress --> ArraySet. 325*795d594fSAndroid Build Coastguard Worker // After using LSA to analyze the original references, the scheduler should be able 326*795d594fSAndroid Build Coastguard Worker // to find out that 'a' and 'b' may alias, hence unable to schedule these ArraGet/Set. 327*795d594fSAndroid Build Coastguard Worker 328*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.CrossOverLoop2(java.lang.Object, java.lang.Object) scheduler (before) 329*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi loop:<<Loop:B\d+>> outer_loop:none 330*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet loop:<<Loop>> outer_loop:none 331*795d594fSAndroid Build Coastguard Worker /// CHECK: Add loop:<<Loop>> outer_loop:none 332*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet loop:<<Loop>> outer_loop:none 333*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet loop:<<Loop>> outer_loop:none 334*795d594fSAndroid Build Coastguard Worker /// CHECK: Add loop:<<Loop>> outer_loop:none 335*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet loop:<<Loop>> outer_loop:none 336*795d594fSAndroid Build Coastguard Worker 337*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.CrossOverLoop2(java.lang.Object, java.lang.Object) scheduler (after) 338*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi loop:<<Loop:B\d+>> outer_loop:none 339*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet loop:<<Loop>> outer_loop:none 340*795d594fSAndroid Build Coastguard Worker /// CHECK: Add loop:<<Loop>> outer_loop:none 341*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet loop:<<Loop>> outer_loop:none 342*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet loop:<<Loop>> outer_loop:none 343*795d594fSAndroid Build Coastguard Worker /// CHECK: Add loop:<<Loop>> outer_loop:none 344*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet loop:<<Loop>> outer_loop:none CrossOverLoop2(Object a, Object b)345*795d594fSAndroid Build Coastguard Worker private static void CrossOverLoop2(Object a, Object b) { 346*795d594fSAndroid Build Coastguard Worker ((int[])b)[20] = 99; 347*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ((int[])a).length; i++) { 348*795d594fSAndroid Build Coastguard Worker ((int[])a)[i] = ((int[])b)[20] - 7; 349*795d594fSAndroid Build Coastguard Worker i++; 350*795d594fSAndroid Build Coastguard Worker ((int[])a)[i] = ((int[])b)[20] - 7; 351*795d594fSAndroid Build Coastguard Worker } 352*795d594fSAndroid Build Coastguard Worker } 353*795d594fSAndroid Build Coastguard Worker 354*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.accessFields() scheduler (before) 355*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 356*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 357*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 358*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 359*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 360*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 361*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldGet 362*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 363*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldSet 364*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldGet 365*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 366*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldSet 367*795d594fSAndroid Build Coastguard Worker 368*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.accessFields() scheduler (after) 369*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: InstanceFieldGet 370*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: InstanceFieldGet 371*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: StaticFieldGet 372*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: StaticFieldGet 373*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 374*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 375*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 376*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 377*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: InstanceFieldSet 378*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: InstanceFieldSet 379*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: StaticFieldSet 380*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: StaticFieldSet 381*795d594fSAndroid Build Coastguard Worker 382*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.accessFields() scheduler (before) 383*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 384*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 385*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 386*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 387*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 388*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 389*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldGet 390*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 391*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldSet 392*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldGet 393*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 394*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldSet 395*795d594fSAndroid Build Coastguard Worker 396*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.accessFields() scheduler (after) 397*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: InstanceFieldGet 398*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: InstanceFieldGet 399*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: StaticFieldGet 400*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: StaticFieldGet 401*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 402*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 403*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 404*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 405*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: InstanceFieldSet 406*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: InstanceFieldSet 407*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: StaticFieldSet 408*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: StaticFieldSet accessFields()409*795d594fSAndroid Build Coastguard Worker public void accessFields() { 410*795d594fSAndroid Build Coastguard Worker my_obj = new ExampleObj(1, 2); 411*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) { 412*795d594fSAndroid Build Coastguard Worker my_obj.n1++; 413*795d594fSAndroid Build Coastguard Worker my_obj.n2++; 414*795d594fSAndroid Build Coastguard Worker // Note: ClinitCheck(Main) is eliminated because Main initialization is trivial. b/62478025 415*795d594fSAndroid Build Coastguard Worker number1++; 416*795d594fSAndroid Build Coastguard Worker number2++; 417*795d594fSAndroid Build Coastguard Worker } 418*795d594fSAndroid Build Coastguard Worker } 419*795d594fSAndroid Build Coastguard Worker 420*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.accessFieldsVolatile() scheduler (before) 421*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.accessFieldsVolatile() scheduler (before) 422*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 423*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 424*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 425*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 426*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 427*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 428*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldGet 429*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 430*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldSet 431*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldGet 432*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 433*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldSet 434*795d594fSAndroid Build Coastguard Worker 435*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.accessFieldsVolatile() scheduler (after) 436*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.accessFieldsVolatile() scheduler (after) 437*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 438*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 439*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 440*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 441*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 442*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 443*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldGet 444*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 445*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldSet 446*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldGet 447*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 448*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldSet 449*795d594fSAndroid Build Coastguard Worker accessFieldsVolatile()450*795d594fSAndroid Build Coastguard Worker public void accessFieldsVolatile() { 451*795d594fSAndroid Build Coastguard Worker my_obj = new ExampleObj(1, 2); 452*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) { 453*795d594fSAndroid Build Coastguard Worker my_obj.n1++; 454*795d594fSAndroid Build Coastguard Worker my_obj.n2++; 455*795d594fSAndroid Build Coastguard Worker number1++; 456*795d594fSAndroid Build Coastguard Worker number3++; 457*795d594fSAndroid Build Coastguard Worker } 458*795d594fSAndroid Build Coastguard Worker } 459*795d594fSAndroid Build Coastguard Worker 460*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.accessFieldsUnresolved() scheduler (before) 461*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.accessFieldsUnresolved() scheduler (before) 462*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 463*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 464*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 465*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 466*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 467*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 468*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldGet 469*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 470*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldSet 471*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldGet 472*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 473*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldSet 474*795d594fSAndroid Build Coastguard Worker 475*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.accessFieldsUnresolved() scheduler (after) 476*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.accessFieldsUnresolved() scheduler (after) 477*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 478*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 479*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 480*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldGet 481*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 482*795d594fSAndroid Build Coastguard Worker /// CHECK: InstanceFieldSet 483*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldGet 484*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 485*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedInstanceFieldSet 486*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldGet 487*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 488*795d594fSAndroid Build Coastguard Worker /// CHECK: UnresolvedStaticFieldSet 489*795d594fSAndroid Build Coastguard Worker accessFieldsUnresolved()490*795d594fSAndroid Build Coastguard Worker public void accessFieldsUnresolved() { 491*795d594fSAndroid Build Coastguard Worker my_obj = new ExampleObj(1, 2); 492*795d594fSAndroid Build Coastguard Worker UnresolvedClass unresolved_obj = new UnresolvedClass(); 493*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) { 494*795d594fSAndroid Build Coastguard Worker my_obj.n1++; 495*795d594fSAndroid Build Coastguard Worker my_obj.n2++; 496*795d594fSAndroid Build Coastguard Worker unresolved_obj.instanceInt++; 497*795d594fSAndroid Build Coastguard Worker UnresolvedClass.staticInt++; 498*795d594fSAndroid Build Coastguard Worker } 499*795d594fSAndroid Build Coastguard Worker } 500*795d594fSAndroid Build Coastguard Worker 501*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.intDiv(int) scheduler (before) 502*795d594fSAndroid Build Coastguard Worker /// CHECK: Sub 503*795d594fSAndroid Build Coastguard Worker /// CHECK: DivZeroCheck 504*795d594fSAndroid Build Coastguard Worker /// CHECK: Div 505*795d594fSAndroid Build Coastguard Worker /// CHECK: StaticFieldSet 506*795d594fSAndroid Build Coastguard Worker 507*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.intDiv(int) scheduler (after) 508*795d594fSAndroid Build Coastguard Worker /// CHECK: Sub 509*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: StaticFieldSet 510*795d594fSAndroid Build Coastguard Worker /// CHECK: DivZeroCheck 511*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Sub 512*795d594fSAndroid Build Coastguard Worker /// CHECK: Div intDiv(int arg)513*795d594fSAndroid Build Coastguard Worker public static int intDiv(int arg) { 514*795d594fSAndroid Build Coastguard Worker int res = 0; 515*795d594fSAndroid Build Coastguard Worker int tmp = arg; 516*795d594fSAndroid Build Coastguard Worker for (int i = 1; i < arg; i++) { 517*795d594fSAndroid Build Coastguard Worker tmp -= i; 518*795d594fSAndroid Build Coastguard Worker res = res / i; // div-zero check barrier. 519*795d594fSAndroid Build Coastguard Worker static_variable++; 520*795d594fSAndroid Build Coastguard Worker } 521*795d594fSAndroid Build Coastguard Worker res += tmp; 522*795d594fSAndroid Build Coastguard Worker return res; 523*795d594fSAndroid Build Coastguard Worker } 524*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)525*795d594fSAndroid Build Coastguard Worker private static void expectEquals(int expected, int result) { 526*795d594fSAndroid Build Coastguard Worker if (expected != result) { 527*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 528*795d594fSAndroid Build Coastguard Worker } 529*795d594fSAndroid Build Coastguard Worker } 530*795d594fSAndroid Build Coastguard Worker 531*795d594fSAndroid Build Coastguard Worker private static final int ARRAY_SIZE = 32; 532*795d594fSAndroid Build Coastguard Worker 533*795d594fSAndroid Build Coastguard Worker // Check that VecReplicateScalar is not reordered. 534*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.testVecReplicateScalar() scheduler (before) 535*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi loop:<<Loop:B\d+>> outer_loop:none 536*795d594fSAndroid Build Coastguard Worker /// CHECK: NewArray loop:<<Loop>> outer_loop:none 537*795d594fSAndroid Build Coastguard Worker /// CHECK: VecReplicateScalar loop:<<Loop>> outer_loop:none 538*795d594fSAndroid Build Coastguard Worker 539*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.testVecReplicateScalar() scheduler (after) 540*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi loop:<<Loop:B\d+>> outer_loop:none 541*795d594fSAndroid Build Coastguard Worker /// CHECK: NewArray loop:<<Loop>> outer_loop:none 542*795d594fSAndroid Build Coastguard Worker /// CHECK: VecReplicateScalar loop:<<Loop>> outer_loop:none testVecReplicateScalar()543*795d594fSAndroid Build Coastguard Worker private static void testVecReplicateScalar() { 544*795d594fSAndroid Build Coastguard Worker for (int j = 0; j <= 8; j++) { 545*795d594fSAndroid Build Coastguard Worker int[] a = new int[ARRAY_SIZE]; 546*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length; i++) { 547*795d594fSAndroid Build Coastguard Worker a[i] += 1; 548*795d594fSAndroid Build Coastguard Worker } 549*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < a.length; i++) { 550*795d594fSAndroid Build Coastguard Worker expectEquals(1, a[i]); 551*795d594fSAndroid Build Coastguard Worker } 552*795d594fSAndroid Build Coastguard Worker } 553*795d594fSAndroid Build Coastguard Worker } 554*795d594fSAndroid Build Coastguard Worker 555*795d594fSAndroid Build Coastguard Worker // Check that VecSetScalars, VecReduce, VecExtractScalar are not reordered. 556*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.testVecSetScalars() scheduler (before) 557*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi loop:<<Loop:B\d+>> outer_loop:none 558*795d594fSAndroid Build Coastguard Worker /// CHECK: NewArray loop:<<Loop>> outer_loop:none 559*795d594fSAndroid Build Coastguard Worker /// CHECK: VecSetScalars loop:<<Loop>> outer_loop:none 560*795d594fSAndroid Build Coastguard Worker // 561*795d594fSAndroid Build Coastguard Worker /// CHECK: VecReduce loop:<<Loop>> outer_loop:none 562*795d594fSAndroid Build Coastguard Worker /// CHECK: VecExtractScalar loop:<<Loop>> outer_loop:none 563*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect loop:<<Loop>> outer_loop:none 564*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect loop:<<Loop>> outer_loop:none 565*795d594fSAndroid Build Coastguard Worker 566*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.testVecSetScalars() scheduler (after) 567*795d594fSAndroid Build Coastguard Worker /// CHECK: Phi loop:<<Loop:B\d+>> outer_loop:none 568*795d594fSAndroid Build Coastguard Worker /// CHECK: NewArray loop:<<Loop>> outer_loop:none 569*795d594fSAndroid Build Coastguard Worker /// CHECK: VecSetScalars loop:<<Loop>> outer_loop:none 570*795d594fSAndroid Build Coastguard Worker // 571*795d594fSAndroid Build Coastguard Worker /// CHECK: VecReduce loop:<<Loop>> outer_loop:none 572*795d594fSAndroid Build Coastguard Worker /// CHECK: VecExtractScalar loop:<<Loop>> outer_loop:none 573*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect loop:<<Loop>> outer_loop:none 574*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect loop:<<Loop>> outer_loop:none testVecSetScalars()575*795d594fSAndroid Build Coastguard Worker private static void testVecSetScalars() { 576*795d594fSAndroid Build Coastguard Worker for (int j = 0; j <= 8; j++) { 577*795d594fSAndroid Build Coastguard Worker int[] a = new int[ARRAY_SIZE]; 578*795d594fSAndroid Build Coastguard Worker int s = 5; 579*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 580*795d594fSAndroid Build Coastguard Worker s+=a[i]; 581*795d594fSAndroid Build Coastguard Worker } 582*795d594fSAndroid Build Coastguard Worker expectEquals(a[0], 0); 583*795d594fSAndroid Build Coastguard Worker expectEquals(s, 5); 584*795d594fSAndroid Build Coastguard Worker } 585*795d594fSAndroid Build Coastguard Worker } 586*795d594fSAndroid Build Coastguard Worker 587*795d594fSAndroid Build Coastguard Worker // Check that instructions having cross iteration dependencies are not 588*795d594fSAndroid Build Coastguard Worker // reordered. 589*795d594fSAndroid Build Coastguard Worker // 590*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM,ARM64}: void Main.testCrossItersDependencies() scheduler (before) 591*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ID1:i\d+>> Phi [{{i\d+}},<<ID3:i\d+>>] 592*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ID2:i\d+>> Phi [{{i\d+}},<<ID4:i\d+>>] 593*795d594fSAndroid Build Coastguard Worker // 594*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ID3>> Sub [<<ID1>>,<<ID2>>] 595*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ID4>> Add [<<ID2>>,{{i\d+}}] 596*795d594fSAndroid Build Coastguard Worker 597*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM,ARM64}: void Main.testCrossItersDependencies() scheduler (after) 598*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ID1:i\d+>> Phi [{{i\d+}},<<ID3:i\d+>>] 599*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ID2:i\d+>> Phi [{{i\d+}},<<ID4:i\d+>>] 600*795d594fSAndroid Build Coastguard Worker // 601*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ID3>> Sub [<<ID1>>,<<ID2>>] 602*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ID4>> Add [<<ID2>>,{{i\d+}}] 603*795d594fSAndroid Build Coastguard Worker 604*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.testCrossItersDependencies() disassembly (after) 605*795d594fSAndroid Build Coastguard Worker /// CHECK: subs 606*795d594fSAndroid Build Coastguard Worker /// CHECK: add 607*795d594fSAndroid Build Coastguard Worker /// CHECK: adds 608*795d594fSAndroid Build Coastguard Worker /// CHECK: ldr 609*795d594fSAndroid Build Coastguard Worker /// CHECK: tst 610*795d594fSAndroid Build Coastguard Worker /// CHECK: beq 611*795d594fSAndroid Build Coastguard Worker 612*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.testCrossItersDependencies() disassembly (after) 613*795d594fSAndroid Build Coastguard Worker /// CHECK: sub 614*795d594fSAndroid Build Coastguard Worker /// CHECK: add 615*795d594fSAndroid Build Coastguard Worker /// CHECK: add 616*795d594fSAndroid Build Coastguard Worker /// CHECK: ldr 617*795d594fSAndroid Build Coastguard Worker /// CHECK: b testCrossItersDependencies()618*795d594fSAndroid Build Coastguard Worker private static void testCrossItersDependencies() { 619*795d594fSAndroid Build Coastguard Worker int[] data = {1, 2, 3, 0}; 620*795d594fSAndroid Build Coastguard Worker int sub = 0; 621*795d594fSAndroid Build Coastguard Worker int sum = data[0]; 622*795d594fSAndroid Build Coastguard Worker for (int i = 1; data[i] != 0; ++i) { 623*795d594fSAndroid Build Coastguard Worker sub -= sum; 624*795d594fSAndroid Build Coastguard Worker sum += data[i]; 625*795d594fSAndroid Build Coastguard Worker } 626*795d594fSAndroid Build Coastguard Worker expectEquals(sub, -4); 627*795d594fSAndroid Build Coastguard Worker expectEquals(sum, 6); 628*795d594fSAndroid Build Coastguard Worker } 629*795d594fSAndroid Build Coastguard Worker 630*795d594fSAndroid Build Coastguard Worker // Check instructions defining values for the next iteration don't become 631*795d594fSAndroid Build Coastguard Worker // self-dependent in a scheduling graph which prevents valid reordering. 632*795d594fSAndroid Build Coastguard Worker // 633*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM,ARM64}: void Main.testNoSelfDependantSchedNode(int) scheduler (before) 634*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 635*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 636*795d594fSAndroid Build Coastguard Worker /// CHECK: LessThanOrEqual 637*795d594fSAndroid Build Coastguard Worker /// CHECK: Select 638*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 639*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 640*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 641*795d594fSAndroid Build Coastguard Worker 642*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM,ARM64}: void Main.testNoSelfDependantSchedNode(int) scheduler (after) 643*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 644*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 645*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 646*795d594fSAndroid Build Coastguard Worker /// CHECK: LessThanOrEqual 647*795d594fSAndroid Build Coastguard Worker /// CHECK: Select 648*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet 649*795d594fSAndroid Build Coastguard Worker /// CHECK: Add 650*795d594fSAndroid Build Coastguard Worker // 651*795d594fSAndroid Build Coastguard Worker // Parameter n is to prevent unrolling of the main loop. testNoSelfDependantSchedNode(int n)652*795d594fSAndroid Build Coastguard Worker private static void testNoSelfDependantSchedNode(int n) { 653*795d594fSAndroid Build Coastguard Worker final int MAX = 2; 654*795d594fSAndroid Build Coastguard Worker int[] a = {1, 2, 3}; 655*795d594fSAndroid Build Coastguard Worker int[] b = new int[a.length]; 656*795d594fSAndroid Build Coastguard Worker n = Math.min(n, a.length); 657*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < n; ++i) { 658*795d594fSAndroid Build Coastguard Worker int j = a[i]; 659*795d594fSAndroid Build Coastguard Worker b[i] = (j > MAX ? MAX : 0); 660*795d594fSAndroid Build Coastguard Worker } 661*795d594fSAndroid Build Coastguard Worker expectEquals(b[0], 0); 662*795d594fSAndroid Build Coastguard Worker expectEquals(b[1], 0); 663*795d594fSAndroid Build Coastguard Worker expectEquals(b[2], 2); 664*795d594fSAndroid Build Coastguard Worker } 665*795d594fSAndroid Build Coastguard Worker 666*795d594fSAndroid Build Coastguard Worker // In case of cross iteration dependencies when a value for the next iteration is also used on 667*795d594fSAndroid Build Coastguard Worker // the current iteration a MOV instruction is generated anyway. In such cases setting dependency 668*795d594fSAndroid Build Coastguard Worker // between scheduling nodes will not eliminate MOV. 669*795d594fSAndroid Build Coastguard Worker // In the test 'i+1' is such an example. 670*795d594fSAndroid Build Coastguard Worker // The test checks that a dependency between scheduling nodes (first ArrayGet and Add) is not 671*795d594fSAndroid Build Coastguard Worker // setup and Add is scheduled before ArrayGet. 672*795d594fSAndroid Build Coastguard Worker // 673*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM,ARM64}: void Main.testNonPreventingSchedulingCrossItersDeps(int) scheduler (before) 674*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 675*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 676*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 677*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 678*795d594fSAndroid Build Coastguard Worker 679*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM,ARM64}: void Main.testNonPreventingSchedulingCrossItersDeps(int) scheduler (after) 680*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 681*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: Add 682*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 683*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet 684*795d594fSAndroid Build Coastguard Worker // 685*795d594fSAndroid Build Coastguard Worker // Parameter n is to prevent unrolling of the main loop. testNonPreventingSchedulingCrossItersDeps(int n)686*795d594fSAndroid Build Coastguard Worker private static void testNonPreventingSchedulingCrossItersDeps(int n) { 687*795d594fSAndroid Build Coastguard Worker int[] a = {1, 2, 3}; 688*795d594fSAndroid Build Coastguard Worker n = Math.min(n, a.length); 689*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < n - 1; ++i) { 690*795d594fSAndroid Build Coastguard Worker if (a[i] < a[i + 1]) { 691*795d594fSAndroid Build Coastguard Worker int tmp = a[i]; 692*795d594fSAndroid Build Coastguard Worker a[i] = a[i + 1]; 693*795d594fSAndroid Build Coastguard Worker a[i + 1] = tmp; 694*795d594fSAndroid Build Coastguard Worker } 695*795d594fSAndroid Build Coastguard Worker } 696*795d594fSAndroid Build Coastguard Worker expectEquals(a[0], 2); 697*795d594fSAndroid Build Coastguard Worker expectEquals(a[1], 3); 698*795d594fSAndroid Build Coastguard Worker expectEquals(a[2], 1); 699*795d594fSAndroid Build Coastguard Worker } 700*795d594fSAndroid Build Coastguard Worker main(String[] args)701*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 702*795d594fSAndroid Build Coastguard Worker testVecSetScalars(); 703*795d594fSAndroid Build Coastguard Worker testVecReplicateScalar(); 704*795d594fSAndroid Build Coastguard Worker testCrossItersDependencies(); 705*795d594fSAndroid Build Coastguard Worker testNoSelfDependantSchedNode(3); 706*795d594fSAndroid Build Coastguard Worker testNonPreventingSchedulingCrossItersDeps(3); 707*795d594fSAndroid Build Coastguard Worker if ((arrayAccess() + intDiv(10)) != -35) { 708*795d594fSAndroid Build Coastguard Worker System.out.println("FAIL"); 709*795d594fSAndroid Build Coastguard Worker } 710*795d594fSAndroid Build Coastguard Worker } 711*795d594fSAndroid Build Coastguard Worker } 712