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