1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2015 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 assertIntEquals(int expected, int result)19*795d594fSAndroid Build Coastguard Worker public static void assertIntEquals(int expected, int result) { 20*795d594fSAndroid Build Coastguard Worker if (expected != result) { 21*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 22*795d594fSAndroid Build Coastguard Worker } 23*795d594fSAndroid Build Coastguard Worker } 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker /** 26*795d594fSAndroid Build Coastguard Worker * Test that HArrayGet with a constant index is not split. 27*795d594fSAndroid Build Coastguard Worker */ 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.constantIndexGet(int[]) instruction_simplifier_arm64 (before) 30*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 31*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 32*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,<<Index>>] 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.constantIndexGet(int[]) instruction_simplifier_arm64 (after) 35*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 36*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 37*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 38*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,<<Index>>] 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker 41*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.constantIndexGet(int[]) instruction_simplifier_arm (before) 42*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 43*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 44*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,<<Index>>] 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.constantIndexGet(int[]) instruction_simplifier_arm (after) 47*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 48*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 49*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 50*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,<<Index>>] 51*795d594fSAndroid Build Coastguard Worker constantIndexGet(int array[])52*795d594fSAndroid Build Coastguard Worker public static int constantIndexGet(int array[]) { 53*795d594fSAndroid Build Coastguard Worker return array[1]; 54*795d594fSAndroid Build Coastguard Worker } 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker /** 57*795d594fSAndroid Build Coastguard Worker * Test that HArraySet with a constant index is not split. 58*795d594fSAndroid Build Coastguard Worker */ 59*795d594fSAndroid Build Coastguard Worker 60*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.constantIndexSet(int[]) instruction_simplifier_arm64 (before) 61*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const2:i\d+>> IntConstant 2 62*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 63*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 64*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Const2>>] 65*795d594fSAndroid Build Coastguard Worker 66*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.constantIndexSet(int[]) instruction_simplifier_arm64 (after) 67*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const2:i\d+>> IntConstant 2 68*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 69*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 70*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 71*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Const2>>] 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker 74*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.constantIndexSet(int[]) instruction_simplifier_arm (before) 75*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const2:i\d+>> IntConstant 2 76*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 77*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 78*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Const2>>] 79*795d594fSAndroid Build Coastguard Worker 80*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.constantIndexSet(int[]) instruction_simplifier_arm (after) 81*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const2:i\d+>> IntConstant 2 82*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 83*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 84*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 85*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Const2>>] 86*795d594fSAndroid Build Coastguard Worker constantIndexSet(int array[])87*795d594fSAndroid Build Coastguard Worker public static void constantIndexSet(int array[]) { 88*795d594fSAndroid Build Coastguard Worker array[1] = 2; 89*795d594fSAndroid Build Coastguard Worker } 90*795d594fSAndroid Build Coastguard Worker 91*795d594fSAndroid Build Coastguard Worker /** 92*795d594fSAndroid Build Coastguard Worker * Test basic splitting of HArrayGet. 93*795d594fSAndroid Build Coastguard Worker */ 94*795d594fSAndroid Build Coastguard Worker 95*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.get(int[], int) instruction_simplifier_arm64 (before) 96*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 97*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 98*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,<<Index>>] 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.get(int[], int) instruction_simplifier_arm64 (after) 101*795d594fSAndroid Build Coastguard Worker /// CHECK: <<DataOffset:i\d+>> IntConstant 102*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 103*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 104*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 105*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet [<<Address>>,<<Index>>] 106*795d594fSAndroid Build Coastguard Worker 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.get(int[], int) instruction_simplifier_arm (before) 109*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 110*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 111*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,<<Index>>] 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.get(int[], int) instruction_simplifier_arm (after) 114*795d594fSAndroid Build Coastguard Worker /// CHECK: <<DataOffset:i\d+>> IntConstant 115*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 116*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 117*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 118*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArrayGet [<<Address>>,<<Index>>] 119*795d594fSAndroid Build Coastguard Worker get(int array[], int index)120*795d594fSAndroid Build Coastguard Worker public static int get(int array[], int index) { 121*795d594fSAndroid Build Coastguard Worker return array[index]; 122*795d594fSAndroid Build Coastguard Worker } 123*795d594fSAndroid Build Coastguard Worker 124*795d594fSAndroid Build Coastguard Worker /** 125*795d594fSAndroid Build Coastguard Worker * Test basic splitting of HArraySet. 126*795d594fSAndroid Build Coastguard Worker */ 127*795d594fSAndroid Build Coastguard Worker 128*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.set(int[], int, int) instruction_simplifier_arm64 (before) 129*795d594fSAndroid Build Coastguard Worker /// CHECK: ParameterValue 130*795d594fSAndroid Build Coastguard Worker /// CHECK: ParameterValue 131*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Arg:i\d+>> ParameterValue 132*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 133*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 134*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Arg>>] 135*795d594fSAndroid Build Coastguard Worker 136*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.set(int[], int, int) instruction_simplifier_arm64 (after) 137*795d594fSAndroid Build Coastguard Worker /// CHECK: ParameterValue 138*795d594fSAndroid Build Coastguard Worker /// CHECK: ParameterValue 139*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Arg:i\d+>> ParameterValue 140*795d594fSAndroid Build Coastguard Worker /// CHECK: <<DataOffset:i\d+>> IntConstant 141*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 142*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 143*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 144*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet [<<Address>>,<<Index>>,<<Arg>>] 145*795d594fSAndroid Build Coastguard Worker 146*795d594fSAndroid Build Coastguard Worker 147*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.set(int[], int, int) instruction_simplifier_arm (before) 148*795d594fSAndroid Build Coastguard Worker /// CHECK: ParameterValue 149*795d594fSAndroid Build Coastguard Worker /// CHECK: ParameterValue 150*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Arg:i\d+>> ParameterValue 151*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 152*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 153*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Arg>>] 154*795d594fSAndroid Build Coastguard Worker 155*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.set(int[], int, int) instruction_simplifier_arm (after) 156*795d594fSAndroid Build Coastguard Worker /// CHECK: ParameterValue 157*795d594fSAndroid Build Coastguard Worker /// CHECK: ParameterValue 158*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Arg:i\d+>> ParameterValue 159*795d594fSAndroid Build Coastguard Worker /// CHECK: <<DataOffset:i\d+>> IntConstant 160*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 161*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 162*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 163*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet [<<Address>>,<<Index>>,<<Arg>>] 164*795d594fSAndroid Build Coastguard Worker set(int array[], int index, int value)165*795d594fSAndroid Build Coastguard Worker public static void set(int array[], int index, int value) { 166*795d594fSAndroid Build Coastguard Worker array[index] = value; 167*795d594fSAndroid Build Coastguard Worker } 168*795d594fSAndroid Build Coastguard Worker 169*795d594fSAndroid Build Coastguard Worker /** 170*795d594fSAndroid Build Coastguard Worker * Check that the intermediate address can be shared after GVN. 171*795d594fSAndroid Build Coastguard Worker */ 172*795d594fSAndroid Build Coastguard Worker 173*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.getSet(int[], int) instruction_simplifier_arm64 (before) 174*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const1:i\d+>> IntConstant 1 175*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 176*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 177*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Array>>,<<Index>>] 178*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 179*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Add>>] 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.getSet(int[], int) instruction_simplifier_arm64 (after) 182*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 183*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 184*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 185*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 186*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 187*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] 188*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 189*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 190*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Add>>] 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.getSet(int[], int) GVN$after_arch (after) 193*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 194*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 195*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 196*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 197*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 198*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address>>,<<Index>>] 199*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 200*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 201*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Address>>,<<Index>>,<<Add>>] 202*795d594fSAndroid Build Coastguard Worker 203*795d594fSAndroid Build Coastguard Worker 204*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.getSet(int[], int) instruction_simplifier_arm (before) 205*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const1:i\d+>> IntConstant 1 206*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 207*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 208*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Array>>,<<Index>>] 209*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 210*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Add>>] 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.getSet(int[], int) instruction_simplifier_arm (after) 213*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 214*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 215*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 216*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 217*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 218*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] 219*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 220*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 221*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Add>>] 222*795d594fSAndroid Build Coastguard Worker 223*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.getSet(int[], int) GVN$after_arch (after) 224*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 225*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 226*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 227*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 228*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 229*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address>>,<<Index>>] 230*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 231*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 232*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Address>>,<<Index>>,<<Add>>] getSet(int array[], int index)233*795d594fSAndroid Build Coastguard Worker public static void getSet(int array[], int index) { 234*795d594fSAndroid Build Coastguard Worker array[index] = array[index] + 1; 235*795d594fSAndroid Build Coastguard Worker } 236*795d594fSAndroid Build Coastguard Worker 237*795d594fSAndroid Build Coastguard Worker /** 238*795d594fSAndroid Build Coastguard Worker * Check that the intermediate address computation is not reordered or merged 239*795d594fSAndroid Build Coastguard Worker * across IRs that can trigger GC. 240*795d594fSAndroid Build Coastguard Worker */ 241*795d594fSAndroid Build Coastguard Worker 242*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int[] Main.accrossGC(int[], int) instruction_simplifier_arm64 (before) 243*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const1:i\d+>> IntConstant 1 244*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 245*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 246*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Array>>,<<Index>>] 247*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 248*795d594fSAndroid Build Coastguard Worker /// CHECK: NewArray 249*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Add>>] 250*795d594fSAndroid Build Coastguard Worker 251*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int[] Main.accrossGC(int[], int) instruction_simplifier_arm64 (after) 252*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 253*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 254*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 255*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 256*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 257*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] 258*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 259*795d594fSAndroid Build Coastguard Worker /// CHECK: NewArray 260*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 261*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Add>>] 262*795d594fSAndroid Build Coastguard Worker 263*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int[] Main.accrossGC(int[], int) GVN$after_arch (after) 264*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 265*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 266*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 267*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 268*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 269*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] 270*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 271*795d594fSAndroid Build Coastguard Worker /// CHECK: NewArray 272*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 273*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Address2>>,<<Index>>,<<Add>>] 274*795d594fSAndroid Build Coastguard Worker 275*795d594fSAndroid Build Coastguard Worker 276*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int[] Main.accrossGC(int[], int) instruction_simplifier_arm (before) 277*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const1:i\d+>> IntConstant 1 278*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 279*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 280*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Array>>,<<Index>>] 281*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 282*795d594fSAndroid Build Coastguard Worker /// CHECK: NewArray 283*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Add>>] 284*795d594fSAndroid Build Coastguard Worker 285*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int[] Main.accrossGC(int[], int) instruction_simplifier_arm (after) 286*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 287*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 288*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 289*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 290*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 291*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] 292*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 293*795d594fSAndroid Build Coastguard Worker /// CHECK: NewArray 294*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 295*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Add>>] 296*795d594fSAndroid Build Coastguard Worker 297*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int[] Main.accrossGC(int[], int) GVN$after_arch (after) 298*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 299*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 300*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck 301*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> BoundsCheck 302*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 303*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] 304*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Add:i\d+>> Add [<<ArrayGet>>,<<Const1>>] 305*795d594fSAndroid Build Coastguard Worker /// CHECK: NewArray 306*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 307*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Address2>>,<<Index>>,<<Add>>] 308*795d594fSAndroid Build Coastguard Worker accrossGC(int array[], int index)309*795d594fSAndroid Build Coastguard Worker public static int[] accrossGC(int array[], int index) { 310*795d594fSAndroid Build Coastguard Worker int tmp = array[index] + 1; 311*795d594fSAndroid Build Coastguard Worker int[] new_array = new int[1]; 312*795d594fSAndroid Build Coastguard Worker array[index] = tmp; 313*795d594fSAndroid Build Coastguard Worker return new_array; 314*795d594fSAndroid Build Coastguard Worker } 315*795d594fSAndroid Build Coastguard Worker 316*795d594fSAndroid Build Coastguard Worker /** 317*795d594fSAndroid Build Coastguard Worker * Test that the intermediate address is shared between array accesses after 318*795d594fSAndroid Build Coastguard Worker * the bounds check have been removed by BCE. 319*795d594fSAndroid Build Coastguard Worker */ 320*795d594fSAndroid Build Coastguard Worker // For checker tests `instruction_simplifier_<arch> (after)` below, by the time we reach 321*795d594fSAndroid Build Coastguard Worker // the architecture-specific instruction simplifier, BCE has removed the bounds checks in 322*795d594fSAndroid Build Coastguard Worker // the loop. 323*795d594fSAndroid Build Coastguard Worker 324*795d594fSAndroid Build Coastguard Worker // Note that we do not care that the `DataOffset` is `12`. But if we do not 325*795d594fSAndroid Build Coastguard Worker // specify it and any other `IntConstant` appears before that instruction, 326*795d594fSAndroid Build Coastguard Worker // checker will match the previous `IntConstant`, and we will thus fail the 327*795d594fSAndroid Build Coastguard Worker // check. 328*795d594fSAndroid Build Coastguard Worker 329*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.canMergeAfterBCE1() instruction_simplifier_arm64 (before) 330*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const7:i\d+>> IntConstant 7 331*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 332*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 333*795d594fSAndroid Build Coastguard Worker /// CHECK: If 334*795d594fSAndroid Build Coastguard Worker // -------------- Loop 335*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Array>>,<<Index>>] 336*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Div:i\d+>> Div [<<ArrayGet>>,<<Const7>>] 337*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Div>>] 338*795d594fSAndroid Build Coastguard Worker 339*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.canMergeAfterBCE1() instruction_simplifier_arm64 (after) 340*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const7:i\d+>> IntConstant 7 341*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 342*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 343*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 344*795d594fSAndroid Build Coastguard Worker /// CHECK: If 345*795d594fSAndroid Build Coastguard Worker // -------------- Loop 346*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 347*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] 348*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Div:i\d+>> Div [<<ArrayGet>>,<<Const7>>] 349*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 350*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Div>>] 351*795d594fSAndroid Build Coastguard Worker 352*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.canMergeAfterBCE1() GVN$after_arch (after) 353*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const7:i\d+>> IntConstant 7 354*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 355*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 356*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 357*795d594fSAndroid Build Coastguard Worker /// CHECK: If 358*795d594fSAndroid Build Coastguard Worker // -------------- Loop 359*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 360*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address>>,<<Index>>] 361*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Div:i\d+>> Div [<<ArrayGet>>,<<Const7>>] 362*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 363*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Address>>,<<Index>>,<<Div>>] 364*795d594fSAndroid Build Coastguard Worker 365*795d594fSAndroid Build Coastguard Worker 366*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.canMergeAfterBCE1() instruction_simplifier_arm (before) 367*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const7:i\d+>> IntConstant 7 368*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 369*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 370*795d594fSAndroid Build Coastguard Worker /// CHECK: If 371*795d594fSAndroid Build Coastguard Worker // -------------- Loop 372*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Array>>,<<Index>>] 373*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Div:i\d+>> Div [<<ArrayGet>>,<<Const7>>] 374*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index>>,<<Div>>] 375*795d594fSAndroid Build Coastguard Worker 376*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.canMergeAfterBCE1() instruction_simplifier_arm (after) 377*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const7:i\d+>> IntConstant 7 378*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 379*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 380*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 381*795d594fSAndroid Build Coastguard Worker /// CHECK: If 382*795d594fSAndroid Build Coastguard Worker // -------------- Loop 383*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 384*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: <<ArrayGet:i\d+>> ArrayGet [<<Address1>>,<<Index>>] 385*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Div:i\d+>> Div [<<ArrayGet>>,<<Const7>>] 386*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 387*795d594fSAndroid Build Coastguard Worker /// CHECK-NEXT: ArraySet [<<Address2>>,<<Index>>,<<Div>>] 388*795d594fSAndroid Build Coastguard Worker 389*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.canMergeAfterBCE1() GVN$after_arch (after) 390*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const7:i\d+>> IntConstant 7 391*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 392*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 393*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 394*795d594fSAndroid Build Coastguard Worker /// CHECK: If 395*795d594fSAndroid Build Coastguard Worker // -------------- Loop 396*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 397*795d594fSAndroid Build Coastguard Worker /// CHECK: <<ArrayGet:i\d+>> ArrayGet [<<Address>>,<<Index>>] 398*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Div:i\d+>> Div [<<ArrayGet>>,<<Const7>>] 399*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 400*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Address>>,<<Index>>,<<Div>>] 401*795d594fSAndroid Build Coastguard Worker canMergeAfterBCE1()402*795d594fSAndroid Build Coastguard Worker public static int canMergeAfterBCE1() { 403*795d594fSAndroid Build Coastguard Worker int[] array = {0, 7, 14, 21, 28, 35, 42}; 404*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < array.length; i++) { 405*795d594fSAndroid Build Coastguard Worker array[i] = array[i] / 7; 406*795d594fSAndroid Build Coastguard Worker } 407*795d594fSAndroid Build Coastguard Worker return array[array.length - 1]; 408*795d594fSAndroid Build Coastguard Worker } 409*795d594fSAndroid Build Coastguard Worker 410*795d594fSAndroid Build Coastguard Worker /** 411*795d594fSAndroid Build Coastguard Worker * This test case is similar to `canMergeAfterBCE1`, but with different 412*795d594fSAndroid Build Coastguard Worker * indexes for the accesses. 413*795d594fSAndroid Build Coastguard Worker */ 414*795d594fSAndroid Build Coastguard Worker 415*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.canMergeAfterBCE2() instruction_simplifier_arm64 (before) 416*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const1:i\d+>> IntConstant 1 417*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 418*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 419*795d594fSAndroid Build Coastguard Worker /// CHECK: If 420*795d594fSAndroid Build Coastguard Worker // -------------- Loop 421*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index1:i\d+>> Add [<<Index>>,<<Const1>>] 422*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI:i\d+>> ArrayGet [<<Array>>,<<Index>>] 423*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI1:i\d+>> ArrayGet [<<Array>>,<<Index1>>] 424*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shl:i\d+>> Shl [<<ArrayGetI>>,<<ArrayGetI1>>] 425*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index1>>,<<Shl>>] 426*795d594fSAndroid Build Coastguard Worker 427*795d594fSAndroid Build Coastguard Worker // Note that we do not care that the `DataOffset` is `12`. But if we do not 428*795d594fSAndroid Build Coastguard Worker // specify it and any other `IntConstant` appears before that instruction, 429*795d594fSAndroid Build Coastguard Worker // checker will match the previous `IntConstant`, and we will thus fail the 430*795d594fSAndroid Build Coastguard Worker // check. 431*795d594fSAndroid Build Coastguard Worker 432*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.canMergeAfterBCE2() instruction_simplifier_arm64 (after) 433*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 434*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 435*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 436*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 437*795d594fSAndroid Build Coastguard Worker /// CHECK: If 438*795d594fSAndroid Build Coastguard Worker // -------------- Loop 439*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index1:i\d+>> Add [<<Index>>,<<Const1>>] 440*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 441*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI:i\d+>> ArrayGet [<<Address1>>,<<Index>>] 442*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 443*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI1:i\d+>> ArrayGet [<<Address2>>,<<Index1>>] 444*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shl:i\d+>> Shl [<<ArrayGetI>>,<<ArrayGetI1>>] 445*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address3:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 446*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Address3>>,<<Index1>>,<<Shl>>] 447*795d594fSAndroid Build Coastguard Worker 448*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.canMergeAfterBCE2() GVN$after_arch (after) 449*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 450*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 451*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 452*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 453*795d594fSAndroid Build Coastguard Worker /// CHECK: If 454*795d594fSAndroid Build Coastguard Worker // -------------- Loop 455*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index1:i\d+>> Add [<<Index>>,<<Const1>>] 456*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 457*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI:i\d+>> ArrayGet [<<Address>>,<<Index>>] 458*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI1:i\d+>> ArrayGet [<<Address>>,<<Index1>>] 459*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shl:i\d+>> Shl [<<ArrayGetI>>,<<ArrayGetI1>>] 460*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Address>>,<<Index1>>,<<Shl>>] 461*795d594fSAndroid Build Coastguard Worker 462*795d594fSAndroid Build Coastguard Worker // There should be only one intermediate address computation in the loop. 463*795d594fSAndroid Build Coastguard Worker 464*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.canMergeAfterBCE2() GVN$after_arch (after) 465*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 466*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 467*795d594fSAndroid Build Coastguard Worker 468*795d594fSAndroid Build Coastguard Worker 469*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.canMergeAfterBCE2() instruction_simplifier_arm (before) 470*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Const1:i\d+>> IntConstant 1 471*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 472*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 473*795d594fSAndroid Build Coastguard Worker /// CHECK: If 474*795d594fSAndroid Build Coastguard Worker // -------------- Loop 475*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index1:i\d+>> Add [<<Index>>,<<Const1>>] 476*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI:i\d+>> ArrayGet [<<Array>>,<<Index>>] 477*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI1:i\d+>> ArrayGet [<<Array>>,<<Index1>>] 478*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shl:i\d+>> Shl [<<ArrayGetI>>,<<ArrayGetI1>>] 479*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,<<Index1>>,<<Shl>>] 480*795d594fSAndroid Build Coastguard Worker 481*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.canMergeAfterBCE2() instruction_simplifier_arm (after) 482*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 483*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 484*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 485*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 486*795d594fSAndroid Build Coastguard Worker /// CHECK: If 487*795d594fSAndroid Build Coastguard Worker // -------------- Loop 488*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index1:i\d+>> Add [<<Index>>,<<Const1>>] 489*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 490*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI:i\d+>> ArrayGet [<<Address1>>,<<Index>>] 491*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 492*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI1:i\d+>> ArrayGet [<<Address2>>,<<Index1>>] 493*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shl:i\d+>> Shl [<<ArrayGetI>>,<<ArrayGetI1>>] 494*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Address3:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 495*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Address3>>,<<Index1>>,<<Shl>>] 496*795d594fSAndroid Build Coastguard Worker 497*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.canMergeAfterBCE2() GVN$after_arch (after) 498*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 499*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12 500*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NewArray 501*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Index:i\d+>> Phi 502*795d594fSAndroid Build Coastguard Worker /// CHECK: If 503*795d594fSAndroid Build Coastguard Worker // -------------- Loop 504*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index1:i\d+>> Add [<<Index>>,<<Const1>>] 505*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Address:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 506*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI:i\d+>> ArrayGet [<<Address>>,<<Index>>] 507*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ArrayGetI1:i\d+>> ArrayGet [<<Address>>,<<Index1>>] 508*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Shl:i\d+>> Shl [<<ArrayGetI>>,<<ArrayGetI1>>] 509*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Address>>,<<Index1>>,<<Shl>>] 510*795d594fSAndroid Build Coastguard Worker 511*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.canMergeAfterBCE2() GVN$after_arch (after) 512*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 513*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 514*795d594fSAndroid Build Coastguard Worker canMergeAfterBCE2()515*795d594fSAndroid Build Coastguard Worker public static int canMergeAfterBCE2() { 516*795d594fSAndroid Build Coastguard Worker int[] array = {128, 64, 32, 8, 4, 2 }; 517*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < array.length - 1; i++) { 518*795d594fSAndroid Build Coastguard Worker array[i + 1] = array[i] << array[i + 1]; 519*795d594fSAndroid Build Coastguard Worker } 520*795d594fSAndroid Build Coastguard Worker return array[array.length - 1]; 521*795d594fSAndroid Build Coastguard Worker } 522*795d594fSAndroid Build Coastguard Worker 523*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.checkLongFloatDouble() instruction_simplifier_arm (before) 524*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array1:l\d+>> NewArray 525*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array2:l\d+>> NewArray 526*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array3:l\d+>> NewArray 527*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 528*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet [<<Array1>>,<<Index>>] 529*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet [<<Array2>>,<<Index>>] 530*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet [<<Array3>>,<<Index>>] 531*795d594fSAndroid Build Coastguard Worker 532*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.checkLongFloatDouble() instruction_simplifier_arm (after) 533*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array1:l\d+>> NewArray 534*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array2:l\d+>> NewArray 535*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Array3:l\d+>> NewArray 536*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Index:i\d+>> Phi 537*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet [<<Array1>>,<<Index>>] 538*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet [<<Array2>>,<<Index>>] 539*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet [<<Array3>>,<<Index>>] 540*795d594fSAndroid Build Coastguard Worker 541*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: int Main.checkLongFloatDouble() instruction_simplifier_arm (after) 542*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress checkLongFloatDouble()543*795d594fSAndroid Build Coastguard Worker public static int checkLongFloatDouble() { 544*795d594fSAndroid Build Coastguard Worker long[] array_long = {0, 1, 2, 3}; 545*795d594fSAndroid Build Coastguard Worker float[] array_float = {(float)0.0, (float)1.0, (float)2.0, (float)3.0}; 546*795d594fSAndroid Build Coastguard Worker double[] array_double = {0.0, 1.0, 2.0, 3.0}; 547*795d594fSAndroid Build Coastguard Worker double s = 0.0; 548*795d594fSAndroid Build Coastguard Worker 549*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++) { 550*795d594fSAndroid Build Coastguard Worker s += (double)array_long[i] + (double)array_float[i] + array_double[i]; 551*795d594fSAndroid Build Coastguard Worker } 552*795d594fSAndroid Build Coastguard Worker return (int)s; 553*795d594fSAndroid Build Coastguard Worker } 554*795d594fSAndroid Build Coastguard Worker 555*795d594fSAndroid Build Coastguard Worker // 556*795d594fSAndroid Build Coastguard Worker // Check that IntermediateAddress can be shared across BoundsCheck, DivZeroCheck and NullCheck - 557*795d594fSAndroid Build Coastguard Worker // instruction which have fatal slow paths. 558*795d594fSAndroid Build Coastguard Worker // 559*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM,ARM64}: void Main.checkGVNForFatalChecks(int, int, char[], int[]) GVN$after_arch (before) 560*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 561*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 562*795d594fSAndroid Build Coastguard Worker // 563*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 564*795d594fSAndroid Build Coastguard Worker 565*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM,ARM64}: void Main.checkGVNForFatalChecks(int, int, char[], int[]) GVN$after_arch (after) 566*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 567*795d594fSAndroid Build Coastguard Worker // 568*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress checkGVNForFatalChecks(int begin, int end, char[] buf1, int[] buf2)569*795d594fSAndroid Build Coastguard Worker public final static void checkGVNForFatalChecks(int begin, int end, char[] buf1, int[] buf2) { 570*795d594fSAndroid Build Coastguard Worker buf1[begin] = 'a'; 571*795d594fSAndroid Build Coastguard Worker buf2[0] = begin / end; 572*795d594fSAndroid Build Coastguard Worker buf1[end] = 'n'; 573*795d594fSAndroid Build Coastguard Worker } 574*795d594fSAndroid Build Coastguard Worker 575*795d594fSAndroid Build Coastguard Worker // 576*795d594fSAndroid Build Coastguard Worker // Check that IntermediateAddress can be shared for object ArrayGets. 577*795d594fSAndroid Build Coastguard Worker // 578*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.checkObjectArrayGet(int, java.lang.Integer[], java.lang.Integer[]) instruction_simplifier_arm64 (before) 579*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Parameter:l\d+>> ParameterValue 580*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck [<<Parameter>>] 581*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,{{i\d+}}] 582*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,{{i\d+}}] 583*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,{{i\d+}},{{l\d+}}] 584*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<Array>>,{{i\d+}}] 585*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,{{i\d+}},{{l\d+}}] 586*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,{{i\d+}},{{l\d+}}] 587*795d594fSAndroid Build Coastguard Worker 588*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.checkObjectArrayGet(int, java.lang.Integer[], java.lang.Integer[]) instruction_simplifier_arm64 (after) 589*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Parameter:l\d+>> ParameterValue 590*795d594fSAndroid Build Coastguard Worker /// CHECK: <<DataOffset:i\d+>> IntConstant 12 591*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck [<<Parameter>>] 592*795d594fSAndroid Build Coastguard Worker /// CHECK: <<IntAddr1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 593*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<IntAddr1>>,{{i\d+}}] 594*795d594fSAndroid Build Coastguard Worker /// CHECK: <<IntAddr2:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 595*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<IntAddr2>>,{{i\d+}}] 596*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,{{i\d+}},{{l\d+}}] needs_type_check:false can_trigger_gc:false 597*795d594fSAndroid Build Coastguard Worker /// CHECK: <<IntAddr3:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 598*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<IntAddr3>>,{{i\d+}}] 599*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,{{i\d+}},{{l\d+}}] 600*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,{{i\d+}},{{l\d+}}] 601*795d594fSAndroid Build Coastguard Worker // 602*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.checkObjectArrayGet(int, java.lang.Integer[], java.lang.Integer[]) instruction_simplifier_arm64 (after) 603*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 604*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 605*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 606*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress 607*795d594fSAndroid Build Coastguard Worker 608*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.checkObjectArrayGet(int, java.lang.Integer[], java.lang.Integer[]) GVN$after_arch (after) 609*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Parameter:l\d+>> ParameterValue 610*795d594fSAndroid Build Coastguard Worker /// CHECK: <<DataOffset:i\d+>> IntConstant 12 611*795d594fSAndroid Build Coastguard Worker /// CHECK: <<Array:l\d+>> NullCheck [<<Parameter>>] 612*795d594fSAndroid Build Coastguard Worker /// CHECK: <<IntAddr1:i\d+>> IntermediateAddress [<<Array>>,<<DataOffset>>] 613*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<IntAddr1>>,{{i\d+}}] 614*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<IntAddr1>>,{{i\d+}}] 615*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,{{i\d+}},{{l\d+}}] needs_type_check:false can_trigger_gc:false 616*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<IntAddr1>>,{{i\d+}}] 617*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,{{i\d+}},{{l\d+}}] 618*795d594fSAndroid Build Coastguard Worker /// CHECK: ArraySet [<<Array>>,{{i\d+}},{{l\d+}}] 619*795d594fSAndroid Build Coastguard Worker // 620*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.checkObjectArrayGet(int, java.lang.Integer[], java.lang.Integer[]) GVN$after_arch (after) 621*795d594fSAndroid Build Coastguard Worker /// CHECK: IntermediateAddress 622*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: IntermediateAddress checkObjectArrayGet(int index, Integer[] a, Integer[] b)623*795d594fSAndroid Build Coastguard Worker public final static int checkObjectArrayGet(int index, Integer[] a, Integer[] b) { 624*795d594fSAndroid Build Coastguard Worker Integer five = Integer.valueOf(5); 625*795d594fSAndroid Build Coastguard Worker int tmp1 = a[index]; 626*795d594fSAndroid Build Coastguard Worker tmp1 += a[index + 1]; 627*795d594fSAndroid Build Coastguard Worker a[index + 1] = five; 628*795d594fSAndroid Build Coastguard Worker tmp1 += a[index + 2]; 629*795d594fSAndroid Build Coastguard Worker a[index + 2] = five; 630*795d594fSAndroid Build Coastguard Worker a[index + 3] = five; 631*795d594fSAndroid Build Coastguard Worker return tmp1; 632*795d594fSAndroid Build Coastguard Worker } 633*795d594fSAndroid Build Coastguard Worker 634*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.testIntAddressObjDisasm(java.lang.Integer[], int) disassembly (after) 635*795d594fSAndroid Build Coastguard Worker /// CHECK: <<IntAddr:i\d+>> IntermediateAddress 636*795d594fSAndroid Build Coastguard Worker /// CHECK: add w<<AddrReg:\d+>>, {{w\d+}}, #0xc 637*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<IntAddr>>,{{i\d+}}] 638*795d594fSAndroid Build Coastguard Worker /// CHECK: ldr {{w\d+}}, [x<<AddrReg>>, x{{\d+}}, lsl #2] 639*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet [<<IntAddr>>,{{i\d+}}] 640*795d594fSAndroid Build Coastguard Worker /// CHECK: ldr {{w\d+}}, [x<<AddrReg>>, x{{\d+}}, lsl #2] 641*795d594fSAndroid Build Coastguard Worker 642*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int Main.testIntAddressObjDisasm(java.lang.Integer[], int) disassembly (after) 643*795d594fSAndroid Build Coastguard Worker /// CHECK: add {{w\d+}}, {{w\d+}}, #0xc 644*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: add {{w\d+}}, {{w\d+}}, #0xc testIntAddressObjDisasm(Integer[] obj, int x)645*795d594fSAndroid Build Coastguard Worker private int testIntAddressObjDisasm(Integer[] obj, int x) { 646*795d594fSAndroid Build Coastguard Worker return obj[x] + obj[x + 1]; 647*795d594fSAndroid Build Coastguard Worker } 648*795d594fSAndroid Build Coastguard Worker 649*795d594fSAndroid Build Coastguard Worker public final static int ARRAY_SIZE = 128; 650*795d594fSAndroid Build Coastguard Worker main(String[] args)651*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 652*795d594fSAndroid Build Coastguard Worker int[] array = {123, 456, 789}; 653*795d594fSAndroid Build Coastguard Worker 654*795d594fSAndroid Build Coastguard Worker assertIntEquals(456, constantIndexGet(array)); 655*795d594fSAndroid Build Coastguard Worker 656*795d594fSAndroid Build Coastguard Worker constantIndexSet(array); 657*795d594fSAndroid Build Coastguard Worker assertIntEquals(2, array[1]); 658*795d594fSAndroid Build Coastguard Worker 659*795d594fSAndroid Build Coastguard Worker assertIntEquals(789, get(array, 2)); 660*795d594fSAndroid Build Coastguard Worker 661*795d594fSAndroid Build Coastguard Worker set(array, 1, 456); 662*795d594fSAndroid Build Coastguard Worker assertIntEquals(456, array[1]); 663*795d594fSAndroid Build Coastguard Worker 664*795d594fSAndroid Build Coastguard Worker getSet(array, 0); 665*795d594fSAndroid Build Coastguard Worker assertIntEquals(124, array[0]); 666*795d594fSAndroid Build Coastguard Worker 667*795d594fSAndroid Build Coastguard Worker accrossGC(array, 0); 668*795d594fSAndroid Build Coastguard Worker assertIntEquals(125, array[0]); 669*795d594fSAndroid Build Coastguard Worker 670*795d594fSAndroid Build Coastguard Worker assertIntEquals(6, canMergeAfterBCE1()); 671*795d594fSAndroid Build Coastguard Worker assertIntEquals(2097152, canMergeAfterBCE2()); 672*795d594fSAndroid Build Coastguard Worker 673*795d594fSAndroid Build Coastguard Worker assertIntEquals(18, checkLongFloatDouble()); 674*795d594fSAndroid Build Coastguard Worker 675*795d594fSAndroid Build Coastguard Worker char[] c1 = new char[ARRAY_SIZE]; 676*795d594fSAndroid Build Coastguard Worker int[] i1 = new int[ARRAY_SIZE]; 677*795d594fSAndroid Build Coastguard Worker checkGVNForFatalChecks(1, 2, c1, i1); 678*795d594fSAndroid Build Coastguard Worker assertIntEquals('n', c1[2]); 679*795d594fSAndroid Build Coastguard Worker } 680*795d594fSAndroid Build Coastguard Worker } 681