xref: /aosp_15_r20/art/test/527-checker-array-access-split/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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