xref: /aosp_15_r20/art/test/530-checker-lse/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 class Circle {
Circle(double radius)18*795d594fSAndroid Build Coastguard Worker   Circle(double radius) {
19*795d594fSAndroid Build Coastguard Worker     this.radius = radius;
20*795d594fSAndroid Build Coastguard Worker   }
getRadius()21*795d594fSAndroid Build Coastguard Worker   public double getRadius() {
22*795d594fSAndroid Build Coastguard Worker     return radius;
23*795d594fSAndroid Build Coastguard Worker   }
getArea()24*795d594fSAndroid Build Coastguard Worker   public double getArea() {
25*795d594fSAndroid Build Coastguard Worker     return radius * radius * Math.PI;
26*795d594fSAndroid Build Coastguard Worker   }
27*795d594fSAndroid Build Coastguard Worker   private double radius;
28*795d594fSAndroid Build Coastguard Worker }
29*795d594fSAndroid Build Coastguard Worker 
30*795d594fSAndroid Build Coastguard Worker class TestClass {
31*795d594fSAndroid Build Coastguard Worker   static {
32*795d594fSAndroid Build Coastguard Worker     sTestClassObj = new TestClass(-1, -2);
33*795d594fSAndroid Build Coastguard Worker   }
TestClass()34*795d594fSAndroid Build Coastguard Worker   TestClass() {
35*795d594fSAndroid Build Coastguard Worker   }
TestClass(int i, int j)36*795d594fSAndroid Build Coastguard Worker   TestClass(int i, int j) {
37*795d594fSAndroid Build Coastguard Worker     this.i = i;
38*795d594fSAndroid Build Coastguard Worker     this.j = j;
39*795d594fSAndroid Build Coastguard Worker   }
40*795d594fSAndroid Build Coastguard Worker   int i;
41*795d594fSAndroid Build Coastguard Worker   int j;
42*795d594fSAndroid Build Coastguard Worker   volatile int k;
43*795d594fSAndroid Build Coastguard Worker   TestClass next;
44*795d594fSAndroid Build Coastguard Worker   String str;
45*795d594fSAndroid Build Coastguard Worker   byte b;
46*795d594fSAndroid Build Coastguard Worker   static int si;
47*795d594fSAndroid Build Coastguard Worker   static TestClass sTestClassObj;
48*795d594fSAndroid Build Coastguard Worker }
49*795d594fSAndroid Build Coastguard Worker 
50*795d594fSAndroid Build Coastguard Worker class SubTestClass extends TestClass {
51*795d594fSAndroid Build Coastguard Worker   int k;
52*795d594fSAndroid Build Coastguard Worker }
53*795d594fSAndroid Build Coastguard Worker 
54*795d594fSAndroid Build Coastguard Worker class TestClass2 {
55*795d594fSAndroid Build Coastguard Worker   int i;
56*795d594fSAndroid Build Coastguard Worker   int j;
57*795d594fSAndroid Build Coastguard Worker   int k;
58*795d594fSAndroid Build Coastguard Worker   int l;
59*795d594fSAndroid Build Coastguard Worker   int m;
60*795d594fSAndroid Build Coastguard Worker }
61*795d594fSAndroid Build Coastguard Worker 
62*795d594fSAndroid Build Coastguard Worker class TestClass3 {
63*795d594fSAndroid Build Coastguard Worker   float floatField = 8.0f;
64*795d594fSAndroid Build Coastguard Worker   boolean test1 = true;
65*795d594fSAndroid Build Coastguard Worker }
66*795d594fSAndroid Build Coastguard Worker 
67*795d594fSAndroid Build Coastguard Worker // Chosen to have different values with (x + 1) * 10 and (x - 1) * 10. This
68*795d594fSAndroid Build Coastguard Worker // means we can easily make sure that different code is in fact executed on
69*795d594fSAndroid Build Coastguard Worker // escape and non-escape paths.
70*795d594fSAndroid Build Coastguard Worker // Negative so that high-bits will be set for all the 64-bit values allowing us
71*795d594fSAndroid Build Coastguard Worker // to easily check for truncation.
72*795d594fSAndroid Build Coastguard Worker class TestClass4 {
73*795d594fSAndroid Build Coastguard Worker   float floatField = -3.0f;
74*795d594fSAndroid Build Coastguard Worker   double doubleField = -3.0d;
75*795d594fSAndroid Build Coastguard Worker   short shortField = -3;
76*795d594fSAndroid Build Coastguard Worker   int intField = -3;
77*795d594fSAndroid Build Coastguard Worker   byte byteField = -3;
78*795d594fSAndroid Build Coastguard Worker   long longField = -3l;
79*795d594fSAndroid Build Coastguard Worker }
80*795d594fSAndroid Build Coastguard Worker 
81*795d594fSAndroid Build Coastguard Worker class Finalizable {
82*795d594fSAndroid Build Coastguard Worker   static boolean sVisited = false;
83*795d594fSAndroid Build Coastguard Worker   static final int VALUE1 = 0xbeef;
84*795d594fSAndroid Build Coastguard Worker   static final int VALUE2 = 0xcafe;
85*795d594fSAndroid Build Coastguard Worker   int i;
86*795d594fSAndroid Build Coastguard Worker 
finalize()87*795d594fSAndroid Build Coastguard Worker   protected void finalize() {
88*795d594fSAndroid Build Coastguard Worker     if (i != VALUE1) {
89*795d594fSAndroid Build Coastguard Worker       System.out.println("Where is the beef?");
90*795d594fSAndroid Build Coastguard Worker     }
91*795d594fSAndroid Build Coastguard Worker     sVisited = true;
92*795d594fSAndroid Build Coastguard Worker   }
93*795d594fSAndroid Build Coastguard Worker }
94*795d594fSAndroid Build Coastguard Worker 
95*795d594fSAndroid Build Coastguard Worker interface Filter {
isValid(int i)96*795d594fSAndroid Build Coastguard Worker   public boolean isValid(int i);
97*795d594fSAndroid Build Coastguard Worker }
98*795d594fSAndroid Build Coastguard Worker 
99*795d594fSAndroid Build Coastguard Worker public class Main {
$noinline$Escape4(TestClass4 o)100*795d594fSAndroid Build Coastguard Worker   static void $noinline$Escape4(TestClass4 o) {
101*795d594fSAndroid Build Coastguard Worker     o.floatField += 1.0f;
102*795d594fSAndroid Build Coastguard Worker     o.doubleField += 1.0d;
103*795d594fSAndroid Build Coastguard Worker     o.byteField += 1;
104*795d594fSAndroid Build Coastguard Worker     o.shortField += 1;
105*795d594fSAndroid Build Coastguard Worker     o.intField += 1;
106*795d594fSAndroid Build Coastguard Worker     o.longField += 1;
107*795d594fSAndroid Build Coastguard Worker   }
108*795d594fSAndroid Build Coastguard Worker 
109*795d594fSAndroid Build Coastguard Worker   static Object ESCAPE = null;
$noinline$Escape(TestClass o)110*795d594fSAndroid Build Coastguard Worker   static void $noinline$Escape(TestClass o) {
111*795d594fSAndroid Build Coastguard Worker     if (o == null) {
112*795d594fSAndroid Build Coastguard Worker       return;
113*795d594fSAndroid Build Coastguard Worker     }
114*795d594fSAndroid Build Coastguard Worker     ESCAPE = o;
115*795d594fSAndroid Build Coastguard Worker     o.next.i++;
116*795d594fSAndroid Build Coastguard Worker   }
117*795d594fSAndroid Build Coastguard Worker 
118*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.calcCircleArea(double) load_store_elimination (before)
119*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
120*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
121*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
122*795d594fSAndroid Build Coastguard Worker 
123*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.calcCircleArea(double) load_store_elimination (after)
124*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
125*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
126*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
127*795d594fSAndroid Build Coastguard Worker 
calcCircleArea(double radius)128*795d594fSAndroid Build Coastguard Worker   static double calcCircleArea(double radius) {
129*795d594fSAndroid Build Coastguard Worker     return new Circle(radius).getArea();
130*795d594fSAndroid Build Coastguard Worker   }
131*795d594fSAndroid Build Coastguard Worker 
132*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test1(TestClass, TestClass) load_store_elimination (before)
133*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
134*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
135*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
136*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
137*795d594fSAndroid Build Coastguard Worker 
138*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test1(TestClass, TestClass) load_store_elimination (after)
139*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
140*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
141*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NullCheck
142*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
143*795d594fSAndroid Build Coastguard Worker 
144*795d594fSAndroid Build Coastguard Worker   // Different fields shouldn't alias.
test1(TestClass obj1, TestClass obj2)145*795d594fSAndroid Build Coastguard Worker   static int test1(TestClass obj1, TestClass obj2) {
146*795d594fSAndroid Build Coastguard Worker     obj1.i = 1;
147*795d594fSAndroid Build Coastguard Worker     obj2.j = 2;
148*795d594fSAndroid Build Coastguard Worker     return obj1.i + obj2.j;
149*795d594fSAndroid Build Coastguard Worker   }
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test2(TestClass) load_store_elimination (before)
152*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
153*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
154*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
155*795d594fSAndroid Build Coastguard Worker 
156*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test2(TestClass) load_store_elimination (after)
157*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
158*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NullCheck
159*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
161*795d594fSAndroid Build Coastguard Worker 
162*795d594fSAndroid Build Coastguard Worker   // Redundant store of the same value.
test2(TestClass obj)163*795d594fSAndroid Build Coastguard Worker   static int test2(TestClass obj) {
164*795d594fSAndroid Build Coastguard Worker     obj.j = 1;
165*795d594fSAndroid Build Coastguard Worker     obj.j = 1;
166*795d594fSAndroid Build Coastguard Worker     return obj.j;
167*795d594fSAndroid Build Coastguard Worker   }
168*795d594fSAndroid Build Coastguard Worker 
169*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test3(TestClass) load_store_elimination (before)
170*795d594fSAndroid Build Coastguard Worker   /// CHECK: StaticFieldGet
171*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
172*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
173*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
174*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
175*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
176*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
177*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
178*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
179*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
180*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
181*795d594fSAndroid Build Coastguard Worker 
182*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test3(TestClass) load_store_elimination (after)
183*795d594fSAndroid Build Coastguard Worker   /// CHECK: StaticFieldGet
184*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
185*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
186*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
187*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
188*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
189*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
190*795d594fSAndroid Build Coastguard Worker 
191*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test3(TestClass) load_store_elimination (after)
192*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
193*795d594fSAndroid Build Coastguard Worker 
194*795d594fSAndroid Build Coastguard Worker   // A new allocation (even non-singleton) shouldn't alias with pre-existing values.
test3(TestClass obj)195*795d594fSAndroid Build Coastguard Worker   static int test3(TestClass obj) {
196*795d594fSAndroid Build Coastguard Worker     TestClass obj1 = TestClass.sTestClassObj;
197*795d594fSAndroid Build Coastguard Worker     TestClass obj2 = new TestClass();  // Cannot alias with obj or obj1 which pre-exist.
198*795d594fSAndroid Build Coastguard Worker     obj.next = obj2;  // Make obj2 a non-singleton.
199*795d594fSAndroid Build Coastguard Worker     // All stores below need to stay since obj/obj1/obj2 are not singletons.
200*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
201*795d594fSAndroid Build Coastguard Worker     obj1.j = 2;
202*795d594fSAndroid Build Coastguard Worker     // Following stores won't kill values of obj.i and obj1.j.
203*795d594fSAndroid Build Coastguard Worker     obj2.i = 3;
204*795d594fSAndroid Build Coastguard Worker     obj2.j = 4;
205*795d594fSAndroid Build Coastguard Worker     return obj.i + obj1.j + obj2.i + obj2.j;
206*795d594fSAndroid Build Coastguard Worker   }
207*795d594fSAndroid Build Coastguard Worker 
208*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test4(TestClass, boolean) load_store_elimination (before)
209*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
210*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
211*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
212*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Return
213*795d594fSAndroid Build Coastguard Worker 
214*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test4(TestClass, boolean) load_store_elimination (after)
215*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
216*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
217*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Return
218*795d594fSAndroid Build Coastguard Worker 
219*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test4(TestClass, boolean) load_store_elimination (after)
220*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
221*795d594fSAndroid Build Coastguard Worker 
222*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test4(TestClass, boolean) load_store_elimination (after)
223*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
224*795d594fSAndroid Build Coastguard Worker 
225*795d594fSAndroid Build Coastguard Worker   // Set and merge the same value in two branches.
test4(TestClass obj, boolean b)226*795d594fSAndroid Build Coastguard Worker   static int test4(TestClass obj, boolean b) {
227*795d594fSAndroid Build Coastguard Worker     if (b) {
228*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
229*795d594fSAndroid Build Coastguard Worker     } else {
230*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
231*795d594fSAndroid Build Coastguard Worker     }
232*795d594fSAndroid Build Coastguard Worker     return obj.i;
233*795d594fSAndroid Build Coastguard Worker   }
234*795d594fSAndroid Build Coastguard Worker 
235*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test5(TestClass, boolean) load_store_elimination (before)
236*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int1:i\d+>>      IntConstant 1
237*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int2:i\d+>>      IntConstant 2
238*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Obj:l\d+>>       ParameterValue
239*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [{{l\d+}},<<Int1>>]
240*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [{{l\d+}},<<Int2>>]
241*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<GetField:i\d+>>  InstanceFieldGet [{{l\d+}}]
242*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Return [<<GetField>>]
243*795d594fSAndroid Build Coastguard Worker 
244*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test5(TestClass, boolean) load_store_elimination (after)
245*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int1:i\d+>>      IntConstant 1
246*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int2:i\d+>>      IntConstant 2
247*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Obj:l\d+>>       ParameterValue
248*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [{{l\d+}},<<Int1>>]
249*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [{{l\d+}},<<Int2>>]
250*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Phi:i\d+>>       Phi [<<Arg1:i\d+>>,<<Arg2:i\d+>>]
251*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Return [<<Phi>>]
252*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: set(["<<Arg1>>","<<Arg2>>"]) == set(["<<Int1>>","<<Int2>>"])
253*795d594fSAndroid Build Coastguard Worker 
254*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test5(TestClass, boolean) load_store_elimination (after)
255*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
256*795d594fSAndroid Build Coastguard Worker 
257*795d594fSAndroid Build Coastguard Worker   // Set and merge different values in two branches.
test5(TestClass obj, boolean b)258*795d594fSAndroid Build Coastguard Worker   static int test5(TestClass obj, boolean b) {
259*795d594fSAndroid Build Coastguard Worker     if (b) {
260*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
261*795d594fSAndroid Build Coastguard Worker     } else {
262*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
263*795d594fSAndroid Build Coastguard Worker     }
264*795d594fSAndroid Build Coastguard Worker     return obj.i;
265*795d594fSAndroid Build Coastguard Worker   }
266*795d594fSAndroid Build Coastguard Worker 
267*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test6(TestClass, TestClass, boolean) load_store_elimination (before)
268*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
269*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
270*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
271*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
272*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
273*795d594fSAndroid Build Coastguard Worker 
274*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test6(TestClass, TestClass, boolean) load_store_elimination (after)
275*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
276*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
277*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
278*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
279*795d594fSAndroid Build Coastguard Worker 
280*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test6(TestClass, TestClass, boolean) load_store_elimination (after)
281*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
282*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
283*795d594fSAndroid Build Coastguard Worker 
284*795d594fSAndroid Build Coastguard Worker   // Setting the same value doesn't clear the value for aliased locations.
test6(TestClass obj1, TestClass obj2, boolean b)285*795d594fSAndroid Build Coastguard Worker   static int test6(TestClass obj1, TestClass obj2, boolean b) {
286*795d594fSAndroid Build Coastguard Worker     obj1.i = 1;
287*795d594fSAndroid Build Coastguard Worker     obj1.j = 2;
288*795d594fSAndroid Build Coastguard Worker     if (b) {
289*795d594fSAndroid Build Coastguard Worker       obj2.j = 2;
290*795d594fSAndroid Build Coastguard Worker     }
291*795d594fSAndroid Build Coastguard Worker     return obj1.j + obj2.j;
292*795d594fSAndroid Build Coastguard Worker   }
293*795d594fSAndroid Build Coastguard Worker 
294*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test7(TestClass) load_store_elimination (before)
295*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
296*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
297*795d594fSAndroid Build Coastguard Worker 
298*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test7(TestClass) load_store_elimination (after)
299*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
300*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
301*795d594fSAndroid Build Coastguard Worker 
302*795d594fSAndroid Build Coastguard Worker   // Invocation should kill values in non-singleton heap locations.
test7(TestClass obj)303*795d594fSAndroid Build Coastguard Worker   static int test7(TestClass obj) {
304*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
305*795d594fSAndroid Build Coastguard Worker     System.out.print("");
306*795d594fSAndroid Build Coastguard Worker     return obj.i;
307*795d594fSAndroid Build Coastguard Worker   }
308*795d594fSAndroid Build Coastguard Worker 
309*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test8() load_store_elimination (before)
310*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
311*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
312*795d594fSAndroid Build Coastguard Worker   /// CHECK: InvokeVirtual
313*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
314*795d594fSAndroid Build Coastguard Worker 
315*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test8() load_store_elimination (after)
316*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
317*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
318*795d594fSAndroid Build Coastguard Worker   /// CHECK: InvokeVirtual
319*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NullCheck
320*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
321*795d594fSAndroid Build Coastguard Worker 
322*795d594fSAndroid Build Coastguard Worker   // Invocation should not kill values in singleton heap locations.
test8()323*795d594fSAndroid Build Coastguard Worker   static int test8() {
324*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
325*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
326*795d594fSAndroid Build Coastguard Worker     System.out.print("");
327*795d594fSAndroid Build Coastguard Worker     return obj.i;
328*795d594fSAndroid Build Coastguard Worker   }
329*795d594fSAndroid Build Coastguard Worker 
330*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test9(TestClass) load_store_elimination (before)
331*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
332*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
333*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
334*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
335*795d594fSAndroid Build Coastguard Worker 
336*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test9(TestClass) load_store_elimination (after)
337*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
338*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
339*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
340*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
341*795d594fSAndroid Build Coastguard Worker 
342*795d594fSAndroid Build Coastguard Worker   // Invocation should kill values in non-singleton heap locations.
test9(TestClass obj)343*795d594fSAndroid Build Coastguard Worker   static int test9(TestClass obj) {
344*795d594fSAndroid Build Coastguard Worker     TestClass obj2 = new TestClass();
345*795d594fSAndroid Build Coastguard Worker     obj2.i = 1;
346*795d594fSAndroid Build Coastguard Worker     obj.next = obj2;
347*795d594fSAndroid Build Coastguard Worker     System.out.print("");
348*795d594fSAndroid Build Coastguard Worker     return obj2.i;
349*795d594fSAndroid Build Coastguard Worker   }
350*795d594fSAndroid Build Coastguard Worker 
351*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test10(TestClass) load_store_elimination (before)
352*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: StaticFieldGet
353*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
354*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: StaticFieldSet
355*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
356*795d594fSAndroid Build Coastguard Worker 
357*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test10(TestClass) load_store_elimination (after)
358*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: StaticFieldGet
359*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
360*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: StaticFieldSet
361*795d594fSAndroid Build Coastguard Worker 
362*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test10(TestClass) load_store_elimination (after)
363*795d594fSAndroid Build Coastguard Worker   /// CHECK:     NullCheck
364*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NullCheck
365*795d594fSAndroid Build Coastguard Worker 
366*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test10(TestClass) load_store_elimination (after)
367*795d594fSAndroid Build Coastguard Worker   /// CHECK:     InstanceFieldGet
368*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
369*795d594fSAndroid Build Coastguard Worker 
370*795d594fSAndroid Build Coastguard Worker   // Static fields shouldn't alias with instance fields.
test10(TestClass obj)371*795d594fSAndroid Build Coastguard Worker   static int test10(TestClass obj) {
372*795d594fSAndroid Build Coastguard Worker     TestClass.si += obj.i;
373*795d594fSAndroid Build Coastguard Worker     return obj.i;
374*795d594fSAndroid Build Coastguard Worker   }
375*795d594fSAndroid Build Coastguard Worker 
376*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test11(TestClass) load_store_elimination (before)
377*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
378*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
379*795d594fSAndroid Build Coastguard Worker 
380*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test11(TestClass) load_store_elimination (after)
381*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
382*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NullCheck
383*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
384*795d594fSAndroid Build Coastguard Worker 
385*795d594fSAndroid Build Coastguard Worker   // Loop without heap writes.
test11(TestClass obj)386*795d594fSAndroid Build Coastguard Worker   static int test11(TestClass obj) {
387*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
388*795d594fSAndroid Build Coastguard Worker     int sum = 0;
389*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
390*795d594fSAndroid Build Coastguard Worker       sum += obj.i;
391*795d594fSAndroid Build Coastguard Worker     }
392*795d594fSAndroid Build Coastguard Worker     return sum;
393*795d594fSAndroid Build Coastguard Worker   }
394*795d594fSAndroid Build Coastguard Worker 
395*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test12(TestClass, TestClass) load_store_elimination (before)
396*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
397*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
398*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
399*795d594fSAndroid Build Coastguard Worker 
400*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test12(TestClass, TestClass) load_store_elimination (after)
401*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
402*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
403*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
404*795d594fSAndroid Build Coastguard Worker 
405*795d594fSAndroid Build Coastguard Worker   // Loop with heap writes.
test12(TestClass obj1, TestClass obj2)406*795d594fSAndroid Build Coastguard Worker   static int test12(TestClass obj1, TestClass obj2) {
407*795d594fSAndroid Build Coastguard Worker     obj1.i = 1;
408*795d594fSAndroid Build Coastguard Worker     int sum = 0;
409*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; i++) {
410*795d594fSAndroid Build Coastguard Worker       sum += obj1.i;
411*795d594fSAndroid Build Coastguard Worker       obj2.i = sum;
412*795d594fSAndroid Build Coastguard Worker     }
413*795d594fSAndroid Build Coastguard Worker     return sum;
414*795d594fSAndroid Build Coastguard Worker   }
415*795d594fSAndroid Build Coastguard Worker 
416*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test13(TestClass, TestClass2) load_store_elimination (before)
417*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
418*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
419*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
420*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
421*795d594fSAndroid Build Coastguard Worker 
422*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test13(TestClass, TestClass2) load_store_elimination (after)
423*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
424*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
425*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NullCheck
426*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
427*795d594fSAndroid Build Coastguard Worker 
428*795d594fSAndroid Build Coastguard Worker   // Different classes shouldn't alias.
test13(TestClass obj1, TestClass2 obj2)429*795d594fSAndroid Build Coastguard Worker   static int test13(TestClass obj1, TestClass2 obj2) {
430*795d594fSAndroid Build Coastguard Worker     obj1.i = 1;
431*795d594fSAndroid Build Coastguard Worker     obj2.i = 2;
432*795d594fSAndroid Build Coastguard Worker     return obj1.i + obj2.i;
433*795d594fSAndroid Build Coastguard Worker   }
434*795d594fSAndroid Build Coastguard Worker 
435*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test14(TestClass, SubTestClass) load_store_elimination (before)
436*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
437*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
438*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
439*795d594fSAndroid Build Coastguard Worker 
440*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test14(TestClass, SubTestClass) load_store_elimination (after)
441*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
442*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
443*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
444*795d594fSAndroid Build Coastguard Worker 
445*795d594fSAndroid Build Coastguard Worker   // Subclass may alias with super class.
test14(TestClass obj1, SubTestClass obj2)446*795d594fSAndroid Build Coastguard Worker   static int test14(TestClass obj1, SubTestClass obj2) {
447*795d594fSAndroid Build Coastguard Worker     obj1.i = 1;
448*795d594fSAndroid Build Coastguard Worker     obj2.i = 2;
449*795d594fSAndroid Build Coastguard Worker     return obj1.i;
450*795d594fSAndroid Build Coastguard Worker   }
451*795d594fSAndroid Build Coastguard Worker 
452*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test15() load_store_elimination (before)
453*795d594fSAndroid Build Coastguard Worker   /// CHECK: StaticFieldSet
454*795d594fSAndroid Build Coastguard Worker   /// CHECK: StaticFieldSet
455*795d594fSAndroid Build Coastguard Worker   /// CHECK: StaticFieldGet
456*795d594fSAndroid Build Coastguard Worker 
457*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test15() load_store_elimination (after)
458*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Const2:i\d+>> IntConstant 2
459*795d594fSAndroid Build Coastguard Worker   /// CHECK: StaticFieldSet
460*795d594fSAndroid Build Coastguard Worker   /// CHECK: Return [<<Const2>>]
461*795d594fSAndroid Build Coastguard Worker 
462*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test15() load_store_elimination (after)
463*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: StaticFieldGet
464*795d594fSAndroid Build Coastguard Worker 
465*795d594fSAndroid Build Coastguard Worker   // Static field access from subclass's name.
test15()466*795d594fSAndroid Build Coastguard Worker   static int test15() {
467*795d594fSAndroid Build Coastguard Worker     TestClass.si = 1;
468*795d594fSAndroid Build Coastguard Worker     SubTestClass.si = 2;
469*795d594fSAndroid Build Coastguard Worker     return TestClass.si;
470*795d594fSAndroid Build Coastguard Worker   }
471*795d594fSAndroid Build Coastguard Worker 
472*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test16() load_store_elimination (before)
473*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
474*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
475*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
476*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
477*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
478*795d594fSAndroid Build Coastguard Worker 
479*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test16() load_store_elimination (after)
480*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
481*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
482*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
483*795d594fSAndroid Build Coastguard Worker 
484*795d594fSAndroid Build Coastguard Worker   // Test inlined constructor.
test16()485*795d594fSAndroid Build Coastguard Worker   static int test16() {
486*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass(1, 2);
487*795d594fSAndroid Build Coastguard Worker     return obj.i + obj.j;
488*795d594fSAndroid Build Coastguard Worker   }
489*795d594fSAndroid Build Coastguard Worker 
490*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test17() load_store_elimination (before)
491*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
492*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
493*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
494*795d594fSAndroid Build Coastguard Worker 
495*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test17() load_store_elimination (after)
496*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<Const0:i\d+>> IntConstant 0
497*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
498*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
499*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
500*795d594fSAndroid Build Coastguard Worker   /// CHECK: Return [<<Const0>>]
501*795d594fSAndroid Build Coastguard Worker 
502*795d594fSAndroid Build Coastguard Worker   // Test getting default value.
test17()503*795d594fSAndroid Build Coastguard Worker   static int test17() {
504*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
505*795d594fSAndroid Build Coastguard Worker     obj.j = 1;
506*795d594fSAndroid Build Coastguard Worker     return obj.i;
507*795d594fSAndroid Build Coastguard Worker   }
508*795d594fSAndroid Build Coastguard Worker 
509*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test18(TestClass) load_store_elimination (before)
510*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
511*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
512*795d594fSAndroid Build Coastguard Worker 
513*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test18(TestClass) load_store_elimination (after)
514*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
515*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
516*795d594fSAndroid Build Coastguard Worker 
517*795d594fSAndroid Build Coastguard Worker   // Volatile field load/store shouldn't be eliminated.
test18(TestClass obj)518*795d594fSAndroid Build Coastguard Worker   static int test18(TestClass obj) {
519*795d594fSAndroid Build Coastguard Worker     obj.k = 1;
520*795d594fSAndroid Build Coastguard Worker     return obj.k;
521*795d594fSAndroid Build Coastguard Worker   }
522*795d594fSAndroid Build Coastguard Worker 
523*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.test19(float[], float[]) load_store_elimination (before)
524*795d594fSAndroid Build Coastguard Worker   /// CHECK:     {{f\d+}} ArrayGet
525*795d594fSAndroid Build Coastguard Worker   /// CHECK:     {{f\d+}} ArrayGet
526*795d594fSAndroid Build Coastguard Worker 
527*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.test19(float[], float[]) load_store_elimination (after)
528*795d594fSAndroid Build Coastguard Worker   /// CHECK:     {{f\d+}} ArrayGet
529*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: {{f\d+}} ArrayGet
530*795d594fSAndroid Build Coastguard Worker 
531*795d594fSAndroid Build Coastguard Worker   // I/F, J/D aliasing should not happen any more and LSE should eliminate the load.
test19(float[] fa1, float[] fa2)532*795d594fSAndroid Build Coastguard Worker   static float test19(float[] fa1, float[] fa2) {
533*795d594fSAndroid Build Coastguard Worker     fa1[0] = fa2[0];
534*795d594fSAndroid Build Coastguard Worker     return fa1[0];
535*795d594fSAndroid Build Coastguard Worker   }
536*795d594fSAndroid Build Coastguard Worker 
537*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: TestClass Main.test20() load_store_elimination (before)
538*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
539*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
540*795d594fSAndroid Build Coastguard Worker 
541*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: TestClass Main.test20() load_store_elimination (after)
542*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
543*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
544*795d594fSAndroid Build Coastguard Worker 
545*795d594fSAndroid Build Coastguard Worker   // Storing default heap value is redundant if the heap location has the
546*795d594fSAndroid Build Coastguard Worker   // default heap value.
test20()547*795d594fSAndroid Build Coastguard Worker   static TestClass test20() {
548*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
549*795d594fSAndroid Build Coastguard Worker     obj.i = 0;
550*795d594fSAndroid Build Coastguard Worker     return obj;
551*795d594fSAndroid Build Coastguard Worker   }
552*795d594fSAndroid Build Coastguard Worker 
553*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.test21(TestClass) load_store_elimination (before)
554*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: NewInstance
555*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
556*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
557*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
558*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
559*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
560*795d594fSAndroid Build Coastguard Worker 
561*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.test21(TestClass) load_store_elimination (after)
562*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
563*795d594fSAndroid Build Coastguard Worker 
564*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.test21(TestClass) load_store_elimination (after)
565*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
566*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
567*795d594fSAndroid Build Coastguard Worker 
568*795d594fSAndroid Build Coastguard Worker   // Loop side effects can kill heap values, stores need to be kept in that case.
test21(TestClass obj0)569*795d594fSAndroid Build Coastguard Worker   static void test21(TestClass obj0) {
570*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
571*795d594fSAndroid Build Coastguard Worker     obj0.str = "abc";
572*795d594fSAndroid Build Coastguard Worker     obj.str = "abc";
573*795d594fSAndroid Build Coastguard Worker     // Note: This loop is transformed by the loop optimization pass, therefore we
574*795d594fSAndroid Build Coastguard Worker     // are not checking the exact number of InstanceFieldSet and Phi instructions.
575*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 2; i++) {
576*795d594fSAndroid Build Coastguard Worker       // Generate some loop side effect that writes into obj.
577*795d594fSAndroid Build Coastguard Worker       obj.str = "def";
578*795d594fSAndroid Build Coastguard Worker     }
579*795d594fSAndroid Build Coastguard Worker     $noinline$printSubstrings00(obj0.str, obj.str);
580*795d594fSAndroid Build Coastguard Worker   }
581*795d594fSAndroid Build Coastguard Worker 
$noinline$printSubstrings00(String str1, String str2)582*795d594fSAndroid Build Coastguard Worker   static void $noinline$printSubstrings00(String str1, String str2) {
583*795d594fSAndroid Build Coastguard Worker     System.out.print(str1.substring(0, 0) + str2.substring(0, 0));
584*795d594fSAndroid Build Coastguard Worker   }
585*795d594fSAndroid Build Coastguard Worker 
586*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test22() load_store_elimination (before)
587*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
588*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
589*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
590*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
591*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
592*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
593*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
594*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
595*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
596*795d594fSAndroid Build Coastguard Worker 
597*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test22() load_store_elimination (after)
598*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
599*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
600*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
601*795d594fSAndroid Build Coastguard Worker 
602*795d594fSAndroid Build Coastguard Worker   // For a singleton, loop side effects can kill its field values only if:
603*795d594fSAndroid Build Coastguard Worker   // (1) it dominiates the loop header, and
604*795d594fSAndroid Build Coastguard Worker   // (2) its fields are stored into inside a loop.
test22()605*795d594fSAndroid Build Coastguard Worker   static int test22() {
606*795d594fSAndroid Build Coastguard Worker     int sum = 0;
607*795d594fSAndroid Build Coastguard Worker     TestClass obj1 = new TestClass();
608*795d594fSAndroid Build Coastguard Worker     obj1.i = 2;    // This store can be eliminated since obj1 is never stored into inside a loop.
609*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 2; i++) {
610*795d594fSAndroid Build Coastguard Worker       TestClass obj2 = new TestClass();
611*795d594fSAndroid Build Coastguard Worker       obj2.i = 3;  // This store can be eliminated since the singleton is inside the loop.
612*795d594fSAndroid Build Coastguard Worker       sum += obj2.i;
613*795d594fSAndroid Build Coastguard Worker     }
614*795d594fSAndroid Build Coastguard Worker     TestClass obj3 = new TestClass();
615*795d594fSAndroid Build Coastguard Worker     obj3.i = 5;    // This store can be eliminated since the singleton is created after the loop.
616*795d594fSAndroid Build Coastguard Worker     sum += obj1.i + obj3.i;
617*795d594fSAndroid Build Coastguard Worker     return sum;
618*795d594fSAndroid Build Coastguard Worker   }
619*795d594fSAndroid Build Coastguard Worker 
620*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test23(boolean) load_store_elimination (before)
621*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int1:i\d+>>      IntConstant 1
622*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int2:i\d+>>      IntConstant 2
623*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int3:i\d+>>      IntConstant 3
624*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Obj:l\d+>>       NewInstance
625*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [<<Obj>>,<<Int3>>]
626*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Add1:i\d+>>      Add [<<Get1:i\d+>>,<<Int1>>]
627*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Get1>>           InstanceFieldGet [<<Obj>>]
628*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [<<Obj>>,<<Add1>>]
629*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Add2:i\d+>>      Add [<<Get2:i\d+>>,<<Int2>>]
630*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Get2>>           InstanceFieldGet [<<Obj>>]
631*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [<<Obj>>,<<Add2>>]
632*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Return [<<Get3:i\d+>>]
633*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Get3>>           InstanceFieldGet [<<Obj>>]
634*795d594fSAndroid Build Coastguard Worker 
635*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test23(boolean) load_store_elimination (after)
636*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int1:i\d+>>      IntConstant 1
637*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int2:i\d+>>      IntConstant 2
638*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int3:i\d+>>      IntConstant 3
639*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Add1:i\d+>>      Add [<<Int3>>,<<Int1>>]
640*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Add2:i\d+>>      Add [<<Int3>>,<<Int2>>]
641*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Phi:i\d+>>       Phi [<<Arg1:i\d+>>,<<Arg2:i\d+>>]
642*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Return [<<Phi>>]
643*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: set(["<<Arg1>>","<<Arg2>>"]) == set(["<<Add1>>","<<Add2>>"])
644*795d594fSAndroid Build Coastguard Worker 
645*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test23(boolean) load_store_elimination (after)
646*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
647*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
648*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
649*795d594fSAndroid Build Coastguard Worker 
650*795d594fSAndroid Build Coastguard Worker   // Test heap value merging from multiple branches.
test23(boolean b)651*795d594fSAndroid Build Coastguard Worker   static int test23(boolean b) {
652*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
653*795d594fSAndroid Build Coastguard Worker     obj.i = 3;      // This store can be eliminated since the value flows into each branch.
654*795d594fSAndroid Build Coastguard Worker     if (b) {
655*795d594fSAndroid Build Coastguard Worker       obj.i += 1;   // This store can be eliminated after replacing the load below with a Phi.
656*795d594fSAndroid Build Coastguard Worker     } else {
657*795d594fSAndroid Build Coastguard Worker       obj.i += 2;   // This store can be eliminated after replacing the load below with a Phi.
658*795d594fSAndroid Build Coastguard Worker     }
659*795d594fSAndroid Build Coastguard Worker     return obj.i;   // This load is eliminated by creating a Phi.
660*795d594fSAndroid Build Coastguard Worker   }
661*795d594fSAndroid Build Coastguard Worker 
662*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.test24() load_store_elimination (before)
663*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<True:i\d+>>     IntConstant 1
664*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float8:f\d+>>   FloatConstant 8
665*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float42:f\d+>>  FloatConstant 42
666*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Obj:l\d+>>      NewInstance
667*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<True>>]
668*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Float8>>]
669*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<GetTest:z\d+>>  InstanceFieldGet [<<Obj>>]
670*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<GetField:f\d+>> InstanceFieldGet [<<Obj>>]
671*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Select:f\d+>>   Select [<<Float42>>,<<GetField>>,<<GetTest>>]
672*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       Return [<<Select>>]
673*795d594fSAndroid Build Coastguard Worker 
674*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.test24() load_store_elimination (after)
675*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<True:i\d+>>     IntConstant 1
676*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float8:f\d+>>   FloatConstant 8
677*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float42:f\d+>>  FloatConstant 42
678*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Select:f\d+>>   Select [<<Float42>>,<<Float8>>,<<True>>]
679*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       Return [<<Select>>]
680*795d594fSAndroid Build Coastguard Worker 
681*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.test24() load_store_elimination (after)
682*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       NewInstance
683*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       InstanceFieldGet
test24()684*795d594fSAndroid Build Coastguard Worker   static float test24() {
685*795d594fSAndroid Build Coastguard Worker     float a = 42.0f;
686*795d594fSAndroid Build Coastguard Worker     TestClass3 obj = new TestClass3();
687*795d594fSAndroid Build Coastguard Worker     if (obj.test1) {
688*795d594fSAndroid Build Coastguard Worker       a = obj.floatField;
689*795d594fSAndroid Build Coastguard Worker     }
690*795d594fSAndroid Build Coastguard Worker     return a;
691*795d594fSAndroid Build Coastguard Worker   }
692*795d594fSAndroid Build Coastguard Worker 
693*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test25(boolean, boolean, boolean) load_store_elimination (before)
694*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Int1:i\d+>>     IntConstant 1
695*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Int2:i\d+>>     IntConstant 2
696*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Int3:i\d+>>     IntConstant 3
697*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Int5:i\d+>>     IntConstant 5
698*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Int6:i\d+>>     IntConstant 6
699*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Obj:l\d+>>      NewInstance
700*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Int1>>]
701*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Int2>>]
702*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Int3>>]
703*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Int5>>]
704*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Int6>>]
705*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<GetField:i\d+>> InstanceFieldGet [<<Obj>>]
706*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       Return [<<GetField>>]
707*795d594fSAndroid Build Coastguard Worker 
708*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test25(boolean, boolean, boolean) load_store_elimination (after)
709*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Int1:i\d+>>     IntConstant 1
710*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Int2:i\d+>>     IntConstant 2
711*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Int3:i\d+>>     IntConstant 3
712*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Int5:i\d+>>     IntConstant 5
713*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Int6:i\d+>>     IntConstant 6
714*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Phi:i\d+>>      Phi [<<Arg1:i\d+>>,<<Arg2:i\d+>>,<<Arg3:i\d+>>,<<Arg4:i\d+>>,<<Arg5:i\d+>>]
715*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       Return [<<Phi>>]
716*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: set(["<<Arg1>>","<<Arg2>>","<<Arg3>>","<<Arg4>>","<<Arg5>>"]) == set(["<<Int1>>","<<Int2>>","<<Int3>>","<<Int5>>","<<Int6>>"])
717*795d594fSAndroid Build Coastguard Worker 
718*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test25(boolean, boolean, boolean) load_store_elimination (after)
719*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       NewInstance
720*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       InstanceFieldSet
721*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       InstanceFieldGet
722*795d594fSAndroid Build Coastguard Worker 
723*795d594fSAndroid Build Coastguard Worker   // Test heap value merging from nested branches.
test25(boolean b, boolean c, boolean d)724*795d594fSAndroid Build Coastguard Worker   static int test25(boolean b, boolean c, boolean d) {
725*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
726*795d594fSAndroid Build Coastguard Worker     if (b) {
727*795d594fSAndroid Build Coastguard Worker       if (c) {
728*795d594fSAndroid Build Coastguard Worker         obj.i = 1;
729*795d594fSAndroid Build Coastguard Worker       } else {
730*795d594fSAndroid Build Coastguard Worker         if (d) {
731*795d594fSAndroid Build Coastguard Worker           obj.i = 2;
732*795d594fSAndroid Build Coastguard Worker         } else {
733*795d594fSAndroid Build Coastguard Worker           obj.i = 3;
734*795d594fSAndroid Build Coastguard Worker         }
735*795d594fSAndroid Build Coastguard Worker       }
736*795d594fSAndroid Build Coastguard Worker     } else {
737*795d594fSAndroid Build Coastguard Worker       if (c) {
738*795d594fSAndroid Build Coastguard Worker         obj.i = 5;
739*795d594fSAndroid Build Coastguard Worker       } else {
740*795d594fSAndroid Build Coastguard Worker         obj.i = 6;
741*795d594fSAndroid Build Coastguard Worker       }
742*795d594fSAndroid Build Coastguard Worker     }
743*795d594fSAndroid Build Coastguard Worker     return obj.i;
744*795d594fSAndroid Build Coastguard Worker   }
745*795d594fSAndroid Build Coastguard Worker 
746*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.test26(int) load_store_elimination (before)
747*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float0:f\d+>>   FloatConstant 0
748*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float1:f\d+>>   FloatConstant 1
749*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float2:f\d+>>   FloatConstant 2
750*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float3:f\d+>>   FloatConstant 3
751*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float8:f\d+>>   FloatConstant 8
752*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Obj:l\d+>>      NewInstance
753*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Float8>>]
754*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Float0>>]
755*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Float1>>]
756*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Float2>>]
757*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Float3>>]
758*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<GetField:f\d+>> InstanceFieldGet [<<Obj>>]
759*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       Return [<<GetField>>]
760*795d594fSAndroid Build Coastguard Worker 
761*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.test26(int) load_store_elimination (after)
762*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float0:f\d+>>   FloatConstant 0
763*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float1:f\d+>>   FloatConstant 1
764*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float2:f\d+>>   FloatConstant 2
765*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float3:f\d+>>   FloatConstant 3
766*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float8:f\d+>>   FloatConstant 8
767*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Phi:f\d+>>      Phi [<<Arg1:f\d+>>,<<Arg2:f\d+>>,<<Arg3:f\d+>>,<<Arg4:f\d+>>]
768*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       Return [<<Phi>>]
769*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: set(["<<Arg1>>","<<Arg2>>","<<Arg3>>","<<Arg4>>"]) == set(["<<Float0>>","<<Float1>>","<<Float2>>","<<Float3>>"])
770*795d594fSAndroid Build Coastguard Worker 
771*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.test26(int) load_store_elimination (after)
772*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       NewInstance
773*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       InstanceFieldSet
774*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       InstanceFieldGet
775*795d594fSAndroid Build Coastguard Worker 
776*795d594fSAndroid Build Coastguard Worker   // Test heap value merging from switch statement.
test26(int b)777*795d594fSAndroid Build Coastguard Worker   static float test26(int b) {
778*795d594fSAndroid Build Coastguard Worker     TestClass3 obj = new TestClass3();
779*795d594fSAndroid Build Coastguard Worker     switch (b) {
780*795d594fSAndroid Build Coastguard Worker       case 1:
781*795d594fSAndroid Build Coastguard Worker         obj.floatField = 3.0f;
782*795d594fSAndroid Build Coastguard Worker         break;
783*795d594fSAndroid Build Coastguard Worker       case 2:
784*795d594fSAndroid Build Coastguard Worker         obj.floatField = 2.0f;
785*795d594fSAndroid Build Coastguard Worker         break;
786*795d594fSAndroid Build Coastguard Worker       case 3:
787*795d594fSAndroid Build Coastguard Worker         obj.floatField = 1.0f;
788*795d594fSAndroid Build Coastguard Worker         break;
789*795d594fSAndroid Build Coastguard Worker       default:
790*795d594fSAndroid Build Coastguard Worker         obj.floatField = 0.0f;
791*795d594fSAndroid Build Coastguard Worker         break;
792*795d594fSAndroid Build Coastguard Worker     }
793*795d594fSAndroid Build Coastguard Worker     return obj.floatField;
794*795d594fSAndroid Build Coastguard Worker   }
795*795d594fSAndroid Build Coastguard Worker 
796*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test27(boolean, boolean) load_store_elimination (before)
797*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Int1:i\d+>>      IntConstant 1
798*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Obj:l\d+>>       NewInstance
799*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      InstanceFieldSet [<<Obj>>,<<Int1>>]
800*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      InstanceFieldSet [<<Obj>>,<<Int1>>]
801*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      InstanceFieldSet [<<Obj>>,<<Int1>>]
802*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      InstanceFieldSet [<<Obj>>,<<Int1>>]
803*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<GetField:i\d+>>  InstanceFieldGet [<<Obj>>]
804*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<GetField>>]
805*795d594fSAndroid Build Coastguard Worker 
806*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test27(boolean, boolean) load_store_elimination (after)
807*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Int1:i\d+>>      IntConstant 1
808*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Int1>>]
809*795d594fSAndroid Build Coastguard Worker 
810*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test27(boolean, boolean) load_store_elimination (after)
811*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      NewInstance
812*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InstanceFieldSet
813*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      InstanceFieldGet
814*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Phi
815*795d594fSAndroid Build Coastguard Worker 
816*795d594fSAndroid Build Coastguard Worker   // Test merging same value from nested branches.
test27(boolean b, boolean c)817*795d594fSAndroid Build Coastguard Worker   static int test27(boolean b, boolean c) {
818*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
819*795d594fSAndroid Build Coastguard Worker     if (b) {
820*795d594fSAndroid Build Coastguard Worker       if (c) {
821*795d594fSAndroid Build Coastguard Worker         obj.i = 1;
822*795d594fSAndroid Build Coastguard Worker       } else {
823*795d594fSAndroid Build Coastguard Worker         obj.i = 1;
824*795d594fSAndroid Build Coastguard Worker       }
825*795d594fSAndroid Build Coastguard Worker     } else {
826*795d594fSAndroid Build Coastguard Worker       if (c) {
827*795d594fSAndroid Build Coastguard Worker         obj.i = 1;
828*795d594fSAndroid Build Coastguard Worker       } else {
829*795d594fSAndroid Build Coastguard Worker         obj.i = 1;
830*795d594fSAndroid Build Coastguard Worker       }
831*795d594fSAndroid Build Coastguard Worker     }
832*795d594fSAndroid Build Coastguard Worker     return obj.i;
833*795d594fSAndroid Build Coastguard Worker   }
834*795d594fSAndroid Build Coastguard Worker 
835*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test28(boolean, boolean) load_store_elimination (before)
836*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Int0:i\d+>>      IntConstant 0
837*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Int5:i\d+>>      IntConstant 5
838*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Int6:i\d+>>      IntConstant 6
839*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Array:l\d+>>     NewArray
840*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ArraySet [<<Array>>,<<Int0>>,<<Int5>>]
841*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ArraySet [<<Array>>,<<Int0>>,<<Int6>>]
842*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<GetIndex:i\d+>>  ArrayGet [<<Array>>,<<Int0>>]
843*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<GetIndex>>]
844*795d594fSAndroid Build Coastguard Worker 
845*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test28(boolean, boolean) load_store_elimination (after)
846*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Int0:i\d+>>      IntConstant 0
847*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Int5:i\d+>>      IntConstant 5
848*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Int6:i\d+>>      IntConstant 6
849*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Phi:i\d+>>       Phi [<<Arg1:i\d+>>,<<Arg2:i\d+>>,<<Arg3:i\d+>>]
850*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Phi>>]
851*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: set(["<<Arg1>>","<<Arg2>>","<<Arg3>>"]) == set(["<<Int0>>","<<Int5>>","<<Int6>>"])
852*795d594fSAndroid Build Coastguard Worker 
853*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test28(boolean, boolean) load_store_elimination (after)
854*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       NewArray
855*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       ArraySet
856*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       ArrayGet
857*795d594fSAndroid Build Coastguard Worker 
858*795d594fSAndroid Build Coastguard Worker   // Test merging array stores in branches.
test28(boolean b, boolean c)859*795d594fSAndroid Build Coastguard Worker   static int test28(boolean b, boolean c) {
860*795d594fSAndroid Build Coastguard Worker     int[] array = new int[1];
861*795d594fSAndroid Build Coastguard Worker     if (b) {
862*795d594fSAndroid Build Coastguard Worker       if (c) {
863*795d594fSAndroid Build Coastguard Worker         array[0] = 5;
864*795d594fSAndroid Build Coastguard Worker       } else {
865*795d594fSAndroid Build Coastguard Worker         array[0] = 6;
866*795d594fSAndroid Build Coastguard Worker       }
867*795d594fSAndroid Build Coastguard Worker     } else { /* Default value: 0. */ }
868*795d594fSAndroid Build Coastguard Worker     return array[0];
869*795d594fSAndroid Build Coastguard Worker   }
870*795d594fSAndroid Build Coastguard Worker 
871*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.test29(boolean) load_store_elimination (before)
872*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float2:f\d+>>   FloatConstant 2
873*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float5:f\d+>>   FloatConstant 5
874*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float8:f\d+>>   FloatConstant 8
875*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Obj:l\d+>>      NewInstance
876*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Float8>>]
877*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Float2>>]
878*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       InstanceFieldSet [<<Obj>>,<<Float5>>]
879*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<GetField:f\d+>> InstanceFieldGet [<<Obj>>]
880*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       Return [<<GetField>>]
881*795d594fSAndroid Build Coastguard Worker 
882*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.test29(boolean) load_store_elimination (after)
883*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float2:f\d+>>   FloatConstant 2
884*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float5:f\d+>>   FloatConstant 5
885*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Float8:f\d+>>   FloatConstant 8
886*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Phi:f\d+>>      Phi [<<Arg1:f\d+>>,<<Arg2:f\d+>>]
887*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                       Return [<<Phi>>]
888*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: set(["<<Arg1>>","<<Arg2>>"]) == set(["<<Float5>>","<<Float2>>"])
889*795d594fSAndroid Build Coastguard Worker 
890*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.test29(boolean) load_store_elimination (after)
891*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       NewInstance
892*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       InstanceFieldSet
893*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                       InstanceFieldGet
894*795d594fSAndroid Build Coastguard Worker 
895*795d594fSAndroid Build Coastguard Worker   // Test implicit type conversion in branches.
test29(boolean b)896*795d594fSAndroid Build Coastguard Worker   static float test29(boolean b) {
897*795d594fSAndroid Build Coastguard Worker     TestClass3 obj = new TestClass3();
898*795d594fSAndroid Build Coastguard Worker     if (b) {
899*795d594fSAndroid Build Coastguard Worker       obj.floatField = 5; // Int
900*795d594fSAndroid Build Coastguard Worker     } else {
901*795d594fSAndroid Build Coastguard Worker       obj.floatField = 2L; // Long
902*795d594fSAndroid Build Coastguard Worker     }
903*795d594fSAndroid Build Coastguard Worker     return obj.floatField;
904*795d594fSAndroid Build Coastguard Worker   }
905*795d594fSAndroid Build Coastguard Worker 
906*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test30(TestClass, boolean) load_store_elimination (before)
907*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int1:i\d+>>      IntConstant 1
908*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int2:i\d+>>      IntConstant 2
909*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [{{l\d+}},<<Int1>>]
910*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [{{l\d+}},<<Int2>>]
911*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<GetField:i\d+>>  InstanceFieldGet [{{l\d+}}]
912*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Return [<<GetField>>]
913*795d594fSAndroid Build Coastguard Worker 
914*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test30(TestClass, boolean) load_store_elimination (after)
915*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int1:i\d+>>      IntConstant 1
916*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int2:i\d+>>      IntConstant 2
917*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [{{l\d+}},<<Int1>>]
918*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [{{l\d+}},<<Int2>>]
919*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<GetField:i\d+>>  InstanceFieldGet [{{l\d+}}]
920*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Return [<<GetField>>]
921*795d594fSAndroid Build Coastguard Worker 
922*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test30(TestClass, boolean) load_store_elimination (after)
923*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
924*795d594fSAndroid Build Coastguard Worker 
925*795d594fSAndroid Build Coastguard Worker   // Don't merge different values in two branches for different variables.
test30(TestClass obj, boolean b)926*795d594fSAndroid Build Coastguard Worker   static int test30(TestClass obj, boolean b) {
927*795d594fSAndroid Build Coastguard Worker     if (b) {
928*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
929*795d594fSAndroid Build Coastguard Worker     } else {
930*795d594fSAndroid Build Coastguard Worker       obj.j = 2;
931*795d594fSAndroid Build Coastguard Worker     }
932*795d594fSAndroid Build Coastguard Worker     return obj.i;
933*795d594fSAndroid Build Coastguard Worker   }
934*795d594fSAndroid Build Coastguard Worker 
935*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test31(boolean, boolean) load_store_elimination (before)
936*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int2:i\d+>>  IntConstant 2
937*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int5:i\d+>>  IntConstant 5
938*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int6:i\d+>>  IntConstant 6
939*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet [{{l\d+}},<<Int5>>] field_name:{{.*TestClass.i}}
940*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet [{{l\d+}},<<Int6>>] field_name:{{.*TestClass.i}}
941*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Get1:i\d+>>  InstanceFieldGet [{{l\d+}}] field_name:{{.*TestClass.i}}
942*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet [{{l\d+}},<<Get1>>] field_name:{{.*TestClass.j}}
943*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet [{{l\d+}},<<Int2>>] field_name:{{.*TestClass.i}}
944*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Get2:i\d+>>  InstanceFieldGet [{{l\d+}}]
945*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Get2>>]
946*795d594fSAndroid Build Coastguard Worker 
947*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test31(boolean, boolean) load_store_elimination (after)
948*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int2:i\d+>>  IntConstant 2
949*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int5:i\d+>>  IntConstant 5
950*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int6:i\d+>>  IntConstant 6
951*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Phi1:i\d+>>  Phi [<<Int5>>,<<Int6>>]
952*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Phi2:i\d+>>  Phi [<<Phi1>>,<<Int2>>]
953*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Phi2>>]
954*795d594fSAndroid Build Coastguard Worker 
955*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test31(boolean, boolean) load_store_elimination (after)
956*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewInstance
957*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldSet
958*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
959*795d594fSAndroid Build Coastguard Worker 
960*795d594fSAndroid Build Coastguard Worker   // Test nested branches that can't be flattened.
test31(boolean b, boolean c)961*795d594fSAndroid Build Coastguard Worker   static int test31(boolean b, boolean c) {
962*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
963*795d594fSAndroid Build Coastguard Worker     if (b) {
964*795d594fSAndroid Build Coastguard Worker       if (c) {
965*795d594fSAndroid Build Coastguard Worker         obj.i = 5;
966*795d594fSAndroid Build Coastguard Worker       } else {
967*795d594fSAndroid Build Coastguard Worker         obj.i = 6;
968*795d594fSAndroid Build Coastguard Worker       }
969*795d594fSAndroid Build Coastguard Worker       obj.j = obj.i;
970*795d594fSAndroid Build Coastguard Worker     } else {
971*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
972*795d594fSAndroid Build Coastguard Worker     }
973*795d594fSAndroid Build Coastguard Worker     return obj.i;
974*795d594fSAndroid Build Coastguard Worker   }
975*795d594fSAndroid Build Coastguard Worker 
976*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test32(int) load_store_elimination (before)
977*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int1:i\d+>>      IntConstant 1
978*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int10:i\d+>>     IntConstant 10
979*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  InstanceFieldSet [{{l\d+}},<<Int1>>] field_name:{{.*TestClass2.i}}
980*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  InstanceFieldSet [{{l\d+}},<<Int1>>] field_name:{{.*TestClass2.j}}
981*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  InstanceFieldSet [{{l\d+}},<<Int1>>] field_name:{{.*TestClass2.k}}
982*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  InstanceFieldSet [{{l\d+}},<<Int1>>] field_name:{{.*TestClass2.l}}
983*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  InstanceFieldSet [{{l\d+}},<<Int1>>] field_name:{{.*TestClass2.m}}
984*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Return [<<Int10>>]
985*795d594fSAndroid Build Coastguard Worker 
986*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test32(int) load_store_elimination (after)
987*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:  <<Int10:i\d+>>     IntConstant 10
988*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Return [<<Int10>>]
989*795d594fSAndroid Build Coastguard Worker 
990*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test32(int) load_store_elimination (after)
991*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     NewInstance
992*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
993*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldSet
994*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
995*795d594fSAndroid Build Coastguard Worker 
996*795d594fSAndroid Build Coastguard Worker   // Test no unused Phi instructions are created.
test32(int i)997*795d594fSAndroid Build Coastguard Worker   static int test32(int i) {
998*795d594fSAndroid Build Coastguard Worker     TestClass2 obj = new TestClass2();
999*795d594fSAndroid Build Coastguard Worker     // By default, i/j/k/l/m are initialized to 0.
1000*795d594fSAndroid Build Coastguard Worker     switch (i) {
1001*795d594fSAndroid Build Coastguard Worker       case 1: obj.i = 1; break;
1002*795d594fSAndroid Build Coastguard Worker       case 2: obj.j = 1; break;
1003*795d594fSAndroid Build Coastguard Worker       case 3: obj.k = 1; break;
1004*795d594fSAndroid Build Coastguard Worker       case 4: obj.l = 1; break;
1005*795d594fSAndroid Build Coastguard Worker       case 5: obj.m = 1; break;
1006*795d594fSAndroid Build Coastguard Worker     }
1007*795d594fSAndroid Build Coastguard Worker     // So here, each variable has value Phi [0,1,1,1,1,1].
1008*795d594fSAndroid Build Coastguard Worker     // But since no heap values are used, we should not be creating these Phis.
1009*795d594fSAndroid Build Coastguard Worker     return 10;
1010*795d594fSAndroid Build Coastguard Worker   }
1011*795d594fSAndroid Build Coastguard Worker 
1012*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test33(TestClass, boolean) load_store_elimination (before)
1013*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1014*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1015*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>        Phi
1016*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [{{l\d+}},<<Phi>>]
1017*795d594fSAndroid Build Coastguard Worker 
1018*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test33(TestClass, boolean) load_store_elimination (after)
1019*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1020*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1021*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>        Phi
1022*795d594fSAndroid Build Coastguard Worker 
1023*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test33(TestClass, boolean) load_store_elimination (after)
1024*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
1025*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
1026*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldSet
1027*795d594fSAndroid Build Coastguard Worker 
1028*795d594fSAndroid Build Coastguard Worker   // Test that we are not eliminating the if/else sets to `obj.i`. We have `NullCheck`s on `obj`
1029*795d594fSAndroid Build Coastguard Worker   // when doing `obj.i`. Since `NullCheck` can throw, we save the stores.
1030*795d594fSAndroid Build Coastguard Worker   // The 3rd `obj.i` set is redundant and can be eliminated. It will have the same value and it is
1031*795d594fSAndroid Build Coastguard Worker   // not needed.
test33(TestClass obj, boolean x)1032*795d594fSAndroid Build Coastguard Worker   static int test33(TestClass obj, boolean x) {
1033*795d594fSAndroid Build Coastguard Worker     int phi;
1034*795d594fSAndroid Build Coastguard Worker     if (x) {
1035*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
1036*795d594fSAndroid Build Coastguard Worker       phi = 1;
1037*795d594fSAndroid Build Coastguard Worker     } else {
1038*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
1039*795d594fSAndroid Build Coastguard Worker       phi = 2;
1040*795d594fSAndroid Build Coastguard Worker     }
1041*795d594fSAndroid Build Coastguard Worker     obj.i = phi;
1042*795d594fSAndroid Build Coastguard Worker     return phi;
1043*795d594fSAndroid Build Coastguard Worker   }
1044*795d594fSAndroid Build Coastguard Worker 
1045*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test34(TestClass, boolean, boolean) load_store_elimination (before)
1046*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1047*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1048*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>        Phi
1049*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet [{{l\d+}},<<Phi>>]
1050*795d594fSAndroid Build Coastguard Worker 
1051*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test34(TestClass, boolean, boolean) load_store_elimination (after)
1052*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1053*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1054*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1055*795d594fSAndroid Build Coastguard Worker 
1056*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test34(TestClass, boolean, boolean) load_store_elimination (after)
1057*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
1058*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
1059*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldSet
1060*795d594fSAndroid Build Coastguard Worker 
1061*795d594fSAndroid Build Coastguard Worker   // Test eliminating a store that writes a Phi equivalent to merged
1062*795d594fSAndroid Build Coastguard Worker   // heap values of observable stores.
test34(TestClass obj, boolean x, boolean y)1063*795d594fSAndroid Build Coastguard Worker   static int test34(TestClass obj, boolean x, boolean y) {
1064*795d594fSAndroid Build Coastguard Worker     int phi;
1065*795d594fSAndroid Build Coastguard Worker     if (x) {
1066*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
1067*795d594fSAndroid Build Coastguard Worker       phi = 1;
1068*795d594fSAndroid Build Coastguard Worker       if (y) {
1069*795d594fSAndroid Build Coastguard Worker         return 3;
1070*795d594fSAndroid Build Coastguard Worker       }
1071*795d594fSAndroid Build Coastguard Worker     } else {
1072*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
1073*795d594fSAndroid Build Coastguard Worker       phi = 2;
1074*795d594fSAndroid Build Coastguard Worker       if (y) {
1075*795d594fSAndroid Build Coastguard Worker         return 4;
1076*795d594fSAndroid Build Coastguard Worker       }
1077*795d594fSAndroid Build Coastguard Worker     }
1078*795d594fSAndroid Build Coastguard Worker     obj.i = phi;
1079*795d594fSAndroid Build Coastguard Worker     return phi;
1080*795d594fSAndroid Build Coastguard Worker   }
1081*795d594fSAndroid Build Coastguard Worker 
1082*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test35(TestClass, boolean, boolean) load_store_elimination (before)
1083*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1084*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1085*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1086*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1087*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1088*795d594fSAndroid Build Coastguard Worker 
1089*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test35(TestClass, boolean, boolean) load_store_elimination (after)
1090*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1091*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1092*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1093*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1094*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1095*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1096*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1097*795d594fSAndroid Build Coastguard Worker 
1098*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test35(TestClass, boolean, boolean) load_store_elimination (after)
1099*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
1100*795d594fSAndroid Build Coastguard Worker 
1101*795d594fSAndroid Build Coastguard Worker   // Test Phi creation for load elimination.
test35(TestClass obj, boolean x, boolean y)1102*795d594fSAndroid Build Coastguard Worker   static int test35(TestClass obj, boolean x, boolean y) {
1103*795d594fSAndroid Build Coastguard Worker     if (x) {
1104*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
1105*795d594fSAndroid Build Coastguard Worker     } else {
1106*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
1107*795d594fSAndroid Build Coastguard Worker     }
1108*795d594fSAndroid Build Coastguard Worker     if (y) {
1109*795d594fSAndroid Build Coastguard Worker       if (x) {
1110*795d594fSAndroid Build Coastguard Worker         obj.i = 3;
1111*795d594fSAndroid Build Coastguard Worker       }
1112*795d594fSAndroid Build Coastguard Worker       obj.j = 5;
1113*795d594fSAndroid Build Coastguard Worker     }
1114*795d594fSAndroid Build Coastguard Worker     return obj.i;
1115*795d594fSAndroid Build Coastguard Worker   }
1116*795d594fSAndroid Build Coastguard Worker 
1117*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test36(TestClass, boolean) load_store_elimination (before)
1118*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1119*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1120*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1121*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1122*795d594fSAndroid Build Coastguard Worker 
1123*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test36(TestClass, boolean) load_store_elimination (after)
1124*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1125*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1126*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1127*795d594fSAndroid Build Coastguard Worker 
1128*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test36(TestClass, boolean) load_store_elimination (after)
1129*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
1130*795d594fSAndroid Build Coastguard Worker 
1131*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test36(TestClass, boolean) load_store_elimination (after)
1132*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
1133*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
1134*795d594fSAndroid Build Coastguard Worker 
1135*795d594fSAndroid Build Coastguard Worker   // Test Phi matching for load elimination.
test36(TestClass obj, boolean x)1136*795d594fSAndroid Build Coastguard Worker   static int test36(TestClass obj, boolean x) {
1137*795d594fSAndroid Build Coastguard Worker     int phi;
1138*795d594fSAndroid Build Coastguard Worker     if (x) {
1139*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
1140*795d594fSAndroid Build Coastguard Worker       phi = 1;
1141*795d594fSAndroid Build Coastguard Worker     } else {
1142*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
1143*795d594fSAndroid Build Coastguard Worker       phi = 2;
1144*795d594fSAndroid Build Coastguard Worker     }
1145*795d594fSAndroid Build Coastguard Worker     // The load is replaced by the existing Phi instead of constructing a new one.
1146*795d594fSAndroid Build Coastguard Worker     return obj.i + phi;
1147*795d594fSAndroid Build Coastguard Worker   }
1148*795d594fSAndroid Build Coastguard Worker 
1149*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test37(TestClass, boolean) load_store_elimination (before)
1150*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1151*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1152*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1153*795d594fSAndroid Build Coastguard Worker 
1154*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test37(TestClass, boolean) load_store_elimination (after)
1155*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1156*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1157*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1158*795d594fSAndroid Build Coastguard Worker 
1159*795d594fSAndroid Build Coastguard Worker   // Test preserving observable stores.
test37(TestClass obj, boolean x)1160*795d594fSAndroid Build Coastguard Worker   static int test37(TestClass obj, boolean x) {
1161*795d594fSAndroid Build Coastguard Worker     if (x) {
1162*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
1163*795d594fSAndroid Build Coastguard Worker     }
1164*795d594fSAndroid Build Coastguard Worker     int tmp = obj.i;  // The store above must be kept.
1165*795d594fSAndroid Build Coastguard Worker     obj.i = 2;
1166*795d594fSAndroid Build Coastguard Worker     return tmp;
1167*795d594fSAndroid Build Coastguard Worker   }
1168*795d594fSAndroid Build Coastguard Worker 
1169*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test38(TestClass, boolean) load_store_elimination (before)
1170*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1171*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1172*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1173*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1174*795d594fSAndroid Build Coastguard Worker 
1175*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test38(TestClass, boolean) load_store_elimination (after)
1176*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
1177*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldSet
1178*795d594fSAndroid Build Coastguard Worker 
1179*795d594fSAndroid Build Coastguard Worker   // Test eliminating store of the same value after eliminating non-observable stores.
test38(TestClass obj, boolean x)1180*795d594fSAndroid Build Coastguard Worker   static int test38(TestClass obj, boolean x) {
1181*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
1182*795d594fSAndroid Build Coastguard Worker     if (x) {
1183*795d594fSAndroid Build Coastguard Worker       return 1;  // The store above must be kept.
1184*795d594fSAndroid Build Coastguard Worker     }
1185*795d594fSAndroid Build Coastguard Worker     obj.i = 2;  // Not observable, shall be eliminated.
1186*795d594fSAndroid Build Coastguard Worker     obj.i = 3;  // Not observable, shall be eliminated.
1187*795d594fSAndroid Build Coastguard Worker     obj.i = 1;  // After eliminating the non-observable stores above, this stores the
1188*795d594fSAndroid Build Coastguard Worker                 // same value that is already stored in `obj.i` and shall be eliminated.
1189*795d594fSAndroid Build Coastguard Worker     return 2;
1190*795d594fSAndroid Build Coastguard Worker   }
1191*795d594fSAndroid Build Coastguard Worker 
1192*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test39(TestClass, boolean) load_store_elimination (before)
1193*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
1194*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1195*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
1196*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1197*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1198*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1199*795d594fSAndroid Build Coastguard Worker 
1200*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test39(TestClass, boolean) load_store_elimination (after)
1201*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
1202*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1203*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
1204*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1205*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1206*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1207*795d594fSAndroid Build Coastguard Worker 
1208*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.test39(TestClass, boolean) load_store_elimination (after)
1209*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldGet
1210*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
1211*795d594fSAndroid Build Coastguard Worker 
1212*795d594fSAndroid Build Coastguard Worker   // Test creating a reference Phi for load elimination.
test39(TestClass obj, boolean x)1213*795d594fSAndroid Build Coastguard Worker   static int test39(TestClass obj, boolean x) {
1214*795d594fSAndroid Build Coastguard Worker     obj.next = new TestClass(1, 2);
1215*795d594fSAndroid Build Coastguard Worker     if (x) {
1216*795d594fSAndroid Build Coastguard Worker       obj.next = new SubTestClass();
1217*795d594fSAndroid Build Coastguard Worker     }
1218*795d594fSAndroid Build Coastguard Worker     return obj.next.i;
1219*795d594fSAndroid Build Coastguard Worker   }
1220*795d594fSAndroid Build Coastguard Worker 
test40()1221*795d594fSAndroid Build Coastguard Worker   private static int test40() {
1222*795d594fSAndroid Build Coastguard Worker     int[] array = new int[1];
1223*795d594fSAndroid Build Coastguard Worker     try {
1224*795d594fSAndroid Build Coastguard Worker       $noinline$fillArrayTest40(array, 100, 0);
1225*795d594fSAndroid Build Coastguard Worker       System.out.println("UNREACHABLE");
1226*795d594fSAndroid Build Coastguard Worker     } catch (Throwable expected) {
1227*795d594fSAndroid Build Coastguard Worker     }
1228*795d594fSAndroid Build Coastguard Worker     assertIntEquals(array[0], 1);
1229*795d594fSAndroid Build Coastguard Worker     try {
1230*795d594fSAndroid Build Coastguard Worker       $noinline$fillArrayTest40(array, 100, 1);
1231*795d594fSAndroid Build Coastguard Worker       System.out.println("UNREACHABLE");
1232*795d594fSAndroid Build Coastguard Worker     } catch (Throwable expected) {
1233*795d594fSAndroid Build Coastguard Worker     }
1234*795d594fSAndroid Build Coastguard Worker     assertIntEquals(array[0], 2);
1235*795d594fSAndroid Build Coastguard Worker     $noinline$fillArrayTest40(array, 100, 2);
1236*795d594fSAndroid Build Coastguard Worker     assertIntEquals(array[0], 150);
1237*795d594fSAndroid Build Coastguard Worker     return array[0];
1238*795d594fSAndroid Build Coastguard Worker   }
1239*795d594fSAndroid Build Coastguard Worker 
1240*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$fillArrayTest40(int[], int, int) load_store_elimination (before)
1241*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     ArraySet
1242*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     DivZeroCheck
1243*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     ArraySet
1244*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     DivZeroCheck
1245*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     ArraySet
1246*795d594fSAndroid Build Coastguard Worker 
1247*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$fillArrayTest40(int[], int, int) load_store_elimination (after)
1248*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     ArraySet
1249*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     DivZeroCheck
1250*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     ArraySet
1251*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     DivZeroCheck
1252*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     ArraySet
1253*795d594fSAndroid Build Coastguard Worker 
1254*795d594fSAndroid Build Coastguard Worker   // Check that the stores to array[0] are not eliminated since we can throw in between the stores.
$noinline$fillArrayTest40(int[] array, int a, int b)1255*795d594fSAndroid Build Coastguard Worker   private static void $noinline$fillArrayTest40(int[] array, int a, int b) {
1256*795d594fSAndroid Build Coastguard Worker     array[0] = 1;
1257*795d594fSAndroid Build Coastguard Worker     int x = a / b;
1258*795d594fSAndroid Build Coastguard Worker     array[0] = 2;
1259*795d594fSAndroid Build Coastguard Worker     int y = a / (b - 1);
1260*795d594fSAndroid Build Coastguard Worker     array[0] = x + y;
1261*795d594fSAndroid Build Coastguard Worker   }
1262*795d594fSAndroid Build Coastguard Worker 
1263*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion1(TestClass, int) load_store_elimination (before)
1264*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1265*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1266*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1267*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1268*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1269*795d594fSAndroid Build Coastguard Worker 
1270*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion1(TestClass, int) load_store_elimination (after)
1271*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1272*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1273*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     TypeConversion
1274*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1275*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1276*795d594fSAndroid Build Coastguard Worker 
1277*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion1(TestClass, int) load_store_elimination (after)
1278*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
1279*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
1280*795d594fSAndroid Build Coastguard Worker 
1281*795d594fSAndroid Build Coastguard Worker   // Test tracking values containing type conversion.
1282*795d594fSAndroid Build Coastguard Worker   // Regression test for b/161521389 .
$noinline$testConversion1(TestClass obj, int x)1283*795d594fSAndroid Build Coastguard Worker   static int $noinline$testConversion1(TestClass obj, int x) {
1284*795d594fSAndroid Build Coastguard Worker     obj.i = x;
1285*795d594fSAndroid Build Coastguard Worker     if ((x & 1) != 0) {
1286*795d594fSAndroid Build Coastguard Worker       obj.b = (byte) x;
1287*795d594fSAndroid Build Coastguard Worker       obj.i = obj.b;
1288*795d594fSAndroid Build Coastguard Worker     }
1289*795d594fSAndroid Build Coastguard Worker     return obj.i;
1290*795d594fSAndroid Build Coastguard Worker   }
1291*795d594fSAndroid Build Coastguard Worker 
1292*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion2(TestClass, int) load_store_elimination (before)
1293*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1294*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1295*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1296*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1297*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     TypeConversion
1298*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1299*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1300*795d594fSAndroid Build Coastguard Worker 
1301*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion2(TestClass, int) load_store_elimination (after)
1302*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1303*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1304*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     TypeConversion
1305*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1306*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1307*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1308*795d594fSAndroid Build Coastguard Worker 
1309*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion2(TestClass, int) load_store_elimination (after)
1310*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
1311*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
1312*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
1313*795d594fSAndroid Build Coastguard Worker 
1314*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion2(TestClass, int) load_store_elimination (after)
1315*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         TypeConversion
1316*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     TypeConversion
1317*795d594fSAndroid Build Coastguard Worker 
1318*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion2(TestClass, int) load_store_elimination (after)
1319*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
1320*795d594fSAndroid Build Coastguard Worker 
1321*795d594fSAndroid Build Coastguard Worker   // Test moving type conversion when needed.
$noinline$testConversion2(TestClass obj, int x)1322*795d594fSAndroid Build Coastguard Worker   static int $noinline$testConversion2(TestClass obj, int x) {
1323*795d594fSAndroid Build Coastguard Worker     int tmp = 0;
1324*795d594fSAndroid Build Coastguard Worker     obj.i = x;
1325*795d594fSAndroid Build Coastguard Worker     if ((x & 1) != 0) {
1326*795d594fSAndroid Build Coastguard Worker       // The instruction simplifier can remove this TypeConversion if there are
1327*795d594fSAndroid Build Coastguard Worker       // no environment uses. Currently, there is an environment use in NullCheck,
1328*795d594fSAndroid Build Coastguard Worker       // so this TypeConversion remains and GVN removes the second TypeConversion
1329*795d594fSAndroid Build Coastguard Worker       // below. Since we really want to test that the TypeConversion from below
1330*795d594fSAndroid Build Coastguard Worker       // can be moved and used for the load of `obj.b`, we have a similar test
1331*795d594fSAndroid Build Coastguard Worker       // written in smali in 530-checker-lse3, StoreLoad.test3(int), except that
1332*795d594fSAndroid Build Coastguard Worker       // it's using static fields (which would not help with the environment use).
1333*795d594fSAndroid Build Coastguard Worker       obj.b = (byte) x;
1334*795d594fSAndroid Build Coastguard Worker       obj.i = obj.b;
1335*795d594fSAndroid Build Coastguard Worker       tmp = (byte) x;
1336*795d594fSAndroid Build Coastguard Worker     }
1337*795d594fSAndroid Build Coastguard Worker     return obj.i + tmp;
1338*795d594fSAndroid Build Coastguard Worker   }
1339*795d594fSAndroid Build Coastguard Worker 
1340*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion3(TestClass, int) load_store_elimination (before)
1341*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1342*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1343*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1344*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1345*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1346*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1347*795d594fSAndroid Build Coastguard Worker 
1348*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion3(TestClass, int) load_store_elimination (after)
1349*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1350*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1351*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1352*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1353*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     TypeConversion
1354*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1355*795d594fSAndroid Build Coastguard Worker 
1356*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion3(TestClass, int) load_store_elimination (after)
1357*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
1358*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
1359*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
1360*795d594fSAndroid Build Coastguard Worker 
1361*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion3(TestClass, int) load_store_elimination (after)
1362*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         TypeConversion
1363*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     TypeConversion
1364*795d594fSAndroid Build Coastguard Worker 
1365*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion3(TestClass, int) load_store_elimination (after)
1366*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
1367*795d594fSAndroid Build Coastguard Worker 
1368*795d594fSAndroid Build Coastguard Worker   // Test tracking values containing type conversion with loop.
$noinline$testConversion3(TestClass obj, int x)1369*795d594fSAndroid Build Coastguard Worker   static int $noinline$testConversion3(TestClass obj, int x) {
1370*795d594fSAndroid Build Coastguard Worker     obj.i = x;
1371*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x; ++i) {
1372*795d594fSAndroid Build Coastguard Worker       obj.b = (byte) i;
1373*795d594fSAndroid Build Coastguard Worker       obj.i = obj.b;
1374*795d594fSAndroid Build Coastguard Worker     }
1375*795d594fSAndroid Build Coastguard Worker     return obj.i;
1376*795d594fSAndroid Build Coastguard Worker   }
1377*795d594fSAndroid Build Coastguard Worker 
1378*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion4(TestClass, int) load_store_elimination (before)
1379*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1380*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1381*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1382*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1383*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1384*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1385*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     TypeConversion
1386*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
1387*795d594fSAndroid Build Coastguard Worker 
1388*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion4(TestClass, int) load_store_elimination (after)
1389*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1390*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1391*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
1392*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1393*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     TypeConversion
1394*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
1395*795d594fSAndroid Build Coastguard Worker 
1396*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion4(TestClass, int) load_store_elimination (after)
1397*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
1398*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
1399*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
1400*795d594fSAndroid Build Coastguard Worker 
1401*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion4(TestClass, int) load_store_elimination (after)
1402*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         TypeConversion
1403*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     TypeConversion
1404*795d594fSAndroid Build Coastguard Worker 
1405*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testConversion4(TestClass, int) load_store_elimination (after)
1406*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
1407*795d594fSAndroid Build Coastguard Worker 
1408*795d594fSAndroid Build Coastguard Worker   // Test moving type conversion when needed with loop.
$noinline$testConversion4(TestClass obj, int x)1409*795d594fSAndroid Build Coastguard Worker   static int $noinline$testConversion4(TestClass obj, int x) {
1410*795d594fSAndroid Build Coastguard Worker     int tmp = x;
1411*795d594fSAndroid Build Coastguard Worker     obj.i = x;
1412*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < x; ++i) {
1413*795d594fSAndroid Build Coastguard Worker       obj.b = (byte) i;
1414*795d594fSAndroid Build Coastguard Worker       obj.i = obj.b;
1415*795d594fSAndroid Build Coastguard Worker       tmp = (byte) i;
1416*795d594fSAndroid Build Coastguard Worker     }
1417*795d594fSAndroid Build Coastguard Worker     return obj.i + tmp;
1418*795d594fSAndroid Build Coastguard Worker   }
1419*795d594fSAndroid Build Coastguard Worker 
1420*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testFinalizable() load_store_elimination (before)
1421*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1422*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1423*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1424*795d594fSAndroid Build Coastguard Worker 
1425*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testFinalizable() load_store_elimination (after)
1426*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1427*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1428*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
1429*795d594fSAndroid Build Coastguard Worker 
1430*795d594fSAndroid Build Coastguard Worker   // Allocations of finalizable objects cannot be eliminated.
testFinalizable()1431*795d594fSAndroid Build Coastguard Worker   static void testFinalizable() {
1432*795d594fSAndroid Build Coastguard Worker     Finalizable finalizable = new Finalizable();
1433*795d594fSAndroid Build Coastguard Worker     finalizable.i = Finalizable.VALUE2;
1434*795d594fSAndroid Build Coastguard Worker     finalizable.i = Finalizable.VALUE1;
1435*795d594fSAndroid Build Coastguard Worker   }
1436*795d594fSAndroid Build Coastguard Worker 
getWeakReference()1437*795d594fSAndroid Build Coastguard Worker   static java.lang.ref.WeakReference<Object> getWeakReference() {
1438*795d594fSAndroid Build Coastguard Worker     return new java.lang.ref.WeakReference<>(new Object());
1439*795d594fSAndroid Build Coastguard Worker   }
1440*795d594fSAndroid Build Coastguard Worker 
testFinalizableByForcingGc()1441*795d594fSAndroid Build Coastguard Worker   static void testFinalizableByForcingGc() {
1442*795d594fSAndroid Build Coastguard Worker     testFinalizable();
1443*795d594fSAndroid Build Coastguard Worker     java.lang.ref.WeakReference<Object> reference = getWeakReference();
1444*795d594fSAndroid Build Coastguard Worker 
1445*795d594fSAndroid Build Coastguard Worker     Runtime runtime = Runtime.getRuntime();
1446*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 20; ++i) {
1447*795d594fSAndroid Build Coastguard Worker       runtime.gc();
1448*795d594fSAndroid Build Coastguard Worker       System.runFinalization();
1449*795d594fSAndroid Build Coastguard Worker       try {
1450*795d594fSAndroid Build Coastguard Worker         Thread.sleep(1);
1451*795d594fSAndroid Build Coastguard Worker       } catch (InterruptedException e) {
1452*795d594fSAndroid Build Coastguard Worker         throw new AssertionError(e);
1453*795d594fSAndroid Build Coastguard Worker       }
1454*795d594fSAndroid Build Coastguard Worker 
1455*795d594fSAndroid Build Coastguard Worker       // Check to see if the weak reference has been garbage collected.
1456*795d594fSAndroid Build Coastguard Worker       if (reference.get() == null) {
1457*795d594fSAndroid Build Coastguard Worker         // A little bit more sleep time to make sure.
1458*795d594fSAndroid Build Coastguard Worker         try {
1459*795d594fSAndroid Build Coastguard Worker           Thread.sleep(100);
1460*795d594fSAndroid Build Coastguard Worker         } catch (InterruptedException e) {
1461*795d594fSAndroid Build Coastguard Worker           throw new AssertionError(e);
1462*795d594fSAndroid Build Coastguard Worker         }
1463*795d594fSAndroid Build Coastguard Worker         if (!Finalizable.sVisited) {
1464*795d594fSAndroid Build Coastguard Worker           System.out.println("finalize() not called.");
1465*795d594fSAndroid Build Coastguard Worker         }
1466*795d594fSAndroid Build Coastguard Worker         return;
1467*795d594fSAndroid Build Coastguard Worker       }
1468*795d594fSAndroid Build Coastguard Worker     }
1469*795d594fSAndroid Build Coastguard Worker     System.out.println("testFinalizableByForcingGc() failed to force gc.");
1470*795d594fSAndroid Build Coastguard Worker   }
1471*795d594fSAndroid Build Coastguard Worker 
1472*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testFinalizable() load_store_elimination (before)
1473*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1474*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1475*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1476*795d594fSAndroid Build Coastguard Worker 
1477*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testFinalizableWithLoop() load_store_elimination (after)
1478*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1479*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1480*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
1481*795d594fSAndroid Build Coastguard Worker 
1482*795d594fSAndroid Build Coastguard Worker   // Allocations of finalizable objects cannot be eliminated.
testFinalizableWithLoop()1483*795d594fSAndroid Build Coastguard Worker   static void testFinalizableWithLoop() {
1484*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 1000; ++i) {
1485*795d594fSAndroid Build Coastguard Worker       Finalizable finalizable = new Finalizable();
1486*795d594fSAndroid Build Coastguard Worker       finalizable.i = Finalizable.VALUE2;
1487*795d594fSAndroid Build Coastguard Worker       finalizable.i = Finalizable.VALUE1;
1488*795d594fSAndroid Build Coastguard Worker     }
1489*795d594fSAndroid Build Coastguard Worker   }
1490*795d594fSAndroid Build Coastguard Worker 
testFinalizableWithLoopByForcingGc()1491*795d594fSAndroid Build Coastguard Worker   static void testFinalizableWithLoopByForcingGc() {
1492*795d594fSAndroid Build Coastguard Worker     testFinalizableWithLoop();
1493*795d594fSAndroid Build Coastguard Worker     java.lang.ref.WeakReference<Object> reference = getWeakReference();
1494*795d594fSAndroid Build Coastguard Worker 
1495*795d594fSAndroid Build Coastguard Worker     Runtime runtime = Runtime.getRuntime();
1496*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 20; ++i) {
1497*795d594fSAndroid Build Coastguard Worker       runtime.gc();
1498*795d594fSAndroid Build Coastguard Worker       System.runFinalization();
1499*795d594fSAndroid Build Coastguard Worker       try {
1500*795d594fSAndroid Build Coastguard Worker         Thread.sleep(1);
1501*795d594fSAndroid Build Coastguard Worker       } catch (InterruptedException e) {
1502*795d594fSAndroid Build Coastguard Worker         throw new AssertionError(e);
1503*795d594fSAndroid Build Coastguard Worker       }
1504*795d594fSAndroid Build Coastguard Worker 
1505*795d594fSAndroid Build Coastguard Worker       // Check to see if the weak reference has been garbage collected.
1506*795d594fSAndroid Build Coastguard Worker       if (reference.get() == null) {
1507*795d594fSAndroid Build Coastguard Worker         // A little bit more sleep time to make sure.
1508*795d594fSAndroid Build Coastguard Worker         try {
1509*795d594fSAndroid Build Coastguard Worker           Thread.sleep(100);
1510*795d594fSAndroid Build Coastguard Worker         } catch (InterruptedException e) {
1511*795d594fSAndroid Build Coastguard Worker           throw new AssertionError(e);
1512*795d594fSAndroid Build Coastguard Worker         }
1513*795d594fSAndroid Build Coastguard Worker         if (!Finalizable.sVisited) {
1514*795d594fSAndroid Build Coastguard Worker           System.out.println("finalize() not called.");
1515*795d594fSAndroid Build Coastguard Worker         }
1516*795d594fSAndroid Build Coastguard Worker         return;
1517*795d594fSAndroid Build Coastguard Worker       }
1518*795d594fSAndroid Build Coastguard Worker     }
1519*795d594fSAndroid Build Coastguard Worker     System.out.println("testFinalizableWithLoopByForcingGc() failed to force gc.");
1520*795d594fSAndroid Build Coastguard Worker   }
1521*795d594fSAndroid Build Coastguard Worker 
1522*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testHSelect(boolean) load_store_elimination (before)
1523*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1524*795d594fSAndroid Build Coastguard Worker   /// CHECK: Select
1525*795d594fSAndroid Build Coastguard Worker 
1526*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testHSelect(boolean) load_store_elimination (after)
1527*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1528*795d594fSAndroid Build Coastguard Worker   /// CHECK: Select
1529*795d594fSAndroid Build Coastguard Worker 
1530*795d594fSAndroid Build Coastguard Worker   // Test that HSelect creates alias.
$noinline$testHSelect(boolean b)1531*795d594fSAndroid Build Coastguard Worker   static int $noinline$testHSelect(boolean b) {
1532*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
1533*795d594fSAndroid Build Coastguard Worker     TestClass obj2 = null;
1534*795d594fSAndroid Build Coastguard Worker     obj.i = 0xdead;
1535*795d594fSAndroid Build Coastguard Worker     if (b) {
1536*795d594fSAndroid Build Coastguard Worker       obj2 = obj;
1537*795d594fSAndroid Build Coastguard Worker     }
1538*795d594fSAndroid Build Coastguard Worker     return obj2.i;
1539*795d594fSAndroid Build Coastguard Worker   }
1540*795d594fSAndroid Build Coastguard Worker 
sumWithFilter(int[] array, Filter f)1541*795d594fSAndroid Build Coastguard Worker   static int sumWithFilter(int[] array, Filter f) {
1542*795d594fSAndroid Build Coastguard Worker     int sum = 0;
1543*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < array.length; i++) {
1544*795d594fSAndroid Build Coastguard Worker       if (f.isValid(array[i])) {
1545*795d594fSAndroid Build Coastguard Worker         sum += array[i];
1546*795d594fSAndroid Build Coastguard Worker       }
1547*795d594fSAndroid Build Coastguard Worker     }
1548*795d594fSAndroid Build Coastguard Worker     return sum;
1549*795d594fSAndroid Build Coastguard Worker   }
1550*795d594fSAndroid Build Coastguard Worker 
1551*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.sumWithinRange(int[], int, int) load_store_elimination (before)
1552*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: NewInstance
1553*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
1554*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
1555*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
1556*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
1557*795d594fSAndroid Build Coastguard Worker 
1558*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.sumWithinRange(int[], int, int) load_store_elimination (after)
1559*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
1560*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
1561*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
1562*795d594fSAndroid Build Coastguard Worker 
1563*795d594fSAndroid Build Coastguard Worker   // A lambda-style allocation can be eliminated after inlining.
sumWithinRange(int[] array, final int low, final int high)1564*795d594fSAndroid Build Coastguard Worker   static int sumWithinRange(int[] array, final int low, final int high) {
1565*795d594fSAndroid Build Coastguard Worker     Filter filter = new Filter() {
1566*795d594fSAndroid Build Coastguard Worker       public boolean isValid(int i) {
1567*795d594fSAndroid Build Coastguard Worker         return (i >= low) && (i <= high);
1568*795d594fSAndroid Build Coastguard Worker       }
1569*795d594fSAndroid Build Coastguard Worker     };
1570*795d594fSAndroid Build Coastguard Worker     return sumWithFilter(array, filter);
1571*795d594fSAndroid Build Coastguard Worker   }
1572*795d594fSAndroid Build Coastguard Worker 
1573*795d594fSAndroid Build Coastguard Worker   private static int mI = 0;
1574*795d594fSAndroid Build Coastguard Worker   private static float mF = 0f;
1575*795d594fSAndroid Build Coastguard Worker 
1576*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.testAllocationEliminationWithLoops() load_store_elimination (before)
1577*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1578*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1579*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1580*795d594fSAndroid Build Coastguard Worker 
1581*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: float Main.testAllocationEliminationWithLoops() load_store_elimination (after)
1582*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
1583*795d594fSAndroid Build Coastguard Worker 
testAllocationEliminationWithLoops()1584*795d594fSAndroid Build Coastguard Worker   private static float testAllocationEliminationWithLoops() {
1585*795d594fSAndroid Build Coastguard Worker     for (int i0 = 0; i0 < 5; i0++) {
1586*795d594fSAndroid Build Coastguard Worker       for (int i1 = 0; i1 < 5; i1++) {
1587*795d594fSAndroid Build Coastguard Worker         for (int i2 = 0; i2 < 5; i2++) {
1588*795d594fSAndroid Build Coastguard Worker           int lI0 = ((int) new Integer(((int) new Integer(mI))));
1589*795d594fSAndroid Build Coastguard Worker           if (((boolean) new Boolean(false))) {
1590*795d594fSAndroid Build Coastguard Worker             for (int i3 = 576 - 1; i3 >= 0; i3--) {
1591*795d594fSAndroid Build Coastguard Worker               mF -= 976981405.0f;
1592*795d594fSAndroid Build Coastguard Worker             }
1593*795d594fSAndroid Build Coastguard Worker           }
1594*795d594fSAndroid Build Coastguard Worker         }
1595*795d594fSAndroid Build Coastguard Worker       }
1596*795d594fSAndroid Build Coastguard Worker     }
1597*795d594fSAndroid Build Coastguard Worker     return 1.0f;
1598*795d594fSAndroid Build Coastguard Worker   }
1599*795d594fSAndroid Build Coastguard Worker 
1600*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: TestClass2 Main.testStoreStore() load_store_elimination (before)
1601*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1602*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1603*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1604*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1605*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1606*795d594fSAndroid Build Coastguard Worker 
1607*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: TestClass2 Main.testStoreStore() load_store_elimination (after)
1608*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1609*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1610*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1611*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
1612*795d594fSAndroid Build Coastguard Worker 
testStoreStore()1613*795d594fSAndroid Build Coastguard Worker   private static TestClass2 testStoreStore() {
1614*795d594fSAndroid Build Coastguard Worker     TestClass2 obj = new TestClass2();
1615*795d594fSAndroid Build Coastguard Worker     obj.i = 41;
1616*795d594fSAndroid Build Coastguard Worker     obj.j = 42;
1617*795d594fSAndroid Build Coastguard Worker     obj.i = 41;
1618*795d594fSAndroid Build Coastguard Worker     obj.j = 43;
1619*795d594fSAndroid Build Coastguard Worker     return obj;
1620*795d594fSAndroid Build Coastguard Worker   }
1621*795d594fSAndroid Build Coastguard Worker 
1622*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testStoreStore2(TestClass2) load_store_elimination (before)
1623*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1624*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1625*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1626*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1627*795d594fSAndroid Build Coastguard Worker 
1628*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testStoreStore2(TestClass2) load_store_elimination (after)
1629*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1630*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1631*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
1632*795d594fSAndroid Build Coastguard Worker 
testStoreStore2(TestClass2 obj)1633*795d594fSAndroid Build Coastguard Worker   private static void testStoreStore2(TestClass2 obj) {
1634*795d594fSAndroid Build Coastguard Worker     obj.i = 41;
1635*795d594fSAndroid Build Coastguard Worker     obj.j = 42;
1636*795d594fSAndroid Build Coastguard Worker     obj.i = 43;
1637*795d594fSAndroid Build Coastguard Worker     obj.j = 44;
1638*795d594fSAndroid Build Coastguard Worker   }
1639*795d594fSAndroid Build Coastguard Worker 
1640*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testStoreStore3(TestClass2, boolean) load_store_elimination (before)
1641*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1642*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1643*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1644*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1645*795d594fSAndroid Build Coastguard Worker 
1646*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testStoreStore3(TestClass2, boolean) load_store_elimination (after)
1647*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1648*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1649*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1650*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
1651*795d594fSAndroid Build Coastguard Worker 
1652*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testStoreStore3(TestClass2, boolean) load_store_elimination (after)
1653*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
1654*795d594fSAndroid Build Coastguard Worker 
testStoreStore3(TestClass2 obj, boolean flag)1655*795d594fSAndroid Build Coastguard Worker   private static void testStoreStore3(TestClass2 obj, boolean flag) {
1656*795d594fSAndroid Build Coastguard Worker     obj.i = 41;
1657*795d594fSAndroid Build Coastguard Worker     obj.j = 42;    // redundant since it's overwritten in both branches below.
1658*795d594fSAndroid Build Coastguard Worker     if (flag) {
1659*795d594fSAndroid Build Coastguard Worker       obj.j = 43;
1660*795d594fSAndroid Build Coastguard Worker     } else {
1661*795d594fSAndroid Build Coastguard Worker       obj.j = 44;
1662*795d594fSAndroid Build Coastguard Worker     }
1663*795d594fSAndroid Build Coastguard Worker   }
1664*795d594fSAndroid Build Coastguard Worker 
1665*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testStoreStore4() load_store_elimination (before)
1666*795d594fSAndroid Build Coastguard Worker   /// CHECK: StaticFieldSet
1667*795d594fSAndroid Build Coastguard Worker   /// CHECK: StaticFieldSet
1668*795d594fSAndroid Build Coastguard Worker 
1669*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testStoreStore4() load_store_elimination (after)
1670*795d594fSAndroid Build Coastguard Worker   /// CHECK: StaticFieldSet
1671*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: StaticFieldSet
1672*795d594fSAndroid Build Coastguard Worker 
testStoreStore4()1673*795d594fSAndroid Build Coastguard Worker   private static void testStoreStore4() {
1674*795d594fSAndroid Build Coastguard Worker     TestClass.si = 61;
1675*795d594fSAndroid Build Coastguard Worker     TestClass.si = 62;
1676*795d594fSAndroid Build Coastguard Worker   }
1677*795d594fSAndroid Build Coastguard Worker 
1678*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testStoreStore5(TestClass2, TestClass2) load_store_elimination (before)
1679*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1680*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
1681*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1682*795d594fSAndroid Build Coastguard Worker 
1683*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testStoreStore5(TestClass2, TestClass2) load_store_elimination (after)
1684*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1685*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
1686*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1687*795d594fSAndroid Build Coastguard Worker 
testStoreStore5(TestClass2 obj1, TestClass2 obj2)1688*795d594fSAndroid Build Coastguard Worker   private static int testStoreStore5(TestClass2 obj1, TestClass2 obj2) {
1689*795d594fSAndroid Build Coastguard Worker     obj1.i = 71;      // This store is needed since obj2.i may load from it.
1690*795d594fSAndroid Build Coastguard Worker     int i = obj2.i;
1691*795d594fSAndroid Build Coastguard Worker     obj1.i = 72;
1692*795d594fSAndroid Build Coastguard Worker     return i;
1693*795d594fSAndroid Build Coastguard Worker   }
1694*795d594fSAndroid Build Coastguard Worker 
1695*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testStoreStore6(TestClass2, TestClass2) load_store_elimination (before)
1696*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1697*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
1698*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1699*795d594fSAndroid Build Coastguard Worker 
1700*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testStoreStore6(TestClass2, TestClass2) load_store_elimination (after)
1701*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1702*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldGet
1703*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1704*795d594fSAndroid Build Coastguard Worker 
testStoreStore6(TestClass2 obj1, TestClass2 obj2)1705*795d594fSAndroid Build Coastguard Worker   private static int testStoreStore6(TestClass2 obj1, TestClass2 obj2) {
1706*795d594fSAndroid Build Coastguard Worker     obj1.i = 81; // Even though the value in `obj1.i` will be overridden below, this store is needed
1707*795d594fSAndroid Build Coastguard Worker                  // since obj2.j has a NullCheck and can throw.
1708*795d594fSAndroid Build Coastguard Worker     int j = obj2.j;
1709*795d594fSAndroid Build Coastguard Worker     obj1.i = 82;
1710*795d594fSAndroid Build Coastguard Worker     return j;
1711*795d594fSAndroid Build Coastguard Worker   }
1712*795d594fSAndroid Build Coastguard Worker 
1713*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNoSideEffects(int[]) load_store_elimination (before)
1714*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1715*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1716*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1717*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1718*795d594fSAndroid Build Coastguard Worker 
1719*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNoSideEffects(int[]) load_store_elimination (after)
1720*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1721*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1722*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArraySet
1723*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArrayGet
1724*795d594fSAndroid Build Coastguard Worker 
testNoSideEffects(int[] array)1725*795d594fSAndroid Build Coastguard Worker   private static int testNoSideEffects(int[] array) {
1726*795d594fSAndroid Build Coastguard Worker     array[0] = 101;
1727*795d594fSAndroid Build Coastguard Worker     array[1] = 102;
1728*795d594fSAndroid Build Coastguard Worker     int bitCount = Integer.bitCount(0x3456);
1729*795d594fSAndroid Build Coastguard Worker     array[1] = 103;
1730*795d594fSAndroid Build Coastguard Worker     return array[0] + bitCount;
1731*795d594fSAndroid Build Coastguard Worker   }
1732*795d594fSAndroid Build Coastguard Worker 
1733*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testThrow(TestClass2, java.lang.Exception) load_store_elimination (before)
1734*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1735*795d594fSAndroid Build Coastguard Worker   /// CHECK: Throw
1736*795d594fSAndroid Build Coastguard Worker 
1737*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testThrow(TestClass2, java.lang.Exception) load_store_elimination (after)
1738*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1739*795d594fSAndroid Build Coastguard Worker   /// CHECK: Throw
1740*795d594fSAndroid Build Coastguard Worker 
1741*795d594fSAndroid Build Coastguard Worker   // Make sure throw keeps the store.
testThrow(TestClass2 obj, Exception e)1742*795d594fSAndroid Build Coastguard Worker   private static void testThrow(TestClass2 obj, Exception e) throws Exception {
1743*795d594fSAndroid Build Coastguard Worker     obj.i = 55;
1744*795d594fSAndroid Build Coastguard Worker     throw e;
1745*795d594fSAndroid Build Coastguard Worker   }
1746*795d594fSAndroid Build Coastguard Worker 
1747*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testStoreStoreWithDeoptimize(int[]) load_store_elimination (before)
1748*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1749*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1750*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1751*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1752*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1753*795d594fSAndroid Build Coastguard Worker   /// CHECK: Deoptimize
1754*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1755*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1756*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1757*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1758*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1759*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1760*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1761*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1762*795d594fSAndroid Build Coastguard Worker 
1763*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testStoreStoreWithDeoptimize(int[]) load_store_elimination (after)
1764*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1765*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1766*795d594fSAndroid Build Coastguard Worker   /// CHECK: InstanceFieldSet
1767*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
1768*795d594fSAndroid Build Coastguard Worker   /// CHECK: Deoptimize
1769*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1770*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1771*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1772*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1773*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArrayGet
1774*795d594fSAndroid Build Coastguard Worker 
testStoreStoreWithDeoptimize(int[] arr)1775*795d594fSAndroid Build Coastguard Worker   private static int testStoreStoreWithDeoptimize(int[] arr) {
1776*795d594fSAndroid Build Coastguard Worker     TestClass2 obj = new TestClass2();
1777*795d594fSAndroid Build Coastguard Worker     obj.i = 41;
1778*795d594fSAndroid Build Coastguard Worker     obj.j = 42;
1779*795d594fSAndroid Build Coastguard Worker     obj.i = 41;
1780*795d594fSAndroid Build Coastguard Worker     obj.j = 43;
1781*795d594fSAndroid Build Coastguard Worker     arr[0] = 1;  // One HDeoptimize here.
1782*795d594fSAndroid Build Coastguard Worker     arr[1] = 1;
1783*795d594fSAndroid Build Coastguard Worker     arr[2] = 1;
1784*795d594fSAndroid Build Coastguard Worker     arr[3] = 1;
1785*795d594fSAndroid Build Coastguard Worker     return arr[0] + arr[1] + arr[2] + arr[3];
1786*795d594fSAndroid Build Coastguard Worker   }
1787*795d594fSAndroid Build Coastguard Worker 
1788*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.getCircleArea(double, boolean) load_store_elimination (before)
1789*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1790*795d594fSAndroid Build Coastguard Worker 
1791*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.getCircleArea(double, boolean) load_store_elimination (after)
1792*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
1793*795d594fSAndroid Build Coastguard Worker 
getCircleArea(double radius, boolean b)1794*795d594fSAndroid Build Coastguard Worker   private static double getCircleArea(double radius, boolean b) {
1795*795d594fSAndroid Build Coastguard Worker     double area = 0d;
1796*795d594fSAndroid Build Coastguard Worker     if (b) {
1797*795d594fSAndroid Build Coastguard Worker       area = new Circle(radius).getArea();
1798*795d594fSAndroid Build Coastguard Worker     }
1799*795d594fSAndroid Build Coastguard Worker     return area;
1800*795d594fSAndroid Build Coastguard Worker   }
1801*795d594fSAndroid Build Coastguard Worker 
1802*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.testDeoptimize(int[], double[], double) load_store_elimination (before)
1803*795d594fSAndroid Build Coastguard Worker   /// CHECK: Deoptimize
1804*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1805*795d594fSAndroid Build Coastguard Worker   /// CHECK: Deoptimize
1806*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1807*795d594fSAndroid Build Coastguard Worker 
1808*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: double Main.testDeoptimize(int[], double[], double) load_store_elimination (after)
1809*795d594fSAndroid Build Coastguard Worker   /// CHECK: Deoptimize
1810*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1811*795d594fSAndroid Build Coastguard Worker   /// CHECK: Deoptimize
1812*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
1813*795d594fSAndroid Build Coastguard Worker 
testDeoptimize(int[] iarr, double[] darr, double radius)1814*795d594fSAndroid Build Coastguard Worker   private static double testDeoptimize(int[] iarr, double[] darr, double radius) {
1815*795d594fSAndroid Build Coastguard Worker     iarr[0] = 1;  // One HDeoptimize here. Not triggered.
1816*795d594fSAndroid Build Coastguard Worker     iarr[1] = 1;
1817*795d594fSAndroid Build Coastguard Worker     Circle circle1 = new Circle(radius);
1818*795d594fSAndroid Build Coastguard Worker     iarr[2] = 1;
1819*795d594fSAndroid Build Coastguard Worker     darr[0] = circle1.getRadius();  // One HDeoptimize here, which holds circle1 live. Triggered.
1820*795d594fSAndroid Build Coastguard Worker     darr[1] = circle1.getRadius();
1821*795d594fSAndroid Build Coastguard Worker     darr[2] = circle1.getRadius();
1822*795d594fSAndroid Build Coastguard Worker     darr[3] = circle1.getRadius();
1823*795d594fSAndroid Build Coastguard Worker     return new Circle(Math.PI).getArea();
1824*795d594fSAndroid Build Coastguard Worker   }
1825*795d594fSAndroid Build Coastguard Worker 
1826*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testAllocationEliminationOfArray1() load_store_elimination (before)
1827*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
1828*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1829*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1830*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1831*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1832*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1833*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1834*795d594fSAndroid Build Coastguard Worker 
1835*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testAllocationEliminationOfArray1() load_store_elimination (after)
1836*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewArray
1837*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArraySet
1838*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArrayGet
testAllocationEliminationOfArray1()1839*795d594fSAndroid Build Coastguard Worker   private static int testAllocationEliminationOfArray1() {
1840*795d594fSAndroid Build Coastguard Worker     int[] array = new int[4];
1841*795d594fSAndroid Build Coastguard Worker     array[2] = 4;
1842*795d594fSAndroid Build Coastguard Worker     array[3] = 7;
1843*795d594fSAndroid Build Coastguard Worker     return array[0] + array[1] + array[2] + array[3];
1844*795d594fSAndroid Build Coastguard Worker   }
1845*795d594fSAndroid Build Coastguard Worker 
1846*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testAllocationEliminationOfArray2() load_store_elimination (before)
1847*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
1848*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1849*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1850*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1851*795d594fSAndroid Build Coastguard Worker 
1852*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-{ARM64,X86,X86_64}: int Main.testAllocationEliminationOfArray2() load_store_elimination (after)
1853*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewArray
1854*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArraySet
1855*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArraySet
1856*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArrayGet
1857*795d594fSAndroid Build Coastguard Worker 
1858*795d594fSAndroid Build Coastguard Worker   // The loop optimization doesn't happen in ARM which leads to LSE not being able to optimize this
1859*795d594fSAndroid Build Coastguard Worker   // case.
1860*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: int Main.testAllocationEliminationOfArray2() load_store_elimination (after)
1861*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
1862*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1863*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1864*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
testAllocationEliminationOfArray2()1865*795d594fSAndroid Build Coastguard Worker   private static int testAllocationEliminationOfArray2() {
1866*795d594fSAndroid Build Coastguard Worker     // Array can be eliminated because LSE can reduce the array accesses into
1867*795d594fSAndroid Build Coastguard Worker     // integer constants.
1868*795d594fSAndroid Build Coastguard Worker     int[] array = new int[3];
1869*795d594fSAndroid Build Coastguard Worker     array[1] = 4;
1870*795d594fSAndroid Build Coastguard Worker     array[2] = 7;
1871*795d594fSAndroid Build Coastguard Worker     int sum = 0;
1872*795d594fSAndroid Build Coastguard Worker     for (int e : array) {
1873*795d594fSAndroid Build Coastguard Worker       sum += e;
1874*795d594fSAndroid Build Coastguard Worker     }
1875*795d594fSAndroid Build Coastguard Worker     return sum;
1876*795d594fSAndroid Build Coastguard Worker   }
1877*795d594fSAndroid Build Coastguard Worker 
1878*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testAllocationEliminationOfArray3(int) load_store_elimination (before)
1879*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
1880*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1881*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1882*795d594fSAndroid Build Coastguard Worker 
1883*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testAllocationEliminationOfArray3(int) load_store_elimination (after)
1884*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewArray
1885*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArraySet
1886*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArrayGet
testAllocationEliminationOfArray3(int i)1887*795d594fSAndroid Build Coastguard Worker   private static int testAllocationEliminationOfArray3(int i) {
1888*795d594fSAndroid Build Coastguard Worker     int[] array = new int[4];
1889*795d594fSAndroid Build Coastguard Worker     array[i] = 4;
1890*795d594fSAndroid Build Coastguard Worker     return array[i];
1891*795d594fSAndroid Build Coastguard Worker   }
1892*795d594fSAndroid Build Coastguard Worker 
1893*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testAllocationEliminationOfArray4(int) load_store_elimination (before)
1894*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
1895*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1896*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1897*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1898*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1899*795d594fSAndroid Build Coastguard Worker 
1900*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testAllocationEliminationOfArray4(int) load_store_elimination (after)
1901*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
1902*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1903*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1904*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1905*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArrayGet
testAllocationEliminationOfArray4(int i)1906*795d594fSAndroid Build Coastguard Worker   private static int testAllocationEliminationOfArray4(int i) {
1907*795d594fSAndroid Build Coastguard Worker     // Cannot eliminate array allocation due to index aliasing between 1 and i.
1908*795d594fSAndroid Build Coastguard Worker     int[] array = new int[4];
1909*795d594fSAndroid Build Coastguard Worker     array[1] = 2;
1910*795d594fSAndroid Build Coastguard Worker     array[i] = 4;
1911*795d594fSAndroid Build Coastguard Worker     return array[1] + array[i];
1912*795d594fSAndroid Build Coastguard Worker   }
1913*795d594fSAndroid Build Coastguard Worker 
1914*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testAllocationEliminationOfArray5(int) load_store_elimination (before)
1915*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
1916*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1917*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1918*795d594fSAndroid Build Coastguard Worker 
1919*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testAllocationEliminationOfArray5(int) load_store_elimination (after)
1920*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
1921*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArraySet
1922*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArrayGet
testAllocationEliminationOfArray5(int i)1923*795d594fSAndroid Build Coastguard Worker   private static int testAllocationEliminationOfArray5(int i) {
1924*795d594fSAndroid Build Coastguard Worker     // Cannot eliminate array allocation due to unknown i that may
1925*795d594fSAndroid Build Coastguard Worker     // cause NegativeArraySizeException.
1926*795d594fSAndroid Build Coastguard Worker     int[] array = new int[i];
1927*795d594fSAndroid Build Coastguard Worker     array[1] = 12;
1928*795d594fSAndroid Build Coastguard Worker     return array[1];
1929*795d594fSAndroid Build Coastguard Worker   }
1930*795d594fSAndroid Build Coastguard Worker 
1931*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testAllocationEliminationOfArray6(boolean) load_store_elimination (before)
1932*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
1933*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1934*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1935*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
1936*795d594fSAndroid Build Coastguard Worker 
1937*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testAllocationEliminationOfArray6(boolean) load_store_elimination (after)
1938*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
1939*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1940*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
1941*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
testAllocationEliminationOfArray6(boolean prevent_loop_opt)1942*795d594fSAndroid Build Coastguard Worker   private static int testAllocationEliminationOfArray6(boolean prevent_loop_opt) {
1943*795d594fSAndroid Build Coastguard Worker     // Cannot eliminate array allocation since array is accessed with non-constant
1944*795d594fSAndroid Build Coastguard Worker     // index (only 3 elements to prevent vectorization of the reduction).
1945*795d594fSAndroid Build Coastguard Worker     int[] array = new int[3];
1946*795d594fSAndroid Build Coastguard Worker     array[1] = 4;
1947*795d594fSAndroid Build Coastguard Worker     array[2] = 7;
1948*795d594fSAndroid Build Coastguard Worker     int sum = 0;
1949*795d594fSAndroid Build Coastguard Worker     for (int e : array) {
1950*795d594fSAndroid Build Coastguard Worker       sum += e;
1951*795d594fSAndroid Build Coastguard Worker 
1952*795d594fSAndroid Build Coastguard Worker       // Prevent the loop from being optimized away before LSE. This should
1953*795d594fSAndroid Build Coastguard Worker       // never be false.
1954*795d594fSAndroid Build Coastguard Worker       if (!prevent_loop_opt) {
1955*795d594fSAndroid Build Coastguard Worker         return -1;
1956*795d594fSAndroid Build Coastguard Worker       }
1957*795d594fSAndroid Build Coastguard Worker     }
1958*795d594fSAndroid Build Coastguard Worker     return sum;
1959*795d594fSAndroid Build Coastguard Worker   }
1960*795d594fSAndroid Build Coastguard Worker 
1961*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testExitMerge(boolean) load_store_elimination (before)
1962*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: NewInstance
1963*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet field_name:TestClass.i
1964*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet field_name:TestClass.i
1965*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Return
1966*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet field_name:TestClass.i
1967*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Throw
1968*795d594fSAndroid Build Coastguard Worker 
1969*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testExitMerge(boolean) load_store_elimination (after)
1970*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Return
1971*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: Throw
1972*795d594fSAndroid Build Coastguard Worker 
1973*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testExitMerge(boolean) load_store_elimination (after)
1974*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet field_name:TestClass.i
1975*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet field_name:TestClass.i
1976*795d594fSAndroid Build Coastguard Worker 
1977*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testExitMerge(boolean) load_store_elimination (after)
1978*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewInstance
1979*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
testExitMerge(boolean cond)1980*795d594fSAndroid Build Coastguard Worker   private static int testExitMerge(boolean cond) {
1981*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
1982*795d594fSAndroid Build Coastguard Worker     if (cond) {
1983*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
1984*795d594fSAndroid Build Coastguard Worker       return obj.i + 1;
1985*795d594fSAndroid Build Coastguard Worker     } else {
1986*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
1987*795d594fSAndroid Build Coastguard Worker       throw new Error();  // Note: We have a NewInstance here.
1988*795d594fSAndroid Build Coastguard Worker     }
1989*795d594fSAndroid Build Coastguard Worker   }
1990*795d594fSAndroid Build Coastguard Worker 
1991*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testExitMerge2(boolean) load_store_elimination (before)
1992*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: NewInstance
1993*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
1994*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
1995*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldSet
1996*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: InstanceFieldGet
1997*795d594fSAndroid Build Coastguard Worker 
1998*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testExitMerge2(boolean) load_store_elimination (after)
1999*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NewInstance
2000*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldSet
2001*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InstanceFieldGet
testExitMerge2(boolean cond)2002*795d594fSAndroid Build Coastguard Worker   private static int testExitMerge2(boolean cond) {
2003*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
2004*795d594fSAndroid Build Coastguard Worker     int res;
2005*795d594fSAndroid Build Coastguard Worker     if (cond) {
2006*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
2007*795d594fSAndroid Build Coastguard Worker       res = obj.i + 1;
2008*795d594fSAndroid Build Coastguard Worker     } else {
2009*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
2010*795d594fSAndroid Build Coastguard Worker       res = obj.j + 2;
2011*795d594fSAndroid Build Coastguard Worker     }
2012*795d594fSAndroid Build Coastguard Worker     return res;
2013*795d594fSAndroid Build Coastguard Worker   }
2014*795d594fSAndroid Build Coastguard Worker 
2015*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testStoreSameValue() load_store_elimination (before)
2016*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
2017*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArrayGet
2018*795d594fSAndroid Build Coastguard Worker   /// CHECK: ArraySet
2019*795d594fSAndroid Build Coastguard Worker 
2020*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testStoreSameValue() load_store_elimination (after)
2021*795d594fSAndroid Build Coastguard Worker   /// CHECK: NewArray
2022*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArrayGet
2023*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ArraySet
testStoreSameValue()2024*795d594fSAndroid Build Coastguard Worker   private static void testStoreSameValue() {
2025*795d594fSAndroid Build Coastguard Worker     Object[] array = new Object[2];
2026*795d594fSAndroid Build Coastguard Worker     sArray = array;
2027*795d594fSAndroid Build Coastguard Worker     Object obj = array[0];
2028*795d594fSAndroid Build Coastguard Worker     array[1] = obj;    // Store the same value as the default value.
2029*795d594fSAndroid Build Coastguard Worker   }
2030*795d594fSAndroid Build Coastguard Worker 
2031*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testByteArrayDefaultValue() load_store_elimination (before)
2032*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
2033*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Value:b\d+>>  ArrayGet
2034*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Value>>]
2035*795d594fSAndroid Build Coastguard Worker 
2036*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testByteArrayDefaultValue() load_store_elimination (after)
2037*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
2038*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Const0>>]
2039*795d594fSAndroid Build Coastguard Worker 
2040*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testByteArrayDefaultValue() load_store_elimination (after)
2041*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewArray
2042*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
2043*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 TypeConversion
$noinline$testByteArrayDefaultValue()2044*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testByteArrayDefaultValue() {
2045*795d594fSAndroid Build Coastguard Worker     byte[] array = new byte[2];
2046*795d594fSAndroid Build Coastguard Worker     array[1] = 1;  // FIXME: Without any stores, LSA tells LSE not to run.
2047*795d594fSAndroid Build Coastguard Worker     return array[0];
2048*795d594fSAndroid Build Coastguard Worker   }
2049*795d594fSAndroid Build Coastguard Worker 
2050*795d594fSAndroid Build Coastguard Worker   static Object[] sArray;
2051*795d594fSAndroid Build Coastguard Worker 
2052*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge1(boolean) load_store_elimination (before)
2053*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
2054*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
2055*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<A:l\d+>>      NewArray
2056*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet [<<A>>,<<Const0>>,<<Const0>>]
2057*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet [<<A>>,<<Const0>>,<<Const1>>]
2058*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet [<<A>>,<<Const0>>,<<Const1>>]
2059*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>    ArrayGet [<<A>>,<<Const0>>]
2060*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Get>>]
2061*795d594fSAndroid Build Coastguard Worker   //
2062*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge1(boolean) load_store_elimination (after)
2063*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
2064*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Const1>>]
2065*795d594fSAndroid Build Coastguard Worker   //
2066*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge1(boolean) load_store_elimination (after)
2067*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewArray
2068*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArraySet
2069*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
testLocalArrayMerge1(boolean x)2070*795d594fSAndroid Build Coastguard Worker   private static int testLocalArrayMerge1(boolean x) {
2071*795d594fSAndroid Build Coastguard Worker     // The explicit store can be removed right away
2072*795d594fSAndroid Build Coastguard Worker     // since it is equivalent to the default.
2073*795d594fSAndroid Build Coastguard Worker     int[] a = { 0 };
2074*795d594fSAndroid Build Coastguard Worker     // The diamond pattern stores/load can be replaced
2075*795d594fSAndroid Build Coastguard Worker     // by the direct value.
2076*795d594fSAndroid Build Coastguard Worker     if (x) {
2077*795d594fSAndroid Build Coastguard Worker       a[0] = 1;
2078*795d594fSAndroid Build Coastguard Worker     } else {
2079*795d594fSAndroid Build Coastguard Worker       a[0] = 1;
2080*795d594fSAndroid Build Coastguard Worker     }
2081*795d594fSAndroid Build Coastguard Worker     return a[0];
2082*795d594fSAndroid Build Coastguard Worker   }
2083*795d594fSAndroid Build Coastguard Worker 
2084*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge2(boolean) load_store_elimination (before)
2085*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
2086*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
2087*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
2088*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const3:i\d+>> IntConstant 3
2089*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<A:l\d+>>      NewArray
2090*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet [<<A>>,<<Const0>>,<<Const1>>]
2091*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet [<<A>>,<<Const0>>,<<Const2>>]
2092*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet [<<A>>,<<Const0>>,<<Const3>>]
2093*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>    ArrayGet [<<A>>,<<Const0>>]
2094*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Get>>]
2095*795d594fSAndroid Build Coastguard Worker 
2096*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge2(boolean) load_store_elimination (after)
2097*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
2098*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const3:i\d+>> IntConstant 3
2099*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>    Phi [<<Arg1:i\d+>>,<<Arg2:i\d+>>]
2100*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Phi>>]
2101*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: set(["<<Arg1>>","<<Arg2>>"]) == set(["<<Const2>>","<<Const3>>"])
2102*795d594fSAndroid Build Coastguard Worker 
2103*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge2(boolean) load_store_elimination (after)
2104*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewArray
2105*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArraySet
2106*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
testLocalArrayMerge2(boolean x)2107*795d594fSAndroid Build Coastguard Worker   private static int testLocalArrayMerge2(boolean x) {
2108*795d594fSAndroid Build Coastguard Worker     // The explicit store can be removed eventually even
2109*795d594fSAndroid Build Coastguard Worker     // though it is not equivalent to the default.
2110*795d594fSAndroid Build Coastguard Worker     int[] a = { 1 };
2111*795d594fSAndroid Build Coastguard Worker     // The load after the diamond pattern is eliminated and replaced with a Phi,
2112*795d594fSAndroid Build Coastguard Worker     // stores are then also eliminated.
2113*795d594fSAndroid Build Coastguard Worker     if (x) {
2114*795d594fSAndroid Build Coastguard Worker       a[0] = 2;
2115*795d594fSAndroid Build Coastguard Worker     } else {
2116*795d594fSAndroid Build Coastguard Worker       a[0] = 3;
2117*795d594fSAndroid Build Coastguard Worker     }
2118*795d594fSAndroid Build Coastguard Worker     return a[0];
2119*795d594fSAndroid Build Coastguard Worker   }
2120*795d594fSAndroid Build Coastguard Worker 
2121*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge3(boolean) load_store_elimination (before)
2122*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
2123*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
2124*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
2125*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<A:l\d+>>      NewArray
2126*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet [<<A>>,<<Const0>>,<<Const1>>]
2127*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet [<<A>>,<<Const0>>,<<Const2>>]
2128*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:i\d+>>    ArrayGet [<<A>>,<<Const0>>]
2129*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Get>>]
2130*795d594fSAndroid Build Coastguard Worker 
2131*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge3(boolean) load_store_elimination (after)
2132*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewArray
2133*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArraySet
2134*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
testLocalArrayMerge3(boolean x)2135*795d594fSAndroid Build Coastguard Worker   private static int testLocalArrayMerge3(boolean x) {
2136*795d594fSAndroid Build Coastguard Worker     int[] a = { 1 };
2137*795d594fSAndroid Build Coastguard Worker     if (x) {
2138*795d594fSAndroid Build Coastguard Worker       a[0] = 2;
2139*795d594fSAndroid Build Coastguard Worker     }
2140*795d594fSAndroid Build Coastguard Worker     return a[0];
2141*795d594fSAndroid Build Coastguard Worker   }
2142*795d594fSAndroid Build Coastguard Worker 
2143*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge4(boolean) load_store_elimination (before)
2144*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
2145*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
2146*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<A:l\d+>>      NewArray
2147*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet [<<A>>,<<Const0>>,<<Const0>>]
2148*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet [<<A>>,<<Const0>>,<<Const1>>]
2149*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet [<<A>>,<<Const0>>,<<Const1>>]
2150*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:b\d+>>   ArrayGet [<<A>>,<<Const0>>]
2151*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:a\d+>>   ArrayGet [<<A>>,<<Const0>>]
2152*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>    Add [<<Get1>>,<<Get2>>]
2153*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Add>>]
2154*795d594fSAndroid Build Coastguard Worker   //
2155*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge4(boolean) load_store_elimination (after)
2156*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
2157*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnv1:b\d+>>   TypeConversion [<<Const1>>]
2158*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnv2:a\d+>>   TypeConversion [<<Const1>>]
2159*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>    Add [<<Cnv1>>,<<Cnv2>>]
2160*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Add>>]
2161*795d594fSAndroid Build Coastguard Worker   //
2162*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge4(boolean) load_store_elimination (after)
2163*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewArray
2164*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArraySet
2165*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
testLocalArrayMerge4(boolean x)2166*795d594fSAndroid Build Coastguard Worker   private static int testLocalArrayMerge4(boolean x) {
2167*795d594fSAndroid Build Coastguard Worker     byte[] a = { 0 };
2168*795d594fSAndroid Build Coastguard Worker     if (x) {
2169*795d594fSAndroid Build Coastguard Worker       a[0] = 1;
2170*795d594fSAndroid Build Coastguard Worker     } else {
2171*795d594fSAndroid Build Coastguard Worker       a[0] = 1;
2172*795d594fSAndroid Build Coastguard Worker     }
2173*795d594fSAndroid Build Coastguard Worker     // Differently typed (signed vs unsigned),
2174*795d594fSAndroid Build Coastguard Worker     // but same reference.
2175*795d594fSAndroid Build Coastguard Worker     return a[0] + (a[0] & 0xff);
2176*795d594fSAndroid Build Coastguard Worker   }
2177*795d594fSAndroid Build Coastguard Worker 
2178*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge5(int[], boolean) load_store_elimination (before)
2179*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     ArraySet
2180*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     ArraySet
2181*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     ArraySet
2182*795d594fSAndroid Build Coastguard Worker 
2183*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge5(int[], boolean) load_store_elimination (after)
2184*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArraySet
2185*795d594fSAndroid Build Coastguard Worker 
2186*795d594fSAndroid Build Coastguard Worker   // Test eliminating store of the same value after eliminating non-observable stores.
testLocalArrayMerge5(int[] a, boolean x)2187*795d594fSAndroid Build Coastguard Worker   private static int testLocalArrayMerge5(int[] a, boolean x) {
2188*795d594fSAndroid Build Coastguard Worker     int old = a[0];
2189*795d594fSAndroid Build Coastguard Worker     if (x) {
2190*795d594fSAndroid Build Coastguard Worker       a[0] = 1;
2191*795d594fSAndroid Build Coastguard Worker     } else {
2192*795d594fSAndroid Build Coastguard Worker       a[0] = 1;
2193*795d594fSAndroid Build Coastguard Worker     }
2194*795d594fSAndroid Build Coastguard Worker     // This store makes the stores above dead and they will be eliminated.
2195*795d594fSAndroid Build Coastguard Worker     // That makes this store unnecessary as we're storing the same value already
2196*795d594fSAndroid Build Coastguard Worker     // present in this location, so it shall also be eliminated.
2197*795d594fSAndroid Build Coastguard Worker     a[0] = old;
2198*795d594fSAndroid Build Coastguard Worker     return old;
2199*795d594fSAndroid Build Coastguard Worker   }
2200*795d594fSAndroid Build Coastguard Worker 
2201*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge6(int[], boolean, boolean) load_store_elimination (before)
2202*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2203*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2204*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2205*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2206*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2207*795d594fSAndroid Build Coastguard Worker 
2208*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge6(int[], boolean, boolean) load_store_elimination (after)
2209*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
2210*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
2211*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const3:i\d+>> IntConstant 3
2212*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2213*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2214*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi:i\d+>>    Phi [<<Arg1:i\d+>>,<<Arg2:i\d+>>]
2215*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Phi>>]
2216*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Const3>>,<<Phi>>]
2217*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Sub>>]
2218*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: set(["<<Arg1>>","<<Arg2>>"]) == set(["<<Const1>>","<<Const2>>"])
2219*795d594fSAndroid Build Coastguard Worker 
2220*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge6(int[], boolean, boolean) load_store_elimination (after)
2221*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2222*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
2223*795d594fSAndroid Build Coastguard Worker 
2224*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge6(int[], boolean, boolean) load_store_elimination (after)
2225*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
2226*795d594fSAndroid Build Coastguard Worker 
2227*795d594fSAndroid Build Coastguard Worker   // Test that we create a single Phi for eliminating two loads in different blocks.
testLocalArrayMerge6(int[] a, boolean x, boolean y)2228*795d594fSAndroid Build Coastguard Worker   private static int testLocalArrayMerge6(int[] a, boolean x, boolean y) {
2229*795d594fSAndroid Build Coastguard Worker     a[0] = 0;
2230*795d594fSAndroid Build Coastguard Worker     if (x) {
2231*795d594fSAndroid Build Coastguard Worker       a[0] = 1;
2232*795d594fSAndroid Build Coastguard Worker     } else {
2233*795d594fSAndroid Build Coastguard Worker       a[0] = 2;
2234*795d594fSAndroid Build Coastguard Worker     }
2235*795d594fSAndroid Build Coastguard Worker     // Phi for load elimination is created here.
2236*795d594fSAndroid Build Coastguard Worker     if (y) {
2237*795d594fSAndroid Build Coastguard Worker       return a[0];
2238*795d594fSAndroid Build Coastguard Worker     } else {
2239*795d594fSAndroid Build Coastguard Worker       return 3 - a[0];
2240*795d594fSAndroid Build Coastguard Worker     }
2241*795d594fSAndroid Build Coastguard Worker   }
2242*795d594fSAndroid Build Coastguard Worker 
2243*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge7(int[], boolean, boolean) load_store_elimination (before)
2244*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2245*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2246*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2247*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2248*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2249*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2250*795d594fSAndroid Build Coastguard Worker 
2251*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge7(int[], boolean, boolean) load_store_elimination (after)
2252*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
2253*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
2254*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
2255*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2256*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2257*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2258*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2259*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Phi2:i\d+>>]
2260*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2>>        Phi [<<Arg3:i\d+>>,<<Arg4:i\d+>>]
2261*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Arg1:i\d+>>,<<Arg2:i\d+>>]
2262*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: set(["<<Arg1>>","<<Arg2>>"]) == set(["<<Const1>>","<<Const2>>"])
2263*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL: set(["<<Arg3>>","<<Arg4>>"]) == set(["<<Const0>>","<<Phi1>>"])
2264*795d594fSAndroid Build Coastguard Worker 
2265*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge7(int[], boolean, boolean) load_store_elimination (after)
2266*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
2267*795d594fSAndroid Build Coastguard Worker 
2268*795d594fSAndroid Build Coastguard Worker   // Test Phi creation for load elimination.
testLocalArrayMerge7(int[] a, boolean x, boolean y)2269*795d594fSAndroid Build Coastguard Worker   private static int testLocalArrayMerge7(int[] a, boolean x, boolean y) {
2270*795d594fSAndroid Build Coastguard Worker     a[1] = 0;
2271*795d594fSAndroid Build Coastguard Worker     if (x) {
2272*795d594fSAndroid Build Coastguard Worker       if (y) {
2273*795d594fSAndroid Build Coastguard Worker         a[0] = 1;
2274*795d594fSAndroid Build Coastguard Worker       } else {
2275*795d594fSAndroid Build Coastguard Worker         a[0] = 2;
2276*795d594fSAndroid Build Coastguard Worker       }
2277*795d594fSAndroid Build Coastguard Worker       a[1] = a[0];
2278*795d594fSAndroid Build Coastguard Worker     }
2279*795d594fSAndroid Build Coastguard Worker     return a[1];
2280*795d594fSAndroid Build Coastguard Worker   }
2281*795d594fSAndroid Build Coastguard Worker 
2282*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge8(boolean) load_store_elimination (before)
2283*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
2284*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2285*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2286*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2287*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2288*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2289*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2290*795d594fSAndroid Build Coastguard Worker 
2291*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLocalArrayMerge8(boolean) load_store_elimination (after)
2292*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewArray
2293*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArraySet
2294*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
2295*795d594fSAndroid Build Coastguard Worker 
2296*795d594fSAndroid Build Coastguard Worker   // Test Merging default value and an identical value.
testLocalArrayMerge8(boolean x)2297*795d594fSAndroid Build Coastguard Worker   private static int testLocalArrayMerge8(boolean x) {
2298*795d594fSAndroid Build Coastguard Worker     int[] a = new int[2];
2299*795d594fSAndroid Build Coastguard Worker     if (x) {
2300*795d594fSAndroid Build Coastguard Worker       a[0] = 1;  // Make sure the store below is not eliminated immediately as
2301*795d594fSAndroid Build Coastguard Worker                  // storing the same value already present in the heap location.
2302*795d594fSAndroid Build Coastguard Worker       a[0] = 0;  // Store the same value as default value to test merging with
2303*795d594fSAndroid Build Coastguard Worker                  // the default value from else-block.
2304*795d594fSAndroid Build Coastguard Worker     } else {
2305*795d594fSAndroid Build Coastguard Worker       // Do the same as then-block for a different heap location to avoid
2306*795d594fSAndroid Build Coastguard Worker       // relying on block ordering. (Test both `default+0` and `0+default`.)
2307*795d594fSAndroid Build Coastguard Worker       a[1] = 1;
2308*795d594fSAndroid Build Coastguard Worker       a[1] = 0;
2309*795d594fSAndroid Build Coastguard Worker     }
2310*795d594fSAndroid Build Coastguard Worker     return a[0] + a[1];
2311*795d594fSAndroid Build Coastguard Worker   }
2312*795d594fSAndroid Build Coastguard Worker 
2313*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$testThrowingArraySet(java.lang.Object[], java.lang.Object) load_store_elimination (before)
2314*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2315*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2316*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2317*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2318*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2319*795d594fSAndroid Build Coastguard Worker 
2320*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.$noinline$testThrowingArraySet(java.lang.Object[], java.lang.Object) load_store_elimination (after)
2321*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2322*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2323*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2324*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2325*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
$noinline$testThrowingArraySet(Object[] a, Object o)2326*795d594fSAndroid Build Coastguard Worker   private static void $noinline$testThrowingArraySet(Object[] a, Object o) {
2327*795d594fSAndroid Build Coastguard Worker     Object olda0 = a[0];
2328*795d594fSAndroid Build Coastguard Worker     a[0] = null;
2329*795d594fSAndroid Build Coastguard Worker     a[1] = olda0;
2330*795d594fSAndroid Build Coastguard Worker     a[0] = o;
2331*795d594fSAndroid Build Coastguard Worker     a[1] = null;
2332*795d594fSAndroid Build Coastguard Worker   }
2333*795d594fSAndroid Build Coastguard Worker 
2334*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop1(TestClass, int) load_store_elimination (before)
2335*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2336*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2337*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2338*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2339*795d594fSAndroid Build Coastguard Worker 
2340*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop1(TestClass, int) load_store_elimination (after)
2341*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2342*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2343*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2344*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2345*795d594fSAndroid Build Coastguard Worker 
2346*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop1(TestClass, int) load_store_elimination (after)
2347*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2348*795d594fSAndroid Build Coastguard Worker 
2349*795d594fSAndroid Build Coastguard Worker   // Test Phi creation for load elimination with loop.
testLoop1(TestClass obj, int n)2350*795d594fSAndroid Build Coastguard Worker   private static int testLoop1(TestClass obj, int n) {
2351*795d594fSAndroid Build Coastguard Worker     obj.i = 0;
2352*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2353*795d594fSAndroid Build Coastguard Worker       obj.i = i;
2354*795d594fSAndroid Build Coastguard Worker     }
2355*795d594fSAndroid Build Coastguard Worker     return obj.i;
2356*795d594fSAndroid Build Coastguard Worker   }
2357*795d594fSAndroid Build Coastguard Worker 
2358*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop2(TestClass, int) load_store_elimination (before)
2359*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2360*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2361*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2362*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2363*795d594fSAndroid Build Coastguard Worker 
2364*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop2(TestClass, int) load_store_elimination (after)
2365*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2366*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2367*795d594fSAndroid Build Coastguard Worker 
2368*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop2(TestClass, int) load_store_elimination (after)
2369*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2370*795d594fSAndroid Build Coastguard Worker 
2371*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop2(TestClass, int) load_store_elimination (after)
2372*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2373*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
2374*795d594fSAndroid Build Coastguard Worker 
2375*795d594fSAndroid Build Coastguard Worker   // Test that we do not create any Phis for load elimination when
2376*795d594fSAndroid Build Coastguard Worker   // the heap value was not modified in the loop.
testLoop2(TestClass obj, int n)2377*795d594fSAndroid Build Coastguard Worker   private static int testLoop2(TestClass obj, int n) {
2378*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
2379*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2380*795d594fSAndroid Build Coastguard Worker       obj.j = i;
2381*795d594fSAndroid Build Coastguard Worker     }
2382*795d594fSAndroid Build Coastguard Worker     return obj.i;
2383*795d594fSAndroid Build Coastguard Worker   }
2384*795d594fSAndroid Build Coastguard Worker 
2385*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop3(TestClass, int) load_store_elimination (before)
2386*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2387*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2388*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2389*795d594fSAndroid Build Coastguard Worker 
2390*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop3(TestClass, int) load_store_elimination (after)
2391*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldSet
2392*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldSet
2393*795d594fSAndroid Build Coastguard Worker 
2394*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop3(TestClass, int) load_store_elimination (after)
2395*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2396*795d594fSAndroid Build Coastguard Worker 
2397*795d594fSAndroid Build Coastguard Worker   // Test elimination of a store in the loop that stores the same value that was already
2398*795d594fSAndroid Build Coastguard Worker   // stored before the loop and eliminating the load of that value after the loop.
testLoop3(TestClass obj, int n)2399*795d594fSAndroid Build Coastguard Worker   private static int testLoop3(TestClass obj, int n) {
2400*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
2401*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2402*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
2403*795d594fSAndroid Build Coastguard Worker     }
2404*795d594fSAndroid Build Coastguard Worker     return obj.i;
2405*795d594fSAndroid Build Coastguard Worker   }
2406*795d594fSAndroid Build Coastguard Worker 
2407*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop4(TestClass, int) load_store_elimination (before)
2408*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2409*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2410*795d594fSAndroid Build Coastguard Worker 
2411*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop4(TestClass, int) load_store_elimination (after)
2412*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldSet
2413*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldSet
2414*795d594fSAndroid Build Coastguard Worker 
2415*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop4(TestClass, int) load_store_elimination (after)
2416*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2417*795d594fSAndroid Build Coastguard Worker 
2418*795d594fSAndroid Build Coastguard Worker   // Test store elimination in the loop that stores the same value that was already
2419*795d594fSAndroid Build Coastguard Worker   // stored before the loop, without any loads of that value.
testLoop4(TestClass obj, int n)2420*795d594fSAndroid Build Coastguard Worker   private static int testLoop4(TestClass obj, int n) {
2421*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
2422*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2423*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
2424*795d594fSAndroid Build Coastguard Worker     }
2425*795d594fSAndroid Build Coastguard Worker     return n;
2426*795d594fSAndroid Build Coastguard Worker   }
2427*795d594fSAndroid Build Coastguard Worker 
2428*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop5(TestClass, int) load_store_elimination (before)
2429*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2430*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2431*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2432*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2433*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2434*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2435*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2436*795d594fSAndroid Build Coastguard Worker 
2437*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop5(TestClass, int) load_store_elimination (after)
2438*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldSet
2439*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldSet
2440*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldSet
2441*795d594fSAndroid Build Coastguard Worker 
2442*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop5(TestClass, int) load_store_elimination (after)
2443*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2444*795d594fSAndroid Build Coastguard Worker 
2445*795d594fSAndroid Build Coastguard Worker   // Test eliminating loads and stores that just shuffle the same value between
2446*795d594fSAndroid Build Coastguard Worker   // different heap locations.
testLoop5(TestClass obj, int n)2447*795d594fSAndroid Build Coastguard Worker   private static int testLoop5(TestClass obj, int n) {
2448*795d594fSAndroid Build Coastguard Worker     // Initialize both `obj.i` and `obj.j` to the same value and then swap these values
2449*795d594fSAndroid Build Coastguard Worker     // in the loop. We should be able to determine that the values are always the same.
2450*795d594fSAndroid Build Coastguard Worker     obj.i = n;
2451*795d594fSAndroid Build Coastguard Worker     obj.j = n;
2452*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2453*795d594fSAndroid Build Coastguard Worker       if ((i & 1) != 0) {
2454*795d594fSAndroid Build Coastguard Worker         int tmp = obj.i;
2455*795d594fSAndroid Build Coastguard Worker         obj.i = obj.j;
2456*795d594fSAndroid Build Coastguard Worker         obj.j = tmp;
2457*795d594fSAndroid Build Coastguard Worker       }
2458*795d594fSAndroid Build Coastguard Worker     }
2459*795d594fSAndroid Build Coastguard Worker     return obj.i;
2460*795d594fSAndroid Build Coastguard Worker   }
2461*795d594fSAndroid Build Coastguard Worker 
2462*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop6(TestClass, int) load_store_elimination (before)
2463*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2464*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2465*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2466*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2467*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2468*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2469*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2470*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2471*795d594fSAndroid Build Coastguard Worker 
2472*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop6(TestClass, int) load_store_elimination (after)
2473*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldSet
2474*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldSet
2475*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldSet
2476*795d594fSAndroid Build Coastguard Worker 
2477*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop6(TestClass, int) load_store_elimination (after)
2478*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2479*795d594fSAndroid Build Coastguard Worker 
2480*795d594fSAndroid Build Coastguard Worker   // Test eliminating loads and stores that just shuffle the same value between
2481*795d594fSAndroid Build Coastguard Worker   // different heap locations, or store the same value.
testLoop6(TestClass obj, int n)2482*795d594fSAndroid Build Coastguard Worker   private static int testLoop6(TestClass obj, int n) {
2483*795d594fSAndroid Build Coastguard Worker     // Initialize both `obj.i` and `obj.j` to the same value and then swap these values
2484*795d594fSAndroid Build Coastguard Worker     // in the loop or set `obj.i` to the same value. We should be able to determine
2485*795d594fSAndroid Build Coastguard Worker     // that the values are always the same.
2486*795d594fSAndroid Build Coastguard Worker     obj.i = n;
2487*795d594fSAndroid Build Coastguard Worker     obj.j = n;
2488*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2489*795d594fSAndroid Build Coastguard Worker       if ((i & 1) != 0) {
2490*795d594fSAndroid Build Coastguard Worker         int tmp = obj.i;
2491*795d594fSAndroid Build Coastguard Worker         obj.i = obj.j;
2492*795d594fSAndroid Build Coastguard Worker         obj.j = tmp;
2493*795d594fSAndroid Build Coastguard Worker       } else {
2494*795d594fSAndroid Build Coastguard Worker         obj.i = n;
2495*795d594fSAndroid Build Coastguard Worker       }
2496*795d594fSAndroid Build Coastguard Worker     }
2497*795d594fSAndroid Build Coastguard Worker     return obj.i;
2498*795d594fSAndroid Build Coastguard Worker   }
2499*795d594fSAndroid Build Coastguard Worker 
2500*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop7(int) load_store_elimination (before)
2501*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewInstance
2502*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2503*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2504*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2505*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2506*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2507*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2508*795d594fSAndroid Build Coastguard Worker 
2509*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop7(int) load_store_elimination (after)
2510*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewInstance
2511*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldSet
2512*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2513*795d594fSAndroid Build Coastguard Worker 
2514*795d594fSAndroid Build Coastguard Worker   // Test eliminating loads and stores that just shuffle the default value between
2515*795d594fSAndroid Build Coastguard Worker   // different heap locations, or store the same value.
testLoop7(int n)2516*795d594fSAndroid Build Coastguard Worker   private static int testLoop7(int n) {
2517*795d594fSAndroid Build Coastguard Worker     // Leave both `obj.i` and `obj.j` initialized to the default value and then
2518*795d594fSAndroid Build Coastguard Worker     // swap these values in the loop or set some to the identical value 0.
2519*795d594fSAndroid Build Coastguard Worker     // We should be able to determine that the values are always the same.
2520*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
2521*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2522*795d594fSAndroid Build Coastguard Worker       if ((i & 1) != 0) {
2523*795d594fSAndroid Build Coastguard Worker         int tmp = obj.i;
2524*795d594fSAndroid Build Coastguard Worker         obj.i = obj.j;
2525*795d594fSAndroid Build Coastguard Worker         obj.j = tmp;
2526*795d594fSAndroid Build Coastguard Worker       } else {
2527*795d594fSAndroid Build Coastguard Worker         obj.i = 0;
2528*795d594fSAndroid Build Coastguard Worker       }
2529*795d594fSAndroid Build Coastguard Worker     }
2530*795d594fSAndroid Build Coastguard Worker     return obj.i;
2531*795d594fSAndroid Build Coastguard Worker   }
2532*795d594fSAndroid Build Coastguard Worker 
2533*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop8(int) load_store_elimination (before)
2534*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewInstance
2535*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2536*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2537*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2538*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2539*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2540*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2541*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2542*795d594fSAndroid Build Coastguard Worker 
2543*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop8(int) load_store_elimination (after)
2544*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewInstance
2545*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldSet
2546*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2547*795d594fSAndroid Build Coastguard Worker 
2548*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop8(int) load_store_elimination (after)
2549*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2550*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2551*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
2552*795d594fSAndroid Build Coastguard Worker 
2553*795d594fSAndroid Build Coastguard Worker   // Test eliminating loads and stores that just shuffle the same value between
2554*795d594fSAndroid Build Coastguard Worker   // different heap locations, or store the same value. The value is loaded
2555*795d594fSAndroid Build Coastguard Worker   // after conditionally setting a different value after the loop to test that
2556*795d594fSAndroid Build Coastguard Worker   // this does not cause creation of excessive Phis.
testLoop8(int n)2557*795d594fSAndroid Build Coastguard Worker   private static int testLoop8(int n) {
2558*795d594fSAndroid Build Coastguard Worker     // Leave both `obj.i` and `obj.j` initialized to the default value and then
2559*795d594fSAndroid Build Coastguard Worker     // swap these values in the loop or set some to the identical value 0.
2560*795d594fSAndroid Build Coastguard Worker     // We should be able to determine that the values are always the same.
2561*795d594fSAndroid Build Coastguard Worker     TestClass obj = new TestClass();
2562*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2563*795d594fSAndroid Build Coastguard Worker       if ((i & 1) != 0) {
2564*795d594fSAndroid Build Coastguard Worker         int tmp = obj.i;
2565*795d594fSAndroid Build Coastguard Worker         obj.i = obj.j;
2566*795d594fSAndroid Build Coastguard Worker         obj.j = tmp;
2567*795d594fSAndroid Build Coastguard Worker       } else {
2568*795d594fSAndroid Build Coastguard Worker         obj.i = 0;
2569*795d594fSAndroid Build Coastguard Worker       }
2570*795d594fSAndroid Build Coastguard Worker     }
2571*795d594fSAndroid Build Coastguard Worker     // Up to this point, `obj.i` is always 0 but the Phi placeholder below
2572*795d594fSAndroid Build Coastguard Worker     // must not be included in that determination despite using lazy search
2573*795d594fSAndroid Build Coastguard Worker     // for Phi placeholders triggered by the `obj.i` load below.
2574*795d594fSAndroid Build Coastguard Worker     if ((n & 1) == 0) {
2575*795d594fSAndroid Build Coastguard Worker       obj.i = 1;
2576*795d594fSAndroid Build Coastguard Worker     }
2577*795d594fSAndroid Build Coastguard Worker     return obj.i;
2578*795d594fSAndroid Build Coastguard Worker   }
2579*795d594fSAndroid Build Coastguard Worker 
2580*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop9(TestClass, int) load_store_elimination (before)
2581*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewInstance
2582*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2583*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2584*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2585*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2586*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2587*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2588*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2589*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InvokeStaticOrDirect
2590*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2591*795d594fSAndroid Build Coastguard Worker 
2592*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop9(TestClass, int) load_store_elimination (after)
2593*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2594*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2595*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2596*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2597*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2598*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2599*795d594fSAndroid Build Coastguard Worker 
2600*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop9(TestClass, int) load_store_elimination (after)
2601*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldSet
2602*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldSet
2603*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldSet
2604*795d594fSAndroid Build Coastguard Worker 
2605*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop9(TestClass, int) load_store_elimination (after)
2606*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewInstance
2607*795d594fSAndroid Build Coastguard Worker 
2608*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop9(TestClass, int) load_store_elimination (after)
2609*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldGet
2610*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2611*795d594fSAndroid Build Coastguard Worker 
2612*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop9(TestClass, int) load_store_elimination (after)
2613*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2614*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2615*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2616*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
2617*795d594fSAndroid Build Coastguard Worker 
2618*795d594fSAndroid Build Coastguard Worker   // Test that unknown value flowing through a loop back-edge prevents
2619*795d594fSAndroid Build Coastguard Worker   // elimination of a load but that load can be used as an input to a Phi
2620*795d594fSAndroid Build Coastguard Worker   // created to eliminate another load.
testLoop9(TestClass obj, int n)2621*795d594fSAndroid Build Coastguard Worker   private static int testLoop9(TestClass obj, int n) {
2622*795d594fSAndroid Build Coastguard Worker     TestClass obj0 = new TestClass();
2623*795d594fSAndroid Build Coastguard Worker     // Initialize both `obj.i` and `obj0.i` to the same value and then swap these values
2624*795d594fSAndroid Build Coastguard Worker     // in the loop or clobber `obj.i`. We should determine that the `obj.i` load in the
2625*795d594fSAndroid Build Coastguard Worker     // loop must be kept but the `obj0.i` load can be replaced by a Phi chain.
2626*795d594fSAndroid Build Coastguard Worker     obj0.i = n;
2627*795d594fSAndroid Build Coastguard Worker     obj.i = n;
2628*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2629*795d594fSAndroid Build Coastguard Worker       if ((i & 1) != 0) {
2630*795d594fSAndroid Build Coastguard Worker         int tmp = obj0.i;
2631*795d594fSAndroid Build Coastguard Worker         obj0.i = obj.i;  // Load cannot be eliminated.
2632*795d594fSAndroid Build Coastguard Worker         obj.i = tmp;
2633*795d594fSAndroid Build Coastguard Worker       } else {
2634*795d594fSAndroid Build Coastguard Worker         $noinline$clobberObservables();  // Makes obj.i unknown.
2635*795d594fSAndroid Build Coastguard Worker       }
2636*795d594fSAndroid Build Coastguard Worker     }
2637*795d594fSAndroid Build Coastguard Worker     return obj0.i;
2638*795d594fSAndroid Build Coastguard Worker   }
2639*795d594fSAndroid Build Coastguard Worker 
2640*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop10(TestClass, int) load_store_elimination (before)
2641*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2642*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2643*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2644*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2645*795d594fSAndroid Build Coastguard Worker 
2646*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop10(TestClass, int) load_store_elimination (after)
2647*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2648*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2649*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2650*795d594fSAndroid Build Coastguard Worker 
2651*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop10(TestClass, int) load_store_elimination (after)
2652*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldGet
2653*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2654*795d594fSAndroid Build Coastguard Worker 
2655*795d594fSAndroid Build Coastguard Worker   // Test load elimination after finding a non-eliminated load depending
2656*795d594fSAndroid Build Coastguard Worker   // on loop Phi placeholder.
testLoop10(TestClass obj, int n)2657*795d594fSAndroid Build Coastguard Worker   private static int testLoop10(TestClass obj, int n) {
2658*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
2659*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2660*795d594fSAndroid Build Coastguard Worker       $noinline$clobberObservables();
2661*795d594fSAndroid Build Coastguard Worker     }
2662*795d594fSAndroid Build Coastguard Worker     int i1 = obj.i;
2663*795d594fSAndroid Build Coastguard Worker     obj.j = 2;  // Use write side effects to stop GVN from eliminating the load below.
2664*795d594fSAndroid Build Coastguard Worker     int i2 = obj.i;
2665*795d594fSAndroid Build Coastguard Worker     return i1 + i2;
2666*795d594fSAndroid Build Coastguard Worker   }
2667*795d594fSAndroid Build Coastguard Worker 
2668*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop11(TestClass, int) load_store_elimination (before)
2669*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2670*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2671*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2672*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2673*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2674*795d594fSAndroid Build Coastguard Worker 
2675*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop11(TestClass, int) load_store_elimination (after)
2676*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2677*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2678*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2679*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2680*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2681*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2682*795d594fSAndroid Build Coastguard Worker 
2683*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop11(TestClass, int) load_store_elimination (after)
2684*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2685*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2686*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2687*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
2688*795d594fSAndroid Build Coastguard Worker 
2689*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop11(TestClass, int) load_store_elimination (after)
2690*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2691*795d594fSAndroid Build Coastguard Worker 
2692*795d594fSAndroid Build Coastguard Worker   // Test load elimination creating two Phis that depend on each other.
testLoop11(TestClass obj, int n)2693*795d594fSAndroid Build Coastguard Worker   private static int testLoop11(TestClass obj, int n) {
2694*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
2695*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2696*795d594fSAndroid Build Coastguard Worker       if ((i & 1) != 0) {
2697*795d594fSAndroid Build Coastguard Worker         obj.i = 2;
2698*795d594fSAndroid Build Coastguard Worker       } else {
2699*795d594fSAndroid Build Coastguard Worker         obj.i = 3;
2700*795d594fSAndroid Build Coastguard Worker       }
2701*795d594fSAndroid Build Coastguard Worker       // There shall be a Phi created here for `obj.i` before the "++i".
2702*795d594fSAndroid Build Coastguard Worker       // This Phi and the loop Phi that shall be created for `obj.i` depend on each other.
2703*795d594fSAndroid Build Coastguard Worker     }
2704*795d594fSAndroid Build Coastguard Worker     return obj.i;
2705*795d594fSAndroid Build Coastguard Worker   }
2706*795d594fSAndroid Build Coastguard Worker 
2707*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop12(TestClass, int) load_store_elimination (before)
2708*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2709*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2710*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2711*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2712*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2713*795d594fSAndroid Build Coastguard Worker 
2714*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop12(TestClass, int) load_store_elimination (after)
2715*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2716*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2717*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2718*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2719*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
2720*795d594fSAndroid Build Coastguard Worker 
2721*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop12(TestClass, int) load_store_elimination (after)
2722*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2723*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2724*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
2725*795d594fSAndroid Build Coastguard Worker 
2726*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop12(TestClass, int) load_store_elimination (after)
2727*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
2728*795d594fSAndroid Build Coastguard Worker 
2729*795d594fSAndroid Build Coastguard Worker   // Test load elimination creating a single Phi with more than 2 inputs.
testLoop12(TestClass obj, int n)2730*795d594fSAndroid Build Coastguard Worker   private static int testLoop12(TestClass obj, int n) {
2731*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
2732*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ) {
2733*795d594fSAndroid Build Coastguard Worker       // Do the loop variable increment first, so that there are back-edges
2734*795d594fSAndroid Build Coastguard Worker       // directly from the "then" and "else" blocks below.
2735*795d594fSAndroid Build Coastguard Worker       ++i;
2736*795d594fSAndroid Build Coastguard Worker       if ((i & 1) != 0) {
2737*795d594fSAndroid Build Coastguard Worker         obj.i = 2;
2738*795d594fSAndroid Build Coastguard Worker       } else {
2739*795d594fSAndroid Build Coastguard Worker         obj.i = 3;
2740*795d594fSAndroid Build Coastguard Worker       }
2741*795d594fSAndroid Build Coastguard Worker     }
2742*795d594fSAndroid Build Coastguard Worker     return obj.i;
2743*795d594fSAndroid Build Coastguard Worker   }
2744*795d594fSAndroid Build Coastguard Worker 
2745*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop13(TestClass, int) load_store_elimination (before)
2746*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
2747*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2748*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2749*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2750*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2751*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2752*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2753*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2754*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2755*795d594fSAndroid Build Coastguard Worker 
2756*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop13(TestClass, int) load_store_elimination (after)
2757*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2758*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2759*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2760*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2761*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
2762*795d594fSAndroid Build Coastguard Worker 
2763*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop13(TestClass, int) load_store_elimination (after)
2764*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewArray
2765*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
2766*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArraySet
2767*795d594fSAndroid Build Coastguard Worker 
2768*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop13(TestClass, int) load_store_elimination (after)
2769*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2770*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2771*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2772*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2773*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
2774*795d594fSAndroid Build Coastguard Worker 
2775*795d594fSAndroid Build Coastguard Worker   // Test eliminating array allocation, loads and stores and creating loop Phis.
testLoop13(TestClass obj, int n)2776*795d594fSAndroid Build Coastguard Worker   private static int testLoop13(TestClass obj, int n) {
2777*795d594fSAndroid Build Coastguard Worker     int[] a = new int[3];
2778*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2779*795d594fSAndroid Build Coastguard Worker       a[0] = a[1];
2780*795d594fSAndroid Build Coastguard Worker       a[1] = a[2];
2781*795d594fSAndroid Build Coastguard Worker       a[2] = obj.i;
2782*795d594fSAndroid Build Coastguard Worker     }
2783*795d594fSAndroid Build Coastguard Worker     return a[0];
2784*795d594fSAndroid Build Coastguard Worker   }
2785*795d594fSAndroid Build Coastguard Worker 
2786*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop14(TestClass2, int) load_store_elimination (before)
2787*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
2788*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet field_name:TestClass2.i
2789*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2790*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2791*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2792*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2793*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2794*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet field_name:TestClass2.i
2795*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet field_name:TestClass2.j
2796*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet field_name:TestClass2.i
2797*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
2798*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet field_name:TestClass2.k
2799*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet field_name:TestClass2.j
2800*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet field_name:TestClass2.i
2801*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet field_name:TestClass2.k
2802*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2803*795d594fSAndroid Build Coastguard Worker 
2804*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop14(TestClass2, int) load_store_elimination (after)
2805*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet field_name:TestClass2.i
2806*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2807*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2808*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2809*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
2810*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet field_name:TestClass2.i
2811*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet field_name:TestClass2.j
2812*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet field_name:TestClass2.k
2813*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet field_name:TestClass2.j
2814*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet field_name:TestClass2.k
2815*795d594fSAndroid Build Coastguard Worker 
2816*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop14(TestClass2, int) load_store_elimination (after)
2817*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewArray
2818*795d594fSAndroid Build Coastguard Worker 
2819*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop14(TestClass2, int) load_store_elimination (after)
2820*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldGet field_name:TestClass2.i
2821*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet field_name:TestClass2.i
2822*795d594fSAndroid Build Coastguard Worker 
2823*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop14(TestClass2, int) load_store_elimination (after)
2824*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2825*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2826*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2827*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
2828*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
2829*795d594fSAndroid Build Coastguard Worker 
2830*795d594fSAndroid Build Coastguard Worker   // Test load elimination in a loop after determing that the first field load
2831*795d594fSAndroid Build Coastguard Worker   // (depending on loop Phi placeholder) cannot be eliminated.
testLoop14(TestClass2 obj, int n)2832*795d594fSAndroid Build Coastguard Worker   private static int testLoop14(TestClass2 obj, int n) {
2833*795d594fSAndroid Build Coastguard Worker     int[] a = new int[3];
2834*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
2835*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2836*795d594fSAndroid Build Coastguard Worker       a[0] = a[1];
2837*795d594fSAndroid Build Coastguard Worker       a[1] = a[2];
2838*795d594fSAndroid Build Coastguard Worker       int i1 = obj.i;
2839*795d594fSAndroid Build Coastguard Worker       obj.j = 2;  // Use write side effects to stop GVN from eliminating the load below.
2840*795d594fSAndroid Build Coastguard Worker       int i2 = obj.i;
2841*795d594fSAndroid Build Coastguard Worker       a[2] = i1;
2842*795d594fSAndroid Build Coastguard Worker       if ((i & 2) != 0) {
2843*795d594fSAndroid Build Coastguard Worker         obj.k = i2;
2844*795d594fSAndroid Build Coastguard Worker       } else {
2845*795d594fSAndroid Build Coastguard Worker         obj.j = 3;  // Use write side effects to stop GVN from eliminating the load below.
2846*795d594fSAndroid Build Coastguard Worker         obj.k = obj.i;
2847*795d594fSAndroid Build Coastguard Worker         $noinline$clobberObservables();  // Make obj.i unknown.
2848*795d594fSAndroid Build Coastguard Worker       }
2849*795d594fSAndroid Build Coastguard Worker     }
2850*795d594fSAndroid Build Coastguard Worker     return a[0];
2851*795d594fSAndroid Build Coastguard Worker   }
2852*795d594fSAndroid Build Coastguard Worker 
2853*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop15(int) load_store_elimination (before)
2854*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
2855*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
2856*795d594fSAndroid Build Coastguard Worker   //
2857*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecPredWhile
2858*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecStore
2859*795d594fSAndroid Build Coastguard Worker   //
2860*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
2861*795d594fSAndroid Build Coastguard Worker   //
2862*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 ArraySet
2863*795d594fSAndroid Build Coastguard Worker   //
2864*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
2865*795d594fSAndroid Build Coastguard Worker   //
2866*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2867*795d594fSAndroid Build Coastguard Worker 
2868*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop15(int) load_store_elimination (after)
2869*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
2870*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
2871*795d594fSAndroid Build Coastguard Worker   //
2872*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecPredWhile
2873*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 VecStore
2874*795d594fSAndroid Build Coastguard Worker   //
2875*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
2876*795d594fSAndroid Build Coastguard Worker   //
2877*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 ArraySet
2878*795d594fSAndroid Build Coastguard Worker   //
2879*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
2880*795d594fSAndroid Build Coastguard Worker   //
2881*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
2882*795d594fSAndroid Build Coastguard Worker   // Test that aliasing array store in the loop is not eliminated
2883*795d594fSAndroid Build Coastguard Worker   // when a loop Phi placeholder is marked for keeping.
testLoop15(int n)2884*795d594fSAndroid Build Coastguard Worker   private static int testLoop15(int n) {
2885*795d594fSAndroid Build Coastguard Worker     int[] a = new int[n + 1];
2886*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2887*795d594fSAndroid Build Coastguard Worker       a[i] = 1;  // Cannot be eliminated due to aliasing.
2888*795d594fSAndroid Build Coastguard Worker     }
2889*795d594fSAndroid Build Coastguard Worker     return a[0];
2890*795d594fSAndroid Build Coastguard Worker   }
2891*795d594fSAndroid Build Coastguard Worker 
2892*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop16(TestClass, int) load_store_elimination (before)
2893*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2894*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
2895*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2896*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
2897*795d594fSAndroid Build Coastguard Worker 
2898*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop16(TestClass, int) load_store_elimination (after)
2899*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2900*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
2901*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2902*795d594fSAndroid Build Coastguard Worker 
2903*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop16(TestClass, int) load_store_elimination (after)
2904*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
2905*795d594fSAndroid Build Coastguard Worker 
2906*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop16(TestClass, int) load_store_elimination (after)
2907*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
2908*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
2909*795d594fSAndroid Build Coastguard Worker 
2910*795d594fSAndroid Build Coastguard Worker   // Test that we match an existing loop Phi for eliminating a load.
testLoop16(TestClass obj, int n)2911*795d594fSAndroid Build Coastguard Worker   static int testLoop16(TestClass obj, int n) {
2912*795d594fSAndroid Build Coastguard Worker     obj.i = 0;
2913*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ) {
2914*795d594fSAndroid Build Coastguard Worker       ++i;
2915*795d594fSAndroid Build Coastguard Worker       obj.i = i;
2916*795d594fSAndroid Build Coastguard Worker     }
2917*795d594fSAndroid Build Coastguard Worker     // The load is replaced by the existing Phi instead of constructing a new one.
2918*795d594fSAndroid Build Coastguard Worker     return obj.i;
2919*795d594fSAndroid Build Coastguard Worker   }
2920*795d594fSAndroid Build Coastguard Worker 
2921*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop17(TestClass, int) load_store_elimination (before)
2922*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2923*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
2924*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2925*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2926*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
2927*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
2928*795d594fSAndroid Build Coastguard Worker 
2929*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop17(TestClass, int) load_store_elimination (after)
2930*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2931*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
2932*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2933*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2934*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
2935*795d594fSAndroid Build Coastguard Worker 
2936*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop17(TestClass, int) load_store_elimination (after)
2937*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
2938*795d594fSAndroid Build Coastguard Worker 
2939*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop17(TestClass, int) load_store_elimination (after)
2940*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
2941*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
2942*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
2943*795d594fSAndroid Build Coastguard Worker 
2944*795d594fSAndroid Build Coastguard Worker   // Test that we match an existing non-loop Phi for eliminating a load,
2945*795d594fSAndroid Build Coastguard Worker   // one input of the Phi being invariant across a preceding loop.
testLoop17(TestClass obj, int n)2946*795d594fSAndroid Build Coastguard Worker   static int testLoop17(TestClass obj, int n) {
2947*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
2948*795d594fSAndroid Build Coastguard Worker     int phi = 1;
2949*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2950*795d594fSAndroid Build Coastguard Worker       obj.j = 2;  // Unrelated.
2951*795d594fSAndroid Build Coastguard Worker     }
2952*795d594fSAndroid Build Coastguard Worker     if ((n & 1) != 0) {
2953*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
2954*795d594fSAndroid Build Coastguard Worker       phi = 2;
2955*795d594fSAndroid Build Coastguard Worker     }
2956*795d594fSAndroid Build Coastguard Worker     // The load is replaced by the existing Phi instead of constructing a new one.
2957*795d594fSAndroid Build Coastguard Worker     return obj.i + phi;
2958*795d594fSAndroid Build Coastguard Worker   }
2959*795d594fSAndroid Build Coastguard Worker 
2960*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop18(TestClass, int) load_store_elimination (before)
2961*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewArray
2962*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
2963*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     ArrayGet
2964*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2965*795d594fSAndroid Build Coastguard Worker 
2966*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop18(TestClass, int) load_store_elimination (after)
2967*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewArray
2968*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
2969*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2970*795d594fSAndroid Build Coastguard Worker 
2971*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop18(TestClass, int) load_store_elimination (after)
2972*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     ArrayGet
2973*795d594fSAndroid Build Coastguard Worker 
2974*795d594fSAndroid Build Coastguard Worker   // Test eliminating a load of the default value in a loop
2975*795d594fSAndroid Build Coastguard Worker   // with the array index being defined inside the loop.
testLoop18(TestClass obj, int n)2976*795d594fSAndroid Build Coastguard Worker   static int testLoop18(TestClass obj, int n) {
2977*795d594fSAndroid Build Coastguard Worker     // The NewArray is kept as it may throw for negative n.
2978*795d594fSAndroid Build Coastguard Worker     // TODO: Eliminate constructor fence even though the NewArray is kept.
2979*795d594fSAndroid Build Coastguard Worker     int[] a0 = new int[n];
2980*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
2981*795d594fSAndroid Build Coastguard Worker       obj.i = a0[i];
2982*795d594fSAndroid Build Coastguard Worker     }
2983*795d594fSAndroid Build Coastguard Worker     return n;
2984*795d594fSAndroid Build Coastguard Worker   }
2985*795d594fSAndroid Build Coastguard Worker 
2986*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop19(TestClass, int) load_store_elimination (before)
2987*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewArray
2988*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
2989*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     ArrayGet
2990*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2991*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     ArraySet
2992*795d594fSAndroid Build Coastguard Worker 
2993*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop19(TestClass, int) load_store_elimination (after)
2994*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewArray
2995*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
2996*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
2997*795d594fSAndroid Build Coastguard Worker 
2998*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop19(TestClass, int) load_store_elimination (after)
2999*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     ArrayGet
3000*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     ArraySet
3001*795d594fSAndroid Build Coastguard Worker 
3002*795d594fSAndroid Build Coastguard Worker   // Test eliminating a load of the default value and store of an identical value
3003*795d594fSAndroid Build Coastguard Worker   // in a loop with the array index being defined inside the loop.
testLoop19(TestClass obj, int n)3004*795d594fSAndroid Build Coastguard Worker   static int testLoop19(TestClass obj, int n) {
3005*795d594fSAndroid Build Coastguard Worker     // The NewArray is kept as it may throw for negative n.
3006*795d594fSAndroid Build Coastguard Worker     // TODO: Eliminate constructor fence even though the NewArray is kept.
3007*795d594fSAndroid Build Coastguard Worker     int[] a0 = new int[n];
3008*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3009*795d594fSAndroid Build Coastguard Worker       obj.i = a0[i];
3010*795d594fSAndroid Build Coastguard Worker       a0[i] = 0;  // Store the same value as default.
3011*795d594fSAndroid Build Coastguard Worker     }
3012*795d594fSAndroid Build Coastguard Worker     return n;
3013*795d594fSAndroid Build Coastguard Worker   }
3014*795d594fSAndroid Build Coastguard Worker 
3015*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop20(TestClass, int) load_store_elimination (before)
3016*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewArray
3017*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3018*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     ArrayGet
3019*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3020*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     ArraySet
3021*795d594fSAndroid Build Coastguard Worker 
3022*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop20(TestClass, int) load_store_elimination (after)
3023*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewArray
3024*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3025*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3026*795d594fSAndroid Build Coastguard Worker 
3027*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop20(TestClass, int) load_store_elimination (after)
3028*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     ArrayGet
3029*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     ArraySet
3030*795d594fSAndroid Build Coastguard Worker 
3031*795d594fSAndroid Build Coastguard Worker   // Test eliminating a load of the default value and a conditional store of an
3032*795d594fSAndroid Build Coastguard Worker   // identical value in a loop with the array index being defined inside the loop.
testLoop20(TestClass obj, int n)3033*795d594fSAndroid Build Coastguard Worker   static int testLoop20(TestClass obj, int n) {
3034*795d594fSAndroid Build Coastguard Worker     // The NewArray is kept as it may throw for negative n.
3035*795d594fSAndroid Build Coastguard Worker     // TODO: Eliminate constructor fence even though the NewArray is kept.
3036*795d594fSAndroid Build Coastguard Worker     int[] a0 = new int[n];
3037*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3038*795d594fSAndroid Build Coastguard Worker       obj.i = a0[i];
3039*795d594fSAndroid Build Coastguard Worker       if ((i & 1) != 0) {
3040*795d594fSAndroid Build Coastguard Worker         a0[i] = 0;  // Store the same value as default.
3041*795d594fSAndroid Build Coastguard Worker       }
3042*795d594fSAndroid Build Coastguard Worker     }
3043*795d594fSAndroid Build Coastguard Worker     return n;
3044*795d594fSAndroid Build Coastguard Worker   }
3045*795d594fSAndroid Build Coastguard Worker 
3046*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop21(TestClass, int) load_store_elimination (before)
3047*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3048*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3049*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3050*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3051*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3052*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3053*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3054*795d594fSAndroid Build Coastguard Worker 
3055*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop21(TestClass, int) load_store_elimination (before)
3056*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
3057*795d594fSAndroid Build Coastguard Worker 
3058*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop21(TestClass, int) load_store_elimination (after)
3059*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
3060*795d594fSAndroid Build Coastguard Worker 
3061*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop21(TestClass, int) load_store_elimination (after)
3062*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3063*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3064*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3065*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldSet
3066*795d594fSAndroid Build Coastguard Worker 
3067*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop21(TestClass, int) load_store_elimination (after)
3068*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
3069*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
3070*795d594fSAndroid Build Coastguard Worker 
3071*795d594fSAndroid Build Coastguard Worker   // Test load elimination when an instance field is used as the loop variable.
testLoop21(TestClass obj, int n)3072*795d594fSAndroid Build Coastguard Worker   static int testLoop21(TestClass obj, int n) {
3073*795d594fSAndroid Build Coastguard Worker     for (obj.i = 0; obj.i < n; ++obj.i) {
3074*795d594fSAndroid Build Coastguard Worker       obj.j = 0;  // Use write side effects to stop GVN from eliminating the load below.
3075*795d594fSAndroid Build Coastguard Worker       obj.j = obj.i;
3076*795d594fSAndroid Build Coastguard Worker     }
3077*795d594fSAndroid Build Coastguard Worker     return n;
3078*795d594fSAndroid Build Coastguard Worker   }
3079*795d594fSAndroid Build Coastguard Worker 
3080*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop22(TestClass, int) load_store_elimination (before)
3081*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3082*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3083*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3084*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3085*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3086*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3087*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3088*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3089*795d594fSAndroid Build Coastguard Worker 
3090*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop22(TestClass, int) load_store_elimination (before)
3091*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
3092*795d594fSAndroid Build Coastguard Worker 
3093*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop22(TestClass, int) load_store_elimination (after)
3094*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
3095*795d594fSAndroid Build Coastguard Worker 
3096*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop22(TestClass, int) load_store_elimination (after)
3097*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3098*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3099*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldSet
3100*795d594fSAndroid Build Coastguard Worker 
3101*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop22(TestClass, int) load_store_elimination (after)
3102*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         Phi
3103*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     Phi
3104*795d594fSAndroid Build Coastguard Worker 
3105*795d594fSAndroid Build Coastguard Worker   // Test load and store elimination when an instance field is used as the loop
3106*795d594fSAndroid Build Coastguard Worker   // variable and then overwritten after the loop.
testLoop22(TestClass obj, int n)3107*795d594fSAndroid Build Coastguard Worker   static int testLoop22(TestClass obj, int n) {
3108*795d594fSAndroid Build Coastguard Worker     for (obj.i = 0; obj.i < n; ++obj.i) {
3109*795d594fSAndroid Build Coastguard Worker       obj.j = 0;  // Use write side effects to stop GVN from eliminating the load below.
3110*795d594fSAndroid Build Coastguard Worker       obj.j = obj.i;
3111*795d594fSAndroid Build Coastguard Worker     }
3112*795d594fSAndroid Build Coastguard Worker     obj.i = 0;
3113*795d594fSAndroid Build Coastguard Worker     return n;
3114*795d594fSAndroid Build Coastguard Worker   }
3115*795d594fSAndroid Build Coastguard Worker 
3116*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop23(TestClass, int) load_store_elimination (before)
3117*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3118*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3119*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3120*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3121*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3122*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3123*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3124*795d594fSAndroid Build Coastguard Worker 
3125*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop23(TestClass, int) load_store_elimination (after)
3126*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3127*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3128*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3129*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3130*795d594fSAndroid Build Coastguard Worker 
3131*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop23(TestClass, int) load_store_elimination (after)
3132*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3133*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldSet
3134*795d594fSAndroid Build Coastguard Worker 
3135*795d594fSAndroid Build Coastguard Worker   // Test elimination of non-observable stores.
testLoop23(TestClass obj, int n)3136*795d594fSAndroid Build Coastguard Worker   static int testLoop23(TestClass obj, int n) {
3137*795d594fSAndroid Build Coastguard Worker     obj.i = -1;
3138*795d594fSAndroid Build Coastguard Worker     int phi = -1;
3139*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3140*795d594fSAndroid Build Coastguard Worker       obj.i = i;
3141*795d594fSAndroid Build Coastguard Worker       phi = i;
3142*795d594fSAndroid Build Coastguard Worker     }
3143*795d594fSAndroid Build Coastguard Worker     if ((n & 1) != 0) {
3144*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
3145*795d594fSAndroid Build Coastguard Worker       phi = 2;
3146*795d594fSAndroid Build Coastguard Worker     }
3147*795d594fSAndroid Build Coastguard Worker     obj.i = phi;  // This store shall be kept, the stores above shall be eliminated.
3148*795d594fSAndroid Build Coastguard Worker     return phi;
3149*795d594fSAndroid Build Coastguard Worker   }
3150*795d594fSAndroid Build Coastguard Worker 
3151*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop24(TestClass, int) load_store_elimination (before)
3152*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3153*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3154*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3155*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3156*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3157*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3158*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3159*795d594fSAndroid Build Coastguard Worker 
3160*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop24(TestClass, int) load_store_elimination (after)
3161*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3162*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3163*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3164*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3165*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3166*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3167*795d594fSAndroid Build Coastguard Worker 
3168*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop24(TestClass, int) load_store_elimination (after)
3169*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3170*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3171*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3172*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldSet
3173*795d594fSAndroid Build Coastguard Worker 
3174*795d594fSAndroid Build Coastguard Worker   // Test matching Phis for store elimination.
testLoop24(TestClass obj, int n)3175*795d594fSAndroid Build Coastguard Worker   static int testLoop24(TestClass obj, int n) {
3176*795d594fSAndroid Build Coastguard Worker     obj.i = -1;
3177*795d594fSAndroid Build Coastguard Worker     int phi = -1;
3178*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3179*795d594fSAndroid Build Coastguard Worker       obj.i = i;
3180*795d594fSAndroid Build Coastguard Worker       phi = i;
3181*795d594fSAndroid Build Coastguard Worker     }
3182*795d594fSAndroid Build Coastguard Worker     if ((n & 1) != 0) {
3183*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
3184*795d594fSAndroid Build Coastguard Worker       phi = 2;
3185*795d594fSAndroid Build Coastguard Worker     }
3186*795d594fSAndroid Build Coastguard Worker     if (n == 3) {
3187*795d594fSAndroid Build Coastguard Worker       return -2;  // Make the above stores observable.
3188*795d594fSAndroid Build Coastguard Worker     }
3189*795d594fSAndroid Build Coastguard Worker     // As the stores above are observable and kept, we match the merged
3190*795d594fSAndroid Build Coastguard Worker     // heap value with existing Phis and determine that we're storing
3191*795d594fSAndroid Build Coastguard Worker     // the same value that's already there, so we eliminate this store.
3192*795d594fSAndroid Build Coastguard Worker     obj.i = phi;
3193*795d594fSAndroid Build Coastguard Worker     return phi;
3194*795d594fSAndroid Build Coastguard Worker   }
3195*795d594fSAndroid Build Coastguard Worker 
3196*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop25(TestClass, int) load_store_elimination (before)
3197*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3198*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3199*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3200*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3201*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3202*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3203*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3204*795d594fSAndroid Build Coastguard Worker 
3205*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop25(TestClass, int) load_store_elimination (after)
3206*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3207*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3208*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3209*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3210*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3211*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3212*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3213*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3214*795d594fSAndroid Build Coastguard Worker 
3215*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop25(TestClass, int) load_store_elimination (after)
3216*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
3217*795d594fSAndroid Build Coastguard Worker 
3218*795d594fSAndroid Build Coastguard Worker   // Test that we do not match multiple dependent Phis for load and store elimination.
testLoop25(TestClass obj, int n)3219*795d594fSAndroid Build Coastguard Worker   static int testLoop25(TestClass obj, int n) {
3220*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
3221*795d594fSAndroid Build Coastguard Worker     int phi = 1;
3222*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3223*795d594fSAndroid Build Coastguard Worker       if ((i & 1) != 0) {
3224*795d594fSAndroid Build Coastguard Worker         obj.i = 2;
3225*795d594fSAndroid Build Coastguard Worker         phi = 2;
3226*795d594fSAndroid Build Coastguard Worker       }
3227*795d594fSAndroid Build Coastguard Worker       // There is a Phi here for the variable `phi` before the "++i".
3228*795d594fSAndroid Build Coastguard Worker       // This Phi and the loop Phi for `phi` depend on each other.
3229*795d594fSAndroid Build Coastguard Worker     }
3230*795d594fSAndroid Build Coastguard Worker     if (n == 3) {
3231*795d594fSAndroid Build Coastguard Worker       return -1;  // Make above stores observable.
3232*795d594fSAndroid Build Coastguard Worker     }
3233*795d594fSAndroid Build Coastguard Worker     // We're not matching multiple Phi placeholders to existing Phis. Therefore the load
3234*795d594fSAndroid Build Coastguard Worker     // below requires 2 extra Phis to be created and the store below shall not be eliminated
3235*795d594fSAndroid Build Coastguard Worker     // even though it stores the same value that's already present in the heap location.
3236*795d594fSAndroid Build Coastguard Worker     int tmp = obj.i;
3237*795d594fSAndroid Build Coastguard Worker     obj.i = phi;
3238*795d594fSAndroid Build Coastguard Worker     return tmp + phi;
3239*795d594fSAndroid Build Coastguard Worker   }
3240*795d594fSAndroid Build Coastguard Worker 
3241*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop26(TestClass, int) load_store_elimination (before)
3242*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
3243*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3244*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3245*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
3246*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3247*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3248*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3249*795d594fSAndroid Build Coastguard Worker 
3250*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop26(TestClass, int) load_store_elimination (after)
3251*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
3252*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3253*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3254*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3255*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
3256*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3257*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3258*795d594fSAndroid Build Coastguard Worker 
3259*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop26(TestClass, int) load_store_elimination (after)
3260*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldGet
3261*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
3262*795d594fSAndroid Build Coastguard Worker 
3263*795d594fSAndroid Build Coastguard Worker   // Test load elimination creating a reference Phi.
testLoop26(TestClass obj, int n)3264*795d594fSAndroid Build Coastguard Worker   static int testLoop26(TestClass obj, int n) {
3265*795d594fSAndroid Build Coastguard Worker     obj.next = new TestClass(1, 2);
3266*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3267*795d594fSAndroid Build Coastguard Worker       obj.next = new SubTestClass();
3268*795d594fSAndroid Build Coastguard Worker     }
3269*795d594fSAndroid Build Coastguard Worker     return obj.next.i;
3270*795d594fSAndroid Build Coastguard Worker   }
3271*795d594fSAndroid Build Coastguard Worker 
3272*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop27(TestClass, int) load_store_elimination (before)
3273*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
3274*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3275*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3276*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
3277*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3278*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3279*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3280*795d594fSAndroid Build Coastguard Worker 
3281*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop27(TestClass, int) load_store_elimination (after)
3282*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
3283*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3284*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3285*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3286*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     NewInstance
3287*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3288*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3289*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldGet
3290*795d594fSAndroid Build Coastguard Worker 
3291*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop27(TestClass, int) load_store_elimination (after)
3292*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldGet
3293*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldGet
3294*795d594fSAndroid Build Coastguard Worker 
3295*795d594fSAndroid Build Coastguard Worker   // Test load elimination creating two reference Phis that depend on each other.
testLoop27(TestClass obj, int n)3296*795d594fSAndroid Build Coastguard Worker   static int testLoop27(TestClass obj, int n) {
3297*795d594fSAndroid Build Coastguard Worker     obj.next = new TestClass(1, 2);
3298*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3299*795d594fSAndroid Build Coastguard Worker       if ((i & 1) != 0) {
3300*795d594fSAndroid Build Coastguard Worker         obj.next = new SubTestClass();
3301*795d594fSAndroid Build Coastguard Worker       }
3302*795d594fSAndroid Build Coastguard Worker       // There shall be a Phi created here for `obj.next` before the "++i".
3303*795d594fSAndroid Build Coastguard Worker       // This Phi and the loop Phi that shall be created for `obj.next` depend on each other.
3304*795d594fSAndroid Build Coastguard Worker     }
3305*795d594fSAndroid Build Coastguard Worker     return obj.next.i;
3306*795d594fSAndroid Build Coastguard Worker   }
3307*795d594fSAndroid Build Coastguard Worker 
3308*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop28(TestClass, int) load_store_elimination (before)
3309*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3310*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
3311*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3312*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3313*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3314*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3315*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3316*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3317*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3318*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3319*795d594fSAndroid Build Coastguard Worker 
3320*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop28(TestClass, int) load_store_elimination (after)
3321*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3322*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3323*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3324*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3325*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3326*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3327*795d594fSAndroid Build Coastguard Worker 
3328*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop28(TestClass, int) load_store_elimination (after)
3329*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 NewArray
3330*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
3331*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArraySet
3332*795d594fSAndroid Build Coastguard Worker 
3333*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop28(TestClass, int) load_store_elimination (after)
3334*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3335*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3336*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3337*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3338*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
3339*795d594fSAndroid Build Coastguard Worker 
3340*795d594fSAndroid Build Coastguard Worker   // Test eliminating array allocation, loads and stores and creating loop Phis
3341*795d594fSAndroid Build Coastguard Worker   // after determining that a field load depending on loop Phi placeholder cannot
3342*795d594fSAndroid Build Coastguard Worker   // be eliminated.
testLoop28(TestClass obj, int n)3343*795d594fSAndroid Build Coastguard Worker   private static int testLoop28(TestClass obj, int n) {
3344*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
3345*795d594fSAndroid Build Coastguard Worker     int[] a = new int[3];
3346*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3347*795d594fSAndroid Build Coastguard Worker       a[0] = a[1];
3348*795d594fSAndroid Build Coastguard Worker       a[1] = a[2];
3349*795d594fSAndroid Build Coastguard Worker       a[2] = obj.i;
3350*795d594fSAndroid Build Coastguard Worker       $noinline$clobberObservables();
3351*795d594fSAndroid Build Coastguard Worker     }
3352*795d594fSAndroid Build Coastguard Worker     return a[0];
3353*795d594fSAndroid Build Coastguard Worker   }
3354*795d594fSAndroid Build Coastguard Worker 
3355*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop29(int) load_store_elimination (before)
3356*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
3357*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3358*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3359*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3360*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3361*795d594fSAndroid Build Coastguard Worker 
3362*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop29(int) load_store_elimination (after)
3363*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
3364*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3365*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3366*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3367*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3368*795d594fSAndroid Build Coastguard Worker 
3369*795d594fSAndroid Build Coastguard Worker   // Test that ArraySet with non-default value prevents matching ArrayGet for
3370*795d594fSAndroid Build Coastguard Worker   // the same array to default value even when the ArraySet is using an index
3371*795d594fSAndroid Build Coastguard Worker   // offset by one, making LSA declare that the two heap locations do not alias.
testLoop29(int n)3372*795d594fSAndroid Build Coastguard Worker   private static int testLoop29(int n) {
3373*795d594fSAndroid Build Coastguard Worker     int[] a = new int[4];
3374*795d594fSAndroid Build Coastguard Worker     int sum = 0;
3375*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ) {
3376*795d594fSAndroid Build Coastguard Worker       int value = a[i] + 1;
3377*795d594fSAndroid Build Coastguard Worker       sum += value;
3378*795d594fSAndroid Build Coastguard Worker       ++i;
3379*795d594fSAndroid Build Coastguard Worker       a[i] = value;
3380*795d594fSAndroid Build Coastguard Worker     }
3381*795d594fSAndroid Build Coastguard Worker     return sum;
3382*795d594fSAndroid Build Coastguard Worker   }
3383*795d594fSAndroid Build Coastguard Worker 
3384*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop30(int) load_store_elimination (before)
3385*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
3386*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3387*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3388*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3389*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3390*795d594fSAndroid Build Coastguard Worker 
3391*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop30(int) load_store_elimination (after)
3392*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
3393*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArraySet
3394*795d594fSAndroid Build Coastguard Worker 
3395*795d594fSAndroid Build Coastguard Worker   // Test that ArraySet with default value does not prevent matching ArrayGet
3396*795d594fSAndroid Build Coastguard Worker   // for the same array to the default value.
testLoop30(int n)3397*795d594fSAndroid Build Coastguard Worker   private static int testLoop30(int n) {
3398*795d594fSAndroid Build Coastguard Worker     int[] a = new int[4];  // NewArray is kept due to environment use by Deoptimize.
3399*795d594fSAndroid Build Coastguard Worker     int sum = 0;
3400*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ) {
3401*795d594fSAndroid Build Coastguard Worker       int value = a[i] + 1;
3402*795d594fSAndroid Build Coastguard Worker       sum += value;
3403*795d594fSAndroid Build Coastguard Worker       ++i;
3404*795d594fSAndroid Build Coastguard Worker       a[i] = 0;
3405*795d594fSAndroid Build Coastguard Worker     }
3406*795d594fSAndroid Build Coastguard Worker     return sum;
3407*795d594fSAndroid Build Coastguard Worker   }
3408*795d594fSAndroid Build Coastguard Worker 
3409*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop31(int) load_store_elimination (before)
3410*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
3411*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3412*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3413*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3414*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3415*795d594fSAndroid Build Coastguard Worker 
3416*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop31(int) load_store_elimination (after)
3417*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
3418*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArraySet
3419*795d594fSAndroid Build Coastguard Worker 
3420*795d594fSAndroid Build Coastguard Worker   // Test that ArraySet with default value read from the array does not
3421*795d594fSAndroid Build Coastguard Worker   // prevent matching ArrayGet for the same array to the default value.
testLoop31(int n)3422*795d594fSAndroid Build Coastguard Worker   private static int testLoop31(int n) {
3423*795d594fSAndroid Build Coastguard Worker     int[] a = new int[4];  // NewArray is kept due to environment use by Deoptimize.
3424*795d594fSAndroid Build Coastguard Worker     int sum = 0;
3425*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ) {
3426*795d594fSAndroid Build Coastguard Worker       int value = a[i];
3427*795d594fSAndroid Build Coastguard Worker       sum += value;
3428*795d594fSAndroid Build Coastguard Worker       ++i;
3429*795d594fSAndroid Build Coastguard Worker       a[i] = value;
3430*795d594fSAndroid Build Coastguard Worker     }
3431*795d594fSAndroid Build Coastguard Worker     return sum;
3432*795d594fSAndroid Build Coastguard Worker   }
3433*795d594fSAndroid Build Coastguard Worker 
3434*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop32(TestClass, int) load_store_elimination (before)
3435*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3436*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3437*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3438*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3439*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3440*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3441*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3442*795d594fSAndroid Build Coastguard Worker 
3443*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop32(TestClass, int) load_store_elimination (after)
3444*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3445*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3446*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3447*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3448*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     InstanceFieldSet
3449*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                     Phi
3450*795d594fSAndroid Build Coastguard Worker 
3451*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop32(TestClass, int) load_store_elimination (after)
3452*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3453*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3454*795d594fSAndroid Build Coastguard Worker   /// CHECK:                         InstanceFieldSet
3455*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                     InstanceFieldSet
3456*795d594fSAndroid Build Coastguard Worker 
3457*795d594fSAndroid Build Coastguard Worker   // Test matching Phis for store elimination.
testLoop32(TestClass obj, int n)3458*795d594fSAndroid Build Coastguard Worker   static int testLoop32(TestClass obj, int n) {
3459*795d594fSAndroid Build Coastguard Worker     obj.i = -1;
3460*795d594fSAndroid Build Coastguard Worker     int phi = -1;
3461*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ) {
3462*795d594fSAndroid Build Coastguard Worker       ++i;
3463*795d594fSAndroid Build Coastguard Worker       if ((i & 1) != 0) {
3464*795d594fSAndroid Build Coastguard Worker         obj.i = i;
3465*795d594fSAndroid Build Coastguard Worker         phi = i;
3466*795d594fSAndroid Build Coastguard Worker       }
3467*795d594fSAndroid Build Coastguard Worker     }
3468*795d594fSAndroid Build Coastguard Worker     if ((n & 1) != 0) {
3469*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
3470*795d594fSAndroid Build Coastguard Worker       phi = 2;
3471*795d594fSAndroid Build Coastguard Worker     }
3472*795d594fSAndroid Build Coastguard Worker     if (n == 3) {
3473*795d594fSAndroid Build Coastguard Worker       return -2;  // Make the above stores observable.
3474*795d594fSAndroid Build Coastguard Worker     }
3475*795d594fSAndroid Build Coastguard Worker     // As the stores above are observable and kept, we match the merged
3476*795d594fSAndroid Build Coastguard Worker     // heap value with existing Phis and determine that we're storing
3477*795d594fSAndroid Build Coastguard Worker     // the same value that's already there, so we eliminate this store.
3478*795d594fSAndroid Build Coastguard Worker     obj.i = phi;
3479*795d594fSAndroid Build Coastguard Worker     return phi;
3480*795d594fSAndroid Build Coastguard Worker   }
3481*795d594fSAndroid Build Coastguard Worker 
3482*795d594fSAndroid Build Coastguard Worker   // CHECK-START: int Main.testLoop33(TestClass, int) load_store_elimination (before)
3483*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     InstanceFieldSet
3484*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     NewArray
3485*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     Phi
3486*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     ArrayGet
3487*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     InstanceFieldSet
3488*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     Phi
3489*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     ArrayGet
3490*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     InstanceFieldGet
3491*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     InstanceFieldSet
3492*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     InstanceFieldGet
3493*795d594fSAndroid Build Coastguard Worker 
3494*795d594fSAndroid Build Coastguard Worker   // CHECK-START: int Main.testLoop33(TestClass, int) load_store_elimination (after)
3495*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     InstanceFieldSet
3496*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     Phi
3497*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     InstanceFieldSet
3498*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     Phi
3499*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     InstanceFieldGet
3500*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     InstanceFieldSet
3501*795d594fSAndroid Build Coastguard Worker   // CHECK-DAG:                     InstanceFieldGet
3502*795d594fSAndroid Build Coastguard Worker 
3503*795d594fSAndroid Build Coastguard Worker   // CHECK-START: int Main.testLoop33(TestClass, int) load_store_elimination (after)
3504*795d594fSAndroid Build Coastguard Worker   // CHECK-NOT:                     ArrayGet
3505*795d594fSAndroid Build Coastguard Worker 
3506*795d594fSAndroid Build Coastguard Worker   // Test that when processing Phi placeholder with unknown input, we allow materialized
3507*795d594fSAndroid Build Coastguard Worker   // default value in pre-header for array location with index defined in the loop.
testLoop33(TestClass obj, int n)3508*795d594fSAndroid Build Coastguard Worker   static int testLoop33(TestClass obj, int n) {
3509*795d594fSAndroid Build Coastguard Worker     obj.i = 0;
3510*795d594fSAndroid Build Coastguard Worker     int[] a0 = new int[n];
3511*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3512*795d594fSAndroid Build Coastguard Worker       obj.i = a0[i];
3513*795d594fSAndroid Build Coastguard Worker       $noinline$clobberObservables();  // Make `obj.i` unknown.
3514*795d594fSAndroid Build Coastguard Worker     }
3515*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3516*795d594fSAndroid Build Coastguard Worker       int zero = a0[i];
3517*795d594fSAndroid Build Coastguard Worker       int unknown = obj.i;
3518*795d594fSAndroid Build Coastguard Worker       obj.j += zero + unknown;
3519*795d594fSAndroid Build Coastguard Worker     }
3520*795d594fSAndroid Build Coastguard Worker     return obj.j;
3521*795d594fSAndroid Build Coastguard Worker   }
3522*795d594fSAndroid Build Coastguard Worker 
3523*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop34(int) load_store_elimination (before)
3524*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
3525*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3526*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3527*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3528*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3529*795d594fSAndroid Build Coastguard Worker 
3530*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop34(int) load_store_elimination (after)
3531*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
3532*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3533*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3534*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3535*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3536*795d594fSAndroid Build Coastguard Worker 
3537*795d594fSAndroid Build Coastguard Worker   // Test that ArraySet with non-default value prevents matching ArrayGet for
3538*795d594fSAndroid Build Coastguard Worker   // the same array to default value even when the ArraySet is using an index
3539*795d594fSAndroid Build Coastguard Worker   // offset by one, making LSA declare that the two heap locations do not alias.
3540*795d594fSAndroid Build Coastguard Worker   // Also test that the ArraySet is not eliminated.
testLoop34(int n)3541*795d594fSAndroid Build Coastguard Worker   private static int testLoop34(int n) {
3542*795d594fSAndroid Build Coastguard Worker     int[] a = new int[n + 1];
3543*795d594fSAndroid Build Coastguard Worker     int sum = 0;
3544*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ) {
3545*795d594fSAndroid Build Coastguard Worker       int value = a[i] + 1;
3546*795d594fSAndroid Build Coastguard Worker       sum += value;
3547*795d594fSAndroid Build Coastguard Worker       ++i;
3548*795d594fSAndroid Build Coastguard Worker       a[i] = value;
3549*795d594fSAndroid Build Coastguard Worker     }
3550*795d594fSAndroid Build Coastguard Worker     return sum;
3551*795d594fSAndroid Build Coastguard Worker   }
3552*795d594fSAndroid Build Coastguard Worker 
3553*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop35(int) load_store_elimination (before)
3554*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
3555*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3556*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3557*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3558*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3559*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3560*795d594fSAndroid Build Coastguard Worker 
3561*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop35(int) load_store_elimination (after)
3562*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
3563*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3564*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3565*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3566*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3567*795d594fSAndroid Build Coastguard Worker 
3568*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop35(int) load_store_elimination (after)
3569*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     ArraySet
3570*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArraySet
3571*795d594fSAndroid Build Coastguard Worker 
3572*795d594fSAndroid Build Coastguard Worker   // Test that ArraySet with non-default value prevents matching ArrayGet for
3573*795d594fSAndroid Build Coastguard Worker   // the same array to default value even when the ArraySet is using an index
3574*795d594fSAndroid Build Coastguard Worker   // offset by one, making LSA declare that the two heap locations do not alias.
3575*795d594fSAndroid Build Coastguard Worker   // Also test that the ArraySet is not eliminated and that a store after the
3576*795d594fSAndroid Build Coastguard Worker   // loop is eliminated.
testLoop35(int n)3577*795d594fSAndroid Build Coastguard Worker   private static int testLoop35(int n) {
3578*795d594fSAndroid Build Coastguard Worker     int[] a = new int[n + 1];
3579*795d594fSAndroid Build Coastguard Worker     int sum = 0;
3580*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ) {
3581*795d594fSAndroid Build Coastguard Worker       int value = a[i] + 1;
3582*795d594fSAndroid Build Coastguard Worker       sum += value;
3583*795d594fSAndroid Build Coastguard Worker       ++i;
3584*795d594fSAndroid Build Coastguard Worker       a[i] = value;
3585*795d594fSAndroid Build Coastguard Worker     }
3586*795d594fSAndroid Build Coastguard Worker     a[0] = 1;
3587*795d594fSAndroid Build Coastguard Worker     return sum;
3588*795d594fSAndroid Build Coastguard Worker   }
3589*795d594fSAndroid Build Coastguard Worker 
3590*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop36(int) load_store_elimination (before)
3591*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3592*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Deoptimize
3593*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3594*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3595*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3596*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3597*795d594fSAndroid Build Coastguard Worker 
3598*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop36(int) load_store_elimination (before)
3599*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 BoundsCheck
3600*795d594fSAndroid Build Coastguard Worker 
3601*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop36(int) load_store_elimination (after)
3602*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3603*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Deoptimize
3604*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3605*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3606*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3607*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3608*795d594fSAndroid Build Coastguard Worker 
3609*795d594fSAndroid Build Coastguard Worker   // Regression test for b/187487955.
3610*795d594fSAndroid Build Coastguard Worker   // We previously failed a DCHECK() during the search for kept stores when
3611*795d594fSAndroid Build Coastguard Worker   // we encountered two array locations for the same array and considered
3612*795d594fSAndroid Build Coastguard Worker   // non-aliasing by LSA when only one of the array locations had index
3613*795d594fSAndroid Build Coastguard Worker   // defined inside the loop. Note that this situation requires that BCE
3614*795d594fSAndroid Build Coastguard Worker   // eliminates BoundsCheck instructions, otherwise LSA considers those
3615*795d594fSAndroid Build Coastguard Worker   // locations aliasing.
testLoop36(int n)3616*795d594fSAndroid Build Coastguard Worker   private static int testLoop36(int n) {
3617*795d594fSAndroid Build Coastguard Worker     int[] a = new int[n];
3618*795d594fSAndroid Build Coastguard Worker     int zero = 0;
3619*795d594fSAndroid Build Coastguard Worker     int i = 0;
3620*795d594fSAndroid Build Coastguard Worker     for (; i < n; ++i) {
3621*795d594fSAndroid Build Coastguard Worker       a[i] = i;
3622*795d594fSAndroid Build Coastguard Worker       // Extra instructions to avoid loop unrolling.
3623*795d594fSAndroid Build Coastguard Worker       zero = (((zero ^ 1) + 2) ^ 1) - 2;
3624*795d594fSAndroid Build Coastguard Worker       zero = (((zero ^ 4) + 8) ^ 4) - 8;
3625*795d594fSAndroid Build Coastguard Worker     }
3626*795d594fSAndroid Build Coastguard Worker     // Use 4 loads with consecutive fixed offsets from the loop Phi for `i`.
3627*795d594fSAndroid Build Coastguard Worker     // BCE shall replace BoundsChecks with Deoptimize, so that indexes here are
3628*795d594fSAndroid Build Coastguard Worker     // the Phi plus/minus a constant, something that LSA considers non-aliasing
3629*795d594fSAndroid Build Coastguard Worker     // with the Phi (LSA does not take different loop iterations into account)
3630*795d594fSAndroid Build Coastguard Worker     // but LSE must consider aliasing across dfferent loop iterations.
3631*795d594fSAndroid Build Coastguard Worker     return a[i - 1] + a[i - 2] + a[i - 3] + a[i - 4] + zero;
3632*795d594fSAndroid Build Coastguard Worker   }
3633*795d594fSAndroid Build Coastguard Worker 
3634*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop37(int) load_store_elimination (before)
3635*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3636*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Deoptimize
3637*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3638*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3639*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3640*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3641*795d594fSAndroid Build Coastguard Worker 
3642*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop37(int) load_store_elimination (before)
3643*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 BoundsCheck
3644*795d594fSAndroid Build Coastguard Worker 
3645*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop37(int) load_store_elimination (after)
3646*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3647*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Deoptimize
3648*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3649*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3650*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3651*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3652*795d594fSAndroid Build Coastguard Worker 
3653*795d594fSAndroid Build Coastguard Worker   // Similar to testLoop36 but the writes are done via a different reference to the same array.
3654*795d594fSAndroid Build Coastguard Worker   // We previously used a reference comparison for back-edge aliasing analysis but this test
3655*795d594fSAndroid Build Coastguard Worker   // has different references and therefore needs `HeapLocationCollector::CanReferencesAlias()`.
testLoop37(int n)3656*795d594fSAndroid Build Coastguard Worker   private static int testLoop37(int n) {
3657*795d594fSAndroid Build Coastguard Worker     int[] a = new int[n];
3658*795d594fSAndroid Build Coastguard Worker     int[] b = $noinline$returnArg(a);
3659*795d594fSAndroid Build Coastguard Worker     int zero = 0;
3660*795d594fSAndroid Build Coastguard Worker     int i = 0;
3661*795d594fSAndroid Build Coastguard Worker     for (; i < n; ++i) {
3662*795d594fSAndroid Build Coastguard Worker       b[i] = i;
3663*795d594fSAndroid Build Coastguard Worker       // Extra instructions to avoid loop unrolling.
3664*795d594fSAndroid Build Coastguard Worker       zero = (((zero ^ 1) + 2) ^ 1) - 2;
3665*795d594fSAndroid Build Coastguard Worker       zero = (((zero ^ 4) + 8) ^ 4) - 8;
3666*795d594fSAndroid Build Coastguard Worker     }
3667*795d594fSAndroid Build Coastguard Worker     // Use 4 loads with consecutive fixed offsets from the loop Phi for `i`.
3668*795d594fSAndroid Build Coastguard Worker     // BCE shall replace BoundsChecks with Deoptimize, so that indexes here are
3669*795d594fSAndroid Build Coastguard Worker     // the Phi plus/minus a constant, something that LSA considers non-aliasing
3670*795d594fSAndroid Build Coastguard Worker     // with the Phi (LSA does not take different loop iterations into account)
3671*795d594fSAndroid Build Coastguard Worker     // but LSE must consider aliasing across dfferent loop iterations.
3672*795d594fSAndroid Build Coastguard Worker     return a[i - 1] + a[i - 2] + a[i - 3] + a[i - 4] + zero;
3673*795d594fSAndroid Build Coastguard Worker   }
3674*795d594fSAndroid Build Coastguard Worker 
$noinline$returnArg(int[] a)3675*795d594fSAndroid Build Coastguard Worker   private static int[] $noinline$returnArg(int[] a) {
3676*795d594fSAndroid Build Coastguard Worker     return a;
3677*795d594fSAndroid Build Coastguard Worker   }
3678*795d594fSAndroid Build Coastguard Worker 
3679*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop38(int, int[]) load_store_elimination (before)
3680*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3681*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Deoptimize
3682*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3683*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3684*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3685*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3686*795d594fSAndroid Build Coastguard Worker 
3687*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop38(int, int[]) load_store_elimination (before)
3688*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 BoundsCheck
3689*795d594fSAndroid Build Coastguard Worker 
3690*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop38(int, int[]) load_store_elimination (after)
3691*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
3692*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Deoptimize
3693*795d594fSAndroid Build Coastguard Worker 
3694*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testLoop38(int, int[]) load_store_elimination (after)
3695*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
3696*795d594fSAndroid Build Coastguard Worker 
3697*795d594fSAndroid Build Coastguard Worker   // Similar to testLoop37 but writing to a different array that exists before allocating `a`,
3698*795d594fSAndroid Build Coastguard Worker   // so that `HeapLocationCollector::CanReferencesAlias()` returns false and all the ArrayGet
3699*795d594fSAndroid Build Coastguard Worker   // instructions are actually eliminated.
testLoop38(int n, int[] b)3700*795d594fSAndroid Build Coastguard Worker   private static int testLoop38(int n, int[] b) {
3701*795d594fSAndroid Build Coastguard Worker     int[] a = new int[n];
3702*795d594fSAndroid Build Coastguard Worker     int zero = 0;
3703*795d594fSAndroid Build Coastguard Worker     int i = 0;
3704*795d594fSAndroid Build Coastguard Worker     for (; i < n; ++i) {
3705*795d594fSAndroid Build Coastguard Worker       b[i] = i;
3706*795d594fSAndroid Build Coastguard Worker       // Extra instructions to avoid loop unrolling.
3707*795d594fSAndroid Build Coastguard Worker       zero = (((zero ^ 1) + 2) ^ 1) - 2;
3708*795d594fSAndroid Build Coastguard Worker       zero = (((zero ^ 4) + 8) ^ 4) - 8;
3709*795d594fSAndroid Build Coastguard Worker     }
3710*795d594fSAndroid Build Coastguard Worker     // Use 4 loads with consecutive fixed offsets from the loop Phi for `i`.
3711*795d594fSAndroid Build Coastguard Worker     // BCE shall replace BoundsChecks with Deoptimize, so that indexes here are
3712*795d594fSAndroid Build Coastguard Worker     // the Phi plus/minus a constant, something that LSA considers non-aliasing
3713*795d594fSAndroid Build Coastguard Worker     // with the Phi (LSA does not take different loop iterations into account)
3714*795d594fSAndroid Build Coastguard Worker     // but LSE must consider aliasing across dfferent loop iterations.
3715*795d594fSAndroid Build Coastguard Worker     return a[i - 1] + a[i - 2] + a[i - 3] + a[i - 4] + zero;
3716*795d594fSAndroid Build Coastguard Worker   }
3717*795d594fSAndroid Build Coastguard Worker 
3718*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop1(TestClass, int) load_store_elimination (before)
3719*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3720*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3721*795d594fSAndroid Build Coastguard Worker 
3722*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop1(TestClass, int) load_store_elimination (after)
3723*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3724*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3725*795d594fSAndroid Build Coastguard Worker 
3726*795d594fSAndroid Build Coastguard Worker   // Test heap value clobbering in nested loop.
testNestedLoop1(TestClass obj, int n)3727*795d594fSAndroid Build Coastguard Worker   private static int testNestedLoop1(TestClass obj, int n) {
3728*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
3729*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3730*795d594fSAndroid Build Coastguard Worker       for (int j = i + 1; j < n; ++j) {
3731*795d594fSAndroid Build Coastguard Worker         $noinline$clobberObservables();
3732*795d594fSAndroid Build Coastguard Worker       }
3733*795d594fSAndroid Build Coastguard Worker     }
3734*795d594fSAndroid Build Coastguard Worker     return obj.i;
3735*795d594fSAndroid Build Coastguard Worker   }
3736*795d594fSAndroid Build Coastguard Worker 
3737*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop2(TestClass, int) load_store_elimination (before)
3738*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3739*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3740*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3741*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3742*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3743*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3744*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3745*795d594fSAndroid Build Coastguard Worker 
3746*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop2(TestClass, int) load_store_elimination (after)
3747*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3748*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3749*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3750*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3751*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3752*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3753*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3754*795d594fSAndroid Build Coastguard Worker 
3755*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop2(TestClass, int) load_store_elimination (after)
3756*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldGet
3757*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
3758*795d594fSAndroid Build Coastguard Worker 
3759*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop2(TestClass, int) load_store_elimination (after)
3760*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3761*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3762*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3763*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
3764*795d594fSAndroid Build Coastguard Worker 
3765*795d594fSAndroid Build Coastguard Worker   // Test heap value clobbering in the nested loop and load elimination for a heap
3766*795d594fSAndroid Build Coastguard Worker   // location then set to known value before the end of the outer loop.
testNestedLoop2(TestClass obj, int n)3767*795d594fSAndroid Build Coastguard Worker   private static int testNestedLoop2(TestClass obj, int n) {
3768*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
3769*795d594fSAndroid Build Coastguard Worker     obj.j = 2;
3770*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3771*795d594fSAndroid Build Coastguard Worker       int tmp = obj.j;
3772*795d594fSAndroid Build Coastguard Worker       for (int j = i + 1; j < n; ++j) {
3773*795d594fSAndroid Build Coastguard Worker         $noinline$clobberObservables();
3774*795d594fSAndroid Build Coastguard Worker       }
3775*795d594fSAndroid Build Coastguard Worker       obj.i = tmp;
3776*795d594fSAndroid Build Coastguard Worker     }
3777*795d594fSAndroid Build Coastguard Worker     return obj.i;
3778*795d594fSAndroid Build Coastguard Worker   }
3779*795d594fSAndroid Build Coastguard Worker 
3780*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop3(TestClass, int) load_store_elimination (before)
3781*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3782*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3783*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3784*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3785*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3786*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3787*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3788*795d594fSAndroid Build Coastguard Worker 
3789*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop3(TestClass, int) load_store_elimination (after)
3790*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3791*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3792*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3793*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3794*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3795*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3796*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3797*795d594fSAndroid Build Coastguard Worker 
3798*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop3(TestClass, int) load_store_elimination (after)
3799*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldGet
3800*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
3801*795d594fSAndroid Build Coastguard Worker 
3802*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop3(TestClass, int) load_store_elimination (after)
3803*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3804*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3805*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3806*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
3807*795d594fSAndroid Build Coastguard Worker 
3808*795d594fSAndroid Build Coastguard Worker   // Test heap value clobbering in the nested loop and load elimination for a heap
3809*795d594fSAndroid Build Coastguard Worker   // location then set to known value before the end of the outer loop.
testNestedLoop3(TestClass obj, int n)3810*795d594fSAndroid Build Coastguard Worker   private static int testNestedLoop3(TestClass obj, int n) {
3811*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
3812*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3813*795d594fSAndroid Build Coastguard Worker       obj.j = 2;
3814*795d594fSAndroid Build Coastguard Worker       for (int j = i + 1; j < n; ++j) {
3815*795d594fSAndroid Build Coastguard Worker         $noinline$clobberObservables();
3816*795d594fSAndroid Build Coastguard Worker       }
3817*795d594fSAndroid Build Coastguard Worker       obj.i = obj.j;
3818*795d594fSAndroid Build Coastguard Worker     }
3819*795d594fSAndroid Build Coastguard Worker     return obj.i;
3820*795d594fSAndroid Build Coastguard Worker   }
3821*795d594fSAndroid Build Coastguard Worker 
3822*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop4(TestClass, int) load_store_elimination (before)
3823*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3824*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3825*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3826*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3827*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3828*795d594fSAndroid Build Coastguard Worker 
3829*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop4(TestClass, int) load_store_elimination (after)
3830*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3831*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3832*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3833*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3834*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3835*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3836*795d594fSAndroid Build Coastguard Worker 
3837*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop4(TestClass, int) load_store_elimination (after)
3838*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
3839*795d594fSAndroid Build Coastguard Worker 
3840*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop4(TestClass, int) load_store_elimination (after)
3841*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3842*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3843*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3844*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3845*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
3846*795d594fSAndroid Build Coastguard Worker 
3847*795d594fSAndroid Build Coastguard Worker   // Test creating loop Phis for both inner and outer loop to eliminate a load.
testNestedLoop4(TestClass obj, int n)3848*795d594fSAndroid Build Coastguard Worker   private static int testNestedLoop4(TestClass obj, int n) {
3849*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
3850*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3851*795d594fSAndroid Build Coastguard Worker       for (int j = i + 1; j < n; ++j) {
3852*795d594fSAndroid Build Coastguard Worker         obj.i = 2;
3853*795d594fSAndroid Build Coastguard Worker       }
3854*795d594fSAndroid Build Coastguard Worker     }
3855*795d594fSAndroid Build Coastguard Worker     return obj.i;
3856*795d594fSAndroid Build Coastguard Worker   }
3857*795d594fSAndroid Build Coastguard Worker 
3858*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop5(TestClass, int) load_store_elimination (before)
3859*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3860*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3861*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3862*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3863*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3864*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3865*795d594fSAndroid Build Coastguard Worker 
3866*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop5(TestClass, int) load_store_elimination (after)
3867*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3868*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3869*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3870*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3871*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3872*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3873*795d594fSAndroid Build Coastguard Worker 
3874*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop5(TestClass, int) load_store_elimination (after)
3875*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
3876*795d594fSAndroid Build Coastguard Worker 
3877*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop5(TestClass, int) load_store_elimination (after)
3878*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3879*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3880*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3881*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
3882*795d594fSAndroid Build Coastguard Worker 
3883*795d594fSAndroid Build Coastguard Worker   // Test creating a loop Phi for outer loop to eliminate a load.
testNestedLoop5(TestClass obj, int n)3884*795d594fSAndroid Build Coastguard Worker   private static int testNestedLoop5(TestClass obj, int n) {
3885*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
3886*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3887*795d594fSAndroid Build Coastguard Worker       obj.i = 2;
3888*795d594fSAndroid Build Coastguard Worker       for (int j = i + 1; j < n; ++j) {
3889*795d594fSAndroid Build Coastguard Worker         obj.j = 3;  // Unrelated.
3890*795d594fSAndroid Build Coastguard Worker       }
3891*795d594fSAndroid Build Coastguard Worker     }
3892*795d594fSAndroid Build Coastguard Worker     return obj.i;
3893*795d594fSAndroid Build Coastguard Worker   }
3894*795d594fSAndroid Build Coastguard Worker 
3895*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop6(TestClass, int) load_store_elimination (before)
3896*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3897*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3898*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3899*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3900*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3901*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3902*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3903*795d594fSAndroid Build Coastguard Worker 
3904*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop6(TestClass, int) load_store_elimination (after)
3905*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3906*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3907*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3908*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3909*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3910*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3911*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3912*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3913*795d594fSAndroid Build Coastguard Worker 
3914*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop6(TestClass, int) load_store_elimination (after)
3915*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldGet
3916*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
3917*795d594fSAndroid Build Coastguard Worker 
3918*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop6(TestClass, int) load_store_elimination (after)
3919*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3920*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3921*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3922*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     Phi
3923*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 Phi
3924*795d594fSAndroid Build Coastguard Worker 
3925*795d594fSAndroid Build Coastguard Worker   // Test heap value clobbering in the nested loop and load elimination for a heap
3926*795d594fSAndroid Build Coastguard Worker   // location then set to known value before the end of that inner loop.
testNestedLoop6(TestClass obj, int n)3927*795d594fSAndroid Build Coastguard Worker   private static int testNestedLoop6(TestClass obj, int n) {
3928*795d594fSAndroid Build Coastguard Worker     obj.i = 1;
3929*795d594fSAndroid Build Coastguard Worker     obj.j = 2;
3930*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3931*795d594fSAndroid Build Coastguard Worker       for (int j = i + 1; j < n; ++j) {
3932*795d594fSAndroid Build Coastguard Worker         int tmp = obj.j;
3933*795d594fSAndroid Build Coastguard Worker         $noinline$clobberObservables();
3934*795d594fSAndroid Build Coastguard Worker         obj.i = tmp;
3935*795d594fSAndroid Build Coastguard Worker       }
3936*795d594fSAndroid Build Coastguard Worker     }
3937*795d594fSAndroid Build Coastguard Worker     return obj.i;
3938*795d594fSAndroid Build Coastguard Worker   }
3939*795d594fSAndroid Build Coastguard Worker 
3940*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop7(TestClass, int) load_store_elimination (before)
3941*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
3942*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3943*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3944*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
3945*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3946*795d594fSAndroid Build Coastguard Worker 
3947*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop7(TestClass, int) load_store_elimination (after)
3948*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
3949*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3950*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3951*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3952*795d594fSAndroid Build Coastguard Worker 
3953*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop7(TestClass, int) load_store_elimination (after)
3954*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
3955*795d594fSAndroid Build Coastguard Worker 
3956*795d594fSAndroid Build Coastguard Worker   // Test load elimination in inner loop reading default value that is loop invariant
3957*795d594fSAndroid Build Coastguard Worker   // with an index defined inside the inner loop.
testNestedLoop7(TestClass obj, int n)3958*795d594fSAndroid Build Coastguard Worker   private static int testNestedLoop7(TestClass obj, int n) {
3959*795d594fSAndroid Build Coastguard Worker     // The NewArray is kept as it may throw for negative n.
3960*795d594fSAndroid Build Coastguard Worker     // TODO: Eliminate constructor fence even though the NewArray is kept.
3961*795d594fSAndroid Build Coastguard Worker     int[] a0 = new int[n];
3962*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3963*795d594fSAndroid Build Coastguard Worker       for (int j = i + 1; j < n; ++j) {
3964*795d594fSAndroid Build Coastguard Worker         obj.i = a0[j];
3965*795d594fSAndroid Build Coastguard Worker       }
3966*795d594fSAndroid Build Coastguard Worker     }
3967*795d594fSAndroid Build Coastguard Worker     return n;
3968*795d594fSAndroid Build Coastguard Worker   }
3969*795d594fSAndroid Build Coastguard Worker 
3970*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop8(TestClass, int) load_store_elimination (before)
3971*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewInstance
3972*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3973*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3974*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3975*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewInstance
3976*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3977*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3978*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3979*795d594fSAndroid Build Coastguard Worker 
3980*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop8(TestClass, int) load_store_elimination (after)
3981*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewInstance
3982*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3983*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3984*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3985*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3986*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Phi
3987*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewInstance
3988*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldSet
3989*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 InstanceFieldGet
3990*795d594fSAndroid Build Coastguard Worker 
3991*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testNestedLoop8(TestClass, int) load_store_elimination (after)
3992*795d594fSAndroid Build Coastguard Worker   /// CHECK:                     InstanceFieldGet
3993*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 InstanceFieldGet
3994*795d594fSAndroid Build Coastguard Worker 
3995*795d594fSAndroid Build Coastguard Worker   // Test reference type propagation for Phis created for outer and inner loop.
testNestedLoop8(TestClass obj, int n)3996*795d594fSAndroid Build Coastguard Worker   private static int testNestedLoop8(TestClass obj, int n) {
3997*795d594fSAndroid Build Coastguard Worker     obj.next = new SubTestClass();
3998*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
3999*795d594fSAndroid Build Coastguard Worker       for (int j = i + 1; j < n; ++j) {
4000*795d594fSAndroid Build Coastguard Worker         obj.next = new TestClass();
4001*795d594fSAndroid Build Coastguard Worker       }
4002*795d594fSAndroid Build Coastguard Worker     }
4003*795d594fSAndroid Build Coastguard Worker     // The Phis created in both loop headers for replacing `obj.next` depend on each other.
4004*795d594fSAndroid Build Coastguard Worker     return obj.next.i;
4005*795d594fSAndroid Build Coastguard Worker   }
4006*795d594fSAndroid Build Coastguard Worker 
4007*795d594fSAndroid Build Coastguard Worker 
4008*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long Main.testOverlapLoop(int) load_store_elimination (before)
4009*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
4010*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
4011*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 If
4012*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
4013*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
4014*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
4015*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
4016*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Goto
4017*795d594fSAndroid Build Coastguard Worker 
4018*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long Main.testOverlapLoop(int) load_store_elimination (after)
4019*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 NewArray
4020*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
4021*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 If
4022*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
4023*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArrayGet
4024*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 ArraySet
4025*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Goto
4026*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                 ArrayGet
4027*795d594fSAndroid Build Coastguard Worker 
4028*795d594fSAndroid Build Coastguard Worker   // Test that we don't incorrectly remove writes needed by later loop iterations
4029*795d594fSAndroid Build Coastguard Worker   // NB This is fibonacci numbers
testOverlapLoop(int cnt)4030*795d594fSAndroid Build Coastguard Worker   private static long testOverlapLoop(int cnt) {
4031*795d594fSAndroid Build Coastguard Worker     long[] w = new long[cnt];
4032*795d594fSAndroid Build Coastguard Worker     w[1] = 1;
4033*795d594fSAndroid Build Coastguard Worker     long t = 1;
4034*795d594fSAndroid Build Coastguard Worker     for (int i = 2; i < cnt; ++i) {
4035*795d594fSAndroid Build Coastguard Worker       w[i] = w[i - 1] + w[i - 2];
4036*795d594fSAndroid Build Coastguard Worker       t = w[i];
4037*795d594fSAndroid Build Coastguard Worker     }
4038*795d594fSAndroid Build Coastguard Worker     return t;
4039*795d594fSAndroid Build Coastguard Worker   }
4040*795d594fSAndroid Build Coastguard Worker 
$noinline$getBoolean(boolean val)4041*795d594fSAndroid Build Coastguard Worker   private static boolean $noinline$getBoolean(boolean val) {
4042*795d594fSAndroid Build Coastguard Worker     return val;
4043*795d594fSAndroid Build Coastguard Worker   }
4044*795d594fSAndroid Build Coastguard Worker 
4045*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testPartialEscape1(TestClass, boolean) load_store_elimination (before)
4046*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     ParameterValue
4047*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     NewInstance
4048*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     InvokeStaticOrDirect
4049*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     InstanceFieldSet
4050*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     InvokeStaticOrDirect
4051*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     InstanceFieldGet
4052*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     InstanceFieldGet
4053*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     InstanceFieldSet
4054*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     InstanceFieldGet
4055*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     InstanceFieldGet
4056*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     Phi
4057*795d594fSAndroid Build Coastguard Worker   //
4058*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:     NewInstance
4059*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:     InvokeStaticOrDirect
4060*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:     InstanceFieldSet
4061*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:     InstanceFieldGet
4062*795d594fSAndroid Build Coastguard Worker   //
4063*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testPartialEscape1(TestClass, boolean) load_store_elimination (after)
4064*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     ParameterValue
4065*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     NewInstance
4066*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     Phi
4067*795d594fSAndroid Build Coastguard Worker   //
4068*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testPartialEscape1(TestClass, boolean) load_store_elimination (after)
4069*795d594fSAndroid Build Coastguard Worker   /// CHECK:         InvokeStaticOrDirect
4070*795d594fSAndroid Build Coastguard Worker   /// CHECK:         InvokeStaticOrDirect
4071*795d594fSAndroid Build Coastguard Worker   //
4072*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:     InvokeStaticOrDirect
4073*795d594fSAndroid Build Coastguard Worker 
4074*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testPartialEscape1(TestClass, boolean) load_store_elimination (after)
4075*795d594fSAndroid Build Coastguard Worker   /// CHECK:         InstanceFieldSet
4076*795d594fSAndroid Build Coastguard Worker   //
4077*795d594fSAndroid Build Coastguard Worker   // TODO: We should be able to remove this setter by realizing `i` only escapes in a branch.
4078*795d594fSAndroid Build Coastguard Worker   /// CHECK:         InstanceFieldSet
4079*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:     InstanceFieldSet
4080*795d594fSAndroid Build Coastguard Worker   //
4081*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testPartialEscape1(TestClass, boolean) load_store_elimination (after)
4082*795d594fSAndroid Build Coastguard Worker   /// CHECK:         InstanceFieldGet
4083*795d594fSAndroid Build Coastguard Worker   /// CHECK:         InstanceFieldGet
4084*795d594fSAndroid Build Coastguard Worker   /// CHECK:         InstanceFieldGet
4085*795d594fSAndroid Build Coastguard Worker   //
4086*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:     InstanceFieldGet
$noinline$testPartialEscape1(TestClass obj, boolean escape)4087*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testPartialEscape1(TestClass obj, boolean escape) {
4088*795d594fSAndroid Build Coastguard Worker     TestClass i = new SubTestClass();
4089*795d594fSAndroid Build Coastguard Worker     int res;
4090*795d594fSAndroid Build Coastguard Worker     if ($noinline$getBoolean(escape)) {
4091*795d594fSAndroid Build Coastguard Worker       i.next = obj;
4092*795d594fSAndroid Build Coastguard Worker       $noinline$Escape(i);
4093*795d594fSAndroid Build Coastguard Worker       res = i.next.i;
4094*795d594fSAndroid Build Coastguard Worker     } else {
4095*795d594fSAndroid Build Coastguard Worker       i.next = obj;
4096*795d594fSAndroid Build Coastguard Worker       res = i.next.i;
4097*795d594fSAndroid Build Coastguard Worker     }
4098*795d594fSAndroid Build Coastguard Worker     return res;
4099*795d594fSAndroid Build Coastguard Worker   }
4100*795d594fSAndroid Build Coastguard Worker 
$noinline$clobberObservables()4101*795d594fSAndroid Build Coastguard Worker   private static void $noinline$clobberObservables() {}
4102*795d594fSAndroid Build Coastguard Worker 
assertLongEquals(long result, long expected)4103*795d594fSAndroid Build Coastguard Worker   static void assertLongEquals(long result, long expected) {
4104*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
4105*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
4106*795d594fSAndroid Build Coastguard Worker     }
4107*795d594fSAndroid Build Coastguard Worker   }
4108*795d594fSAndroid Build Coastguard Worker 
assertIntEquals(int result, int expected)4109*795d594fSAndroid Build Coastguard Worker   static void assertIntEquals(int result, int expected) {
4110*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
4111*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
4112*795d594fSAndroid Build Coastguard Worker     }
4113*795d594fSAndroid Build Coastguard Worker   }
4114*795d594fSAndroid Build Coastguard Worker 
assertFloatEquals(float result, float expected)4115*795d594fSAndroid Build Coastguard Worker   static void assertFloatEquals(float result, float expected) {
4116*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
4117*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
4118*795d594fSAndroid Build Coastguard Worker     }
4119*795d594fSAndroid Build Coastguard Worker   }
4120*795d594fSAndroid Build Coastguard Worker 
assertDoubleEquals(double result, double expected)4121*795d594fSAndroid Build Coastguard Worker   static void assertDoubleEquals(double result, double expected) {
4122*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
4123*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
4124*795d594fSAndroid Build Coastguard Worker     }
4125*795d594fSAndroid Build Coastguard Worker   }
4126*795d594fSAndroid Build Coastguard Worker 
main(String[] args)4127*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
4128*795d594fSAndroid Build Coastguard Worker     assertDoubleEquals(Math.PI * Math.PI * Math.PI, calcCircleArea(Math.PI));
4129*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test1(new TestClass(), new TestClass()), 3);
4130*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test2(new TestClass()), 1);
4131*795d594fSAndroid Build Coastguard Worker     TestClass obj1 = new TestClass();
4132*795d594fSAndroid Build Coastguard Worker     TestClass obj2 = new TestClass();
4133*795d594fSAndroid Build Coastguard Worker     obj1.next = obj2;
4134*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test3(obj1), 10);
4135*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test4(new TestClass(), true), 1);
4136*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test4(new TestClass(), false), 1);
4137*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test5(new TestClass(), true), 1);
4138*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test5(new TestClass(), false), 2);
4139*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test6(new TestClass(), new TestClass(), true), 4);
4140*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test6(new TestClass(), new TestClass(), false), 2);
4141*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test7(new TestClass()), 1);
4142*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test8(), 1);
4143*795d594fSAndroid Build Coastguard Worker     obj1 = new TestClass();
4144*795d594fSAndroid Build Coastguard Worker     obj2 = new TestClass();
4145*795d594fSAndroid Build Coastguard Worker     obj1.next = obj2;
4146*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test9(new TestClass()), 1);
4147*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test10(new TestClass(3, 4)), 3);
4148*795d594fSAndroid Build Coastguard Worker     assertIntEquals(TestClass.si, 3);
4149*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test11(new TestClass()), 10);
4150*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test12(new TestClass(), new TestClass()), 10);
4151*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test13(new TestClass(), new TestClass2()), 3);
4152*795d594fSAndroid Build Coastguard Worker     SubTestClass obj3 = new SubTestClass();
4153*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test14(obj3, obj3), 2);
4154*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test15(), 2);
4155*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test16(), 3);
4156*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test17(), 0);
4157*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test18(new TestClass()), 1);
4158*795d594fSAndroid Build Coastguard Worker     float[] fa1 = { 0.8f };
4159*795d594fSAndroid Build Coastguard Worker     float[] fa2 = { 1.8f };
4160*795d594fSAndroid Build Coastguard Worker     assertFloatEquals(test19(fa1, fa2), 1.8f);
4161*795d594fSAndroid Build Coastguard Worker     assertFloatEquals(test20().i, 0);
4162*795d594fSAndroid Build Coastguard Worker     test21(new TestClass());
4163*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test22(), 13);
4164*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test23(true), 4);
4165*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test23(false), 5);
4166*795d594fSAndroid Build Coastguard Worker     assertFloatEquals(test24(), 8.0f);
4167*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test25(false, true, true), 5);
4168*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test25(true, false, true), 2);
4169*795d594fSAndroid Build Coastguard Worker     assertFloatEquals(test26(5), 0.0f);
4170*795d594fSAndroid Build Coastguard Worker     assertFloatEquals(test26(3), 1.0f);
4171*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test27(false, true), 1);
4172*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test27(true, false), 1);
4173*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test28(false, true), 0);
4174*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test28(true, true), 5);
4175*795d594fSAndroid Build Coastguard Worker     assertFloatEquals(test29(true), 5.0f);
4176*795d594fSAndroid Build Coastguard Worker     assertFloatEquals(test29(false), 2.0f);
4177*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test30(new TestClass(), true), 1);
4178*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test30(new TestClass(), false), 0);
4179*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test31(true, true), 5);
4180*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test31(true, false), 6);
4181*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test32(1), 10);
4182*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test32(2), 10);
4183*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test33(new TestClass(), true), 1);
4184*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test33(new TestClass(), false), 2);
4185*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test34(new TestClass(), true, true), 3);
4186*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test34(new TestClass(), false, true), 4);
4187*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test34(new TestClass(), true, false), 1);
4188*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test34(new TestClass(), false, false), 2);
4189*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test35(new TestClass(), true, true), 3);
4190*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test35(new TestClass(), false, true), 2);
4191*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test35(new TestClass(), true, false), 1);
4192*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test35(new TestClass(), false, false), 2);
4193*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test36(new TestClass(), true), 2);
4194*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test36(new TestClass(), false), 4);
4195*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test37(new TestClass(), true), 1);
4196*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test37(new TestClass(), false), 0);
4197*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test38(new TestClass(), true), 1);
4198*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test38(new TestClass(), false), 2);
4199*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test39(new TestClass(), true), 0);
4200*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test39(new TestClass(), false), 1);
4201*795d594fSAndroid Build Coastguard Worker     assertIntEquals(test40(), 150);
4202*795d594fSAndroid Build Coastguard Worker 
4203*795d594fSAndroid Build Coastguard Worker     testFinalizableByForcingGc();
4204*795d594fSAndroid Build Coastguard Worker     testFinalizableWithLoopByForcingGc();
4205*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testHSelect(true), 0xdead);
4206*795d594fSAndroid Build Coastguard Worker     int[] array = {2, 5, 9, -1, -3, 10, 8, 4};
4207*795d594fSAndroid Build Coastguard Worker     assertIntEquals(sumWithinRange(array, 1, 5), 11);
4208*795d594fSAndroid Build Coastguard Worker     assertFloatEquals(testAllocationEliminationWithLoops(), 1.0f);
4209*795d594fSAndroid Build Coastguard Worker     assertFloatEquals(mF, 0f);
4210*795d594fSAndroid Build Coastguard Worker     assertDoubleEquals(Math.PI * Math.PI * Math.PI, getCircleArea(Math.PI, true));
4211*795d594fSAndroid Build Coastguard Worker     assertDoubleEquals(0d, getCircleArea(Math.PI, false));
4212*795d594fSAndroid Build Coastguard Worker 
4213*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion1(new TestClass(), 300), 300);
4214*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion1(new TestClass(), 301), 45);
4215*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion2(new TestClass(), 300), 300);
4216*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion2(new TestClass(), 301), 90);
4217*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion3(new TestClass(), 0), 0);
4218*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion3(new TestClass(), 1), 0);
4219*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion3(new TestClass(), 128), 127);
4220*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion3(new TestClass(), 129), -128);
4221*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion4(new TestClass(), 0), 0);
4222*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion4(new TestClass(), 1), 0);
4223*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion4(new TestClass(), 128), 254);
4224*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testConversion4(new TestClass(), 129), -256);
4225*795d594fSAndroid Build Coastguard Worker 
4226*795d594fSAndroid Build Coastguard Worker     int[] iarray = {0, 0, 0};
4227*795d594fSAndroid Build Coastguard Worker     double[] darray = {0d, 0d, 0d};
4228*795d594fSAndroid Build Coastguard Worker     try {
4229*795d594fSAndroid Build Coastguard Worker       assertDoubleEquals(Math.PI * Math.PI * Math.PI, testDeoptimize(iarray, darray, Math.PI));
4230*795d594fSAndroid Build Coastguard Worker     } catch (Exception e) {
4231*795d594fSAndroid Build Coastguard Worker       System.out.println(e.getClass().getName());
4232*795d594fSAndroid Build Coastguard Worker     }
4233*795d594fSAndroid Build Coastguard Worker     assertIntEquals(iarray[0], 1);
4234*795d594fSAndroid Build Coastguard Worker     assertIntEquals(iarray[1], 1);
4235*795d594fSAndroid Build Coastguard Worker     assertIntEquals(iarray[2], 1);
4236*795d594fSAndroid Build Coastguard Worker     assertDoubleEquals(darray[0], Math.PI);
4237*795d594fSAndroid Build Coastguard Worker     assertDoubleEquals(darray[1], Math.PI);
4238*795d594fSAndroid Build Coastguard Worker     assertDoubleEquals(darray[2], Math.PI);
4239*795d594fSAndroid Build Coastguard Worker 
4240*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testAllocationEliminationOfArray1(), 11);
4241*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testAllocationEliminationOfArray2(), 11);
4242*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testAllocationEliminationOfArray3(2), 4);
4243*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testAllocationEliminationOfArray4(2), 6);
4244*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testAllocationEliminationOfArray5(2), 12);
4245*795d594fSAndroid Build Coastguard Worker     try {
4246*795d594fSAndroid Build Coastguard Worker       testAllocationEliminationOfArray5(-2);
4247*795d594fSAndroid Build Coastguard Worker     } catch (NegativeArraySizeException e) {
4248*795d594fSAndroid Build Coastguard Worker       System.out.println("Got NegativeArraySizeException.");
4249*795d594fSAndroid Build Coastguard Worker     }
4250*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testAllocationEliminationOfArray6(true), 11);
4251*795d594fSAndroid Build Coastguard Worker 
4252*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testStoreStore().i, 41);
4253*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testStoreStore().j, 43);
4254*795d594fSAndroid Build Coastguard Worker 
4255*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testExitMerge(true), 2);
4256*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testExitMerge2(true), 2);
4257*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testExitMerge2(false), 2);
4258*795d594fSAndroid Build Coastguard Worker 
4259*795d594fSAndroid Build Coastguard Worker     TestClass2 testclass2 = new TestClass2();
4260*795d594fSAndroid Build Coastguard Worker     testStoreStore2(testclass2);
4261*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testclass2.i, 43);
4262*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testclass2.j, 44);
4263*795d594fSAndroid Build Coastguard Worker 
4264*795d594fSAndroid Build Coastguard Worker     testStoreStore3(testclass2, true);
4265*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testclass2.i, 41);
4266*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testclass2.j, 43);
4267*795d594fSAndroid Build Coastguard Worker     testStoreStore3(testclass2, false);
4268*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testclass2.i, 41);
4269*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testclass2.j, 44);
4270*795d594fSAndroid Build Coastguard Worker 
4271*795d594fSAndroid Build Coastguard Worker     testStoreStore4();
4272*795d594fSAndroid Build Coastguard Worker     assertIntEquals(TestClass.si, 62);
4273*795d594fSAndroid Build Coastguard Worker 
4274*795d594fSAndroid Build Coastguard Worker     int ret = testStoreStore5(testclass2, testclass2);
4275*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testclass2.i, 72);
4276*795d594fSAndroid Build Coastguard Worker     assertIntEquals(ret, 71);
4277*795d594fSAndroid Build Coastguard Worker 
4278*795d594fSAndroid Build Coastguard Worker     testclass2.j = 88;
4279*795d594fSAndroid Build Coastguard Worker     ret = testStoreStore6(testclass2, testclass2);
4280*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testclass2.i, 82);
4281*795d594fSAndroid Build Coastguard Worker     assertIntEquals(ret, 88);
4282*795d594fSAndroid Build Coastguard Worker 
4283*795d594fSAndroid Build Coastguard Worker     ret = testNoSideEffects(iarray);
4284*795d594fSAndroid Build Coastguard Worker     assertIntEquals(iarray[0], 101);
4285*795d594fSAndroid Build Coastguard Worker     assertIntEquals(iarray[1], 103);
4286*795d594fSAndroid Build Coastguard Worker     assertIntEquals(ret, 108);
4287*795d594fSAndroid Build Coastguard Worker 
4288*795d594fSAndroid Build Coastguard Worker     try {
4289*795d594fSAndroid Build Coastguard Worker       testThrow(testclass2, new Exception());
4290*795d594fSAndroid Build Coastguard Worker     } catch (Exception e) {}
4291*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testclass2.i, 55);
4292*795d594fSAndroid Build Coastguard Worker 
4293*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testStoreStoreWithDeoptimize(new int[4]), 4);
4294*795d594fSAndroid Build Coastguard Worker 
4295*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testByteArrayDefaultValue(), 0);
4296*795d594fSAndroid Build Coastguard Worker 
4297*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge1(true), 1);
4298*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge1(false), 1);
4299*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge2(true), 2);
4300*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge2(false), 3);
4301*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge3(true), 2);
4302*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge3(false), 1);
4303*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge4(true), 2);
4304*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge4(false), 2);
4305*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge5(new int[]{ 7 }, true), 7);
4306*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge5(new int[]{ 9 }, false), 9);
4307*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge6(new int[1], true, true), 1);
4308*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge6(new int[1], true, false), 2);
4309*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge6(new int[1], false, true), 2);
4310*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge6(new int[1], false, false), 1);
4311*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge7(new int[2], true, true), 1);
4312*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge7(new int[2], true, false), 2);
4313*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge7(new int[2], false, true), 0);
4314*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge7(new int[2], false, false), 0);
4315*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge8(true), 0);
4316*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLocalArrayMerge8(false), 0);
4317*795d594fSAndroid Build Coastguard Worker 
4318*795d594fSAndroid Build Coastguard Worker     TestClass[] tca = new TestClass[] { new TestClass(), null };
4319*795d594fSAndroid Build Coastguard Worker     try {
4320*795d594fSAndroid Build Coastguard Worker       $noinline$testThrowingArraySet(tca, new TestClass2());
4321*795d594fSAndroid Build Coastguard Worker     } catch (ArrayStoreException expected) {
4322*795d594fSAndroid Build Coastguard Worker       if (tca[0] != null) {
4323*795d594fSAndroid Build Coastguard Worker         throw new Error("tca[0] is not null");
4324*795d594fSAndroid Build Coastguard Worker       }
4325*795d594fSAndroid Build Coastguard Worker       if (tca[1] == null) {
4326*795d594fSAndroid Build Coastguard Worker         throw new Error("tca[1] is null");
4327*795d594fSAndroid Build Coastguard Worker       }
4328*795d594fSAndroid Build Coastguard Worker     }
4329*795d594fSAndroid Build Coastguard Worker 
4330*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop1(new TestClass(), 0), 0);
4331*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop1(new TestClass(), 1), 0);
4332*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop1(new TestClass(), 2), 1);
4333*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop1(new TestClass(), 3), 2);
4334*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop2(new TestClass(), 0), 1);
4335*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop2(new TestClass(), 1), 1);
4336*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop2(new TestClass(), 2), 1);
4337*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop2(new TestClass(), 3), 1);
4338*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop3(new TestClass(), 0), 1);
4339*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop3(new TestClass(), 1), 1);
4340*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop3(new TestClass(), 2), 1);
4341*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop3(new TestClass(), 3), 1);
4342*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop4(new TestClass(), 0), 0);
4343*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop4(new TestClass(), 1), 1);
4344*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop4(new TestClass(), 2), 2);
4345*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop4(new TestClass(), 3), 3);
4346*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop5(new TestClass(), 0), 0);
4347*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop5(new TestClass(), 1), 1);
4348*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop5(new TestClass(), 2), 2);
4349*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop5(new TestClass(), 3), 3);
4350*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop6(new TestClass(), 0), 0);
4351*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop6(new TestClass(), 1), 1);
4352*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop6(new TestClass(), 2), 2);
4353*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop6(new TestClass(), 3), 3);
4354*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop7(0), 0);
4355*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop7(1), 0);
4356*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop7(2), 0);
4357*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop7(3), 0);
4358*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop8(0), 1);
4359*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop8(1), 0);
4360*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop8(2), 1);
4361*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop8(3), 0);
4362*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop9(new TestClass(), 0), 0);
4363*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop9(new TestClass(), 1), 1);
4364*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop9(new TestClass(), 2), 2);
4365*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop9(new TestClass(), 3), 3);
4366*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop10(new TestClass(), 0), 2);
4367*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop10(new TestClass(), 1), 2);
4368*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop10(new TestClass(), 2), 2);
4369*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop10(new TestClass(), 3), 2);
4370*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop11(new TestClass(), 0), 1);
4371*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop11(new TestClass(), 1), 3);
4372*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop11(new TestClass(), 2), 2);
4373*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop11(new TestClass(), 3), 3);
4374*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop12(new TestClass(), 0), 1);
4375*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop12(new TestClass(), 1), 2);
4376*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop12(new TestClass(), 2), 3);
4377*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop12(new TestClass(), 3), 2);
4378*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop13(new TestClass(1, 2), 0), 0);
4379*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop13(new TestClass(1, 2), 1), 0);
4380*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop13(new TestClass(1, 2), 2), 0);
4381*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop13(new TestClass(1, 2), 3), 1);
4382*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop14(new TestClass2(), 0), 0);
4383*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop14(new TestClass2(), 1), 0);
4384*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop14(new TestClass2(), 2), 0);
4385*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop14(new TestClass2(), 3), 1);
4386*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop15(0), 0);
4387*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop15(1), 1);
4388*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop15(2), 1);
4389*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop15(3), 1);
4390*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop16(new TestClass(), 0), 0);
4391*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop16(new TestClass(), 1), 1);
4392*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop16(new TestClass(), 2), 2);
4393*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop16(new TestClass(), 3), 3);
4394*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop17(new TestClass(), 0), 2);
4395*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop17(new TestClass(), 1), 4);
4396*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop17(new TestClass(), 2), 2);
4397*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop17(new TestClass(), 3), 4);
4398*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop18(new TestClass(), 0), 0);
4399*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop18(new TestClass(), 1), 1);
4400*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop18(new TestClass(), 2), 2);
4401*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop18(new TestClass(), 3), 3);
4402*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop19(new TestClass(), 0), 0);
4403*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop19(new TestClass(), 1), 1);
4404*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop19(new TestClass(), 2), 2);
4405*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop19(new TestClass(), 3), 3);
4406*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop20(new TestClass(), 0), 0);
4407*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop20(new TestClass(), 1), 1);
4408*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop20(new TestClass(), 2), 2);
4409*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop20(new TestClass(), 3), 3);
4410*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop21(new TestClass(), 0), 0);
4411*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop21(new TestClass(), 1), 1);
4412*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop21(new TestClass(), 2), 2);
4413*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop21(new TestClass(), 3), 3);
4414*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop22(new TestClass(), 0), 0);
4415*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop22(new TestClass(), 1), 1);
4416*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop22(new TestClass(), 2), 2);
4417*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop22(new TestClass(), 3), 3);
4418*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop23(new TestClass(), 0), -1);
4419*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop23(new TestClass(), 1), 2);
4420*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop23(new TestClass(), 2), 1);
4421*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop23(new TestClass(), 3), 2);
4422*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop24(new TestClass(), 0), -1);
4423*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop24(new TestClass(), 1), 2);
4424*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop24(new TestClass(), 2), 1);
4425*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop24(new TestClass(), 3), -2);
4426*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop25(new TestClass(), 0), 2);
4427*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop25(new TestClass(), 1), 2);
4428*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop25(new TestClass(), 2), 4);
4429*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop25(new TestClass(), 3), -1);
4430*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop26(new TestClass(), 0), 1);
4431*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop26(new TestClass(), 1), 0);
4432*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop26(new TestClass(), 2), 0);
4433*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop26(new TestClass(), 3), 0);
4434*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop27(new TestClass(), 0), 1);
4435*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop27(new TestClass(), 1), 1);
4436*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop27(new TestClass(), 2), 0);
4437*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop27(new TestClass(), 3), 0);
4438*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop28(new TestClass(1, 2), 0), 0);
4439*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop28(new TestClass(1, 2), 1), 0);
4440*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop28(new TestClass(1, 2), 2), 0);
4441*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop28(new TestClass(1, 2), 3), 1);
4442*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop29(0), 0);
4443*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop29(1), 1);
4444*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop29(2), 3);
4445*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop29(3), 6);
4446*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop30(0), 0);
4447*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop30(1), 1);
4448*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop30(2), 2);
4449*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop30(3), 3);
4450*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop31(0), 0);
4451*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop31(1), 0);
4452*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop31(2), 0);
4453*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop31(3), 0);
4454*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop32(new TestClass(), 0), -1);
4455*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop32(new TestClass(), 1), 2);
4456*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop32(new TestClass(), 2), 1);
4457*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop32(new TestClass(), 3), -2);
4458*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop33(new TestClass(), 0), 0);
4459*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop33(new TestClass(), 1), 0);
4460*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop33(new TestClass(), 2), 0);
4461*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop33(new TestClass(), 3), 0);
4462*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop34(0), 0);
4463*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop34(1), 1);
4464*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop34(2), 3);
4465*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop34(3), 6);
4466*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop35(0), 0);
4467*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop35(1), 1);
4468*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop35(2), 3);
4469*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop35(3), 6);
4470*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop36(4), 6);
4471*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop37(4), 6);
4472*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testLoop38(4, new int[4]), 0);
4473*795d594fSAndroid Build Coastguard Worker 
4474*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop1(new TestClass(), 0), 1);
4475*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop1(new TestClass(), 1), 1);
4476*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop1(new TestClass(), 2), 1);
4477*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop1(new TestClass(), 3), 1);
4478*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop2(new TestClass(), 0), 1);
4479*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop2(new TestClass(), 1), 2);
4480*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop2(new TestClass(), 2), 2);
4481*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop2(new TestClass(), 3), 2);
4482*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop3(new TestClass(), 0), 1);
4483*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop3(new TestClass(), 1), 2);
4484*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop3(new TestClass(), 2), 2);
4485*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop3(new TestClass(), 3), 2);
4486*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop4(new TestClass(), 0), 1);
4487*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop4(new TestClass(), 1), 1);
4488*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop4(new TestClass(), 2), 2);
4489*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop4(new TestClass(), 3), 2);
4490*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop5(new TestClass(), 0), 1);
4491*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop5(new TestClass(), 1), 2);
4492*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop5(new TestClass(), 2), 2);
4493*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop5(new TestClass(), 3), 2);
4494*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop6(new TestClass(), 0), 1);
4495*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop6(new TestClass(), 1), 1);
4496*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop6(new TestClass(), 2), 2);
4497*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop6(new TestClass(), 3), 2);
4498*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop7(new TestClass(), 0), 0);
4499*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop7(new TestClass(), 1), 1);
4500*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop7(new TestClass(), 2), 2);
4501*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop7(new TestClass(), 3), 3);
4502*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop8(new TestClass(), 0), 0);
4503*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop8(new TestClass(), 1), 0);
4504*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop8(new TestClass(), 2), 0);
4505*795d594fSAndroid Build Coastguard Worker     assertIntEquals(testNestedLoop8(new TestClass(), 3), 0);
4506*795d594fSAndroid Build Coastguard Worker     assertLongEquals(testOverlapLoop(10), 34l);
4507*795d594fSAndroid Build Coastguard Worker     assertLongEquals(testOverlapLoop(50), 7778742049l);
4508*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testPartialEscape1(new TestClass(), true), 1);
4509*795d594fSAndroid Build Coastguard Worker     assertIntEquals($noinline$testPartialEscape1(new TestClass(), false), 0);
4510*795d594fSAndroid Build Coastguard Worker   }
4511*795d594fSAndroid Build Coastguard Worker }
4512