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