1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker public class Main { 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.keepTest(Main) instruction_simplifier (before) 20*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 21*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.keepTest(Main) instruction_simplifier (after) 24*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 25*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect keepTest(Main m)26*795d594fSAndroid Build Coastguard Worker public Main keepTest(Main m) { 27*795d594fSAndroid Build Coastguard Worker return m.g(); 28*795d594fSAndroid Build Coastguard Worker } 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.thisTest() builder (after) 31*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck 32*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect thisTest()33*795d594fSAndroid Build Coastguard Worker public Main thisTest() { 34*795d594fSAndroid Build Coastguard Worker return g(); 35*795d594fSAndroid Build Coastguard Worker } 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.newInstanceRemoveTest() builder (after) 38*795d594fSAndroid Build Coastguard Worker /// CHECK: NewInstance 39*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect 40*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.newInstanceRemoveTest() builder (after) 43*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck newInstanceRemoveTest()44*795d594fSAndroid Build Coastguard Worker public Main newInstanceRemoveTest() { 45*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 46*795d594fSAndroid Build Coastguard Worker return m.g(); 47*795d594fSAndroid Build Coastguard Worker } 48*795d594fSAndroid Build Coastguard Worker 49*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.newArrayRemoveTest() builder (after) 50*795d594fSAndroid Build Coastguard Worker /// CHECK: NewArray 51*795d594fSAndroid Build Coastguard Worker /// CHECK: ArrayGet 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.newArrayRemoveTest() builder (after) 54*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck newArrayRemoveTest()55*795d594fSAndroid Build Coastguard Worker public Main newArrayRemoveTest() { 56*795d594fSAndroid Build Coastguard Worker Main[] ms = new Main[1]; 57*795d594fSAndroid Build Coastguard Worker return ms[0]; 58*795d594fSAndroid Build Coastguard Worker } 59*795d594fSAndroid Build Coastguard Worker 60*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.ifRemoveTest(boolean) instruction_simplifier (before) 61*795d594fSAndroid Build Coastguard Worker /// CHECK: NewInstance 62*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.ifRemoveTest(boolean) instruction_simplifier (after) 65*795d594fSAndroid Build Coastguard Worker /// CHECK: NewInstance 66*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck ifRemoveTest(boolean flag)67*795d594fSAndroid Build Coastguard Worker public Main ifRemoveTest(boolean flag) { 68*795d594fSAndroid Build Coastguard Worker Main m = null; 69*795d594fSAndroid Build Coastguard Worker if (flag) { 70*795d594fSAndroid Build Coastguard Worker m = new Main(); 71*795d594fSAndroid Build Coastguard Worker } else { 72*795d594fSAndroid Build Coastguard Worker m = new Main(1); 73*795d594fSAndroid Build Coastguard Worker } 74*795d594fSAndroid Build Coastguard Worker return m.g(); 75*795d594fSAndroid Build Coastguard Worker } 76*795d594fSAndroid Build Coastguard Worker 77*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.ifKeepTest(boolean) instruction_simplifier (before) 78*795d594fSAndroid Build Coastguard Worker /// CHECK: NewInstance 79*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.ifKeepTest(boolean) instruction_simplifier (after) 82*795d594fSAndroid Build Coastguard Worker /// CHECK: NewInstance 83*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck ifKeepTest(boolean flag)84*795d594fSAndroid Build Coastguard Worker public Main ifKeepTest(boolean flag) { 85*795d594fSAndroid Build Coastguard Worker Main m = null; 86*795d594fSAndroid Build Coastguard Worker if (flag) { 87*795d594fSAndroid Build Coastguard Worker m = new Main(1); 88*795d594fSAndroid Build Coastguard Worker } 89*795d594fSAndroid Build Coastguard Worker return m.g(); 90*795d594fSAndroid Build Coastguard Worker } 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.forRemoveTest(int) instruction_simplifier (before) 93*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 94*795d594fSAndroid Build Coastguard Worker 95*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.forRemoveTest(int) instruction_simplifier (after) 96*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck forRemoveTest(int count)97*795d594fSAndroid Build Coastguard Worker public Main forRemoveTest(int count) { 98*795d594fSAndroid Build Coastguard Worker Main a = new Main(); 99*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 100*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < count; i++) { 101*795d594fSAndroid Build Coastguard Worker if (i % 2 == 0) { 102*795d594fSAndroid Build Coastguard Worker m = a; 103*795d594fSAndroid Build Coastguard Worker } 104*795d594fSAndroid Build Coastguard Worker } 105*795d594fSAndroid Build Coastguard Worker return m.g(); 106*795d594fSAndroid Build Coastguard Worker } 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.forKeepTest(int) instruction_simplifier (before) 109*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 110*795d594fSAndroid Build Coastguard Worker 111*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.forKeepTest(int) instruction_simplifier (after) 112*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck forKeepTest(int count)113*795d594fSAndroid Build Coastguard Worker public Main forKeepTest(int count) { 114*795d594fSAndroid Build Coastguard Worker Main a = new Main(); 115*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 116*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < count; i++) { 117*795d594fSAndroid Build Coastguard Worker if (i % 2 == 0) { 118*795d594fSAndroid Build Coastguard Worker m = a; 119*795d594fSAndroid Build Coastguard Worker } else { 120*795d594fSAndroid Build Coastguard Worker m = null; 121*795d594fSAndroid Build Coastguard Worker } 122*795d594fSAndroid Build Coastguard Worker } 123*795d594fSAndroid Build Coastguard Worker return m.g(); 124*795d594fSAndroid Build Coastguard Worker } 125*795d594fSAndroid Build Coastguard Worker 126*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.phiFlowRemoveTest(int) instruction_simplifier (before) 127*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 128*795d594fSAndroid Build Coastguard Worker 129*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.phiFlowRemoveTest(int) instruction_simplifier (after) 130*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck phiFlowRemoveTest(int count)131*795d594fSAndroid Build Coastguard Worker public Main phiFlowRemoveTest(int count) { 132*795d594fSAndroid Build Coastguard Worker Main a = new Main(); 133*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 134*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < count; i++) { 135*795d594fSAndroid Build Coastguard Worker if (i % 2 == 0) { 136*795d594fSAndroid Build Coastguard Worker m = a; 137*795d594fSAndroid Build Coastguard Worker } 138*795d594fSAndroid Build Coastguard Worker } 139*795d594fSAndroid Build Coastguard Worker Main n = new Main(); 140*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < count; i++) { 141*795d594fSAndroid Build Coastguard Worker if (i % 3 == 0) { 142*795d594fSAndroid Build Coastguard Worker n = m; 143*795d594fSAndroid Build Coastguard Worker } 144*795d594fSAndroid Build Coastguard Worker } 145*795d594fSAndroid Build Coastguard Worker return n.g(); 146*795d594fSAndroid Build Coastguard Worker } 147*795d594fSAndroid Build Coastguard Worker 148*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.phiFlowKeepTest(int) instruction_simplifier (before) 149*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 150*795d594fSAndroid Build Coastguard Worker 151*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.phiFlowKeepTest(int) instruction_simplifier (after) 152*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck phiFlowKeepTest(int count)153*795d594fSAndroid Build Coastguard Worker public Main phiFlowKeepTest(int count) { 154*795d594fSAndroid Build Coastguard Worker Main a = new Main(); 155*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 156*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < count; i++) { 157*795d594fSAndroid Build Coastguard Worker if (i % 2 == 0) { 158*795d594fSAndroid Build Coastguard Worker m = a; 159*795d594fSAndroid Build Coastguard Worker } else { 160*795d594fSAndroid Build Coastguard Worker m = null; 161*795d594fSAndroid Build Coastguard Worker } 162*795d594fSAndroid Build Coastguard Worker } 163*795d594fSAndroid Build Coastguard Worker Main n = new Main(); 164*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < count; i++) { 165*795d594fSAndroid Build Coastguard Worker if (i % 3 == 0) { 166*795d594fSAndroid Build Coastguard Worker n = m; 167*795d594fSAndroid Build Coastguard Worker } 168*795d594fSAndroid Build Coastguard Worker } 169*795d594fSAndroid Build Coastguard Worker return n.g(); 170*795d594fSAndroid Build Coastguard Worker } 171*795d594fSAndroid Build Coastguard Worker 172*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.scopeRemoveTest(int, Main) builder (after) 173*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck scopeRemoveTest(int count, Main a)174*795d594fSAndroid Build Coastguard Worker public Main scopeRemoveTest(int count, Main a) { 175*795d594fSAndroid Build Coastguard Worker Main m = null; 176*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < count; i++) { 177*795d594fSAndroid Build Coastguard Worker if (i % 2 == 0) { 178*795d594fSAndroid Build Coastguard Worker m = new Main(); 179*795d594fSAndroid Build Coastguard Worker m.g(); 180*795d594fSAndroid Build Coastguard Worker } else { 181*795d594fSAndroid Build Coastguard Worker m = a; 182*795d594fSAndroid Build Coastguard Worker } 183*795d594fSAndroid Build Coastguard Worker } 184*795d594fSAndroid Build Coastguard Worker return m; 185*795d594fSAndroid Build Coastguard Worker } 186*795d594fSAndroid Build Coastguard Worker 187*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.scopeKeepTest(int, Main) instruction_simplifier (before) 188*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 189*795d594fSAndroid Build Coastguard Worker 190*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.scopeKeepTest(int, Main) instruction_simplifier (after) 191*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck scopeKeepTest(int count, Main a)192*795d594fSAndroid Build Coastguard Worker public Main scopeKeepTest(int count, Main a) { 193*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 194*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < count; i++) { 195*795d594fSAndroid Build Coastguard Worker if (i % 2 == 0) { 196*795d594fSAndroid Build Coastguard Worker m = a; 197*795d594fSAndroid Build Coastguard Worker } else { 198*795d594fSAndroid Build Coastguard Worker m = a; 199*795d594fSAndroid Build Coastguard Worker m.g(); 200*795d594fSAndroid Build Coastguard Worker } 201*795d594fSAndroid Build Coastguard Worker } 202*795d594fSAndroid Build Coastguard Worker return m; 203*795d594fSAndroid Build Coastguard Worker } 204*795d594fSAndroid Build Coastguard Worker 205*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.scopeIfNotNullRemove(Main) instruction_simplifier (before) 206*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 207*795d594fSAndroid Build Coastguard Worker 208*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.scopeIfNotNullRemove(Main) instruction_simplifier (after) 209*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck scopeIfNotNullRemove(Main m)210*795d594fSAndroid Build Coastguard Worker public Main scopeIfNotNullRemove(Main m) { 211*795d594fSAndroid Build Coastguard Worker if (m != null) { 212*795d594fSAndroid Build Coastguard Worker return m.g(); 213*795d594fSAndroid Build Coastguard Worker } 214*795d594fSAndroid Build Coastguard Worker return m; 215*795d594fSAndroid Build Coastguard Worker } 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.scopeIfKeep(Main) instruction_simplifier (before) 218*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 219*795d594fSAndroid Build Coastguard Worker 220*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Main Main.scopeIfKeep(Main) instruction_simplifier (after) 221*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck scopeIfKeep(Main m)222*795d594fSAndroid Build Coastguard Worker public Main scopeIfKeep(Main m) { 223*795d594fSAndroid Build Coastguard Worker if (m == null) { 224*795d594fSAndroid Build Coastguard Worker m = new Main(); 225*795d594fSAndroid Build Coastguard Worker } 226*795d594fSAndroid Build Coastguard Worker return m.g(); 227*795d594fSAndroid Build Coastguard Worker } 228*795d594fSAndroid Build Coastguard Worker Main()229*795d594fSAndroid Build Coastguard Worker public Main() {} Main(int unused)230*795d594fSAndroid Build Coastguard Worker public Main(int unused) {} 231*795d594fSAndroid Build Coastguard Worker g()232*795d594fSAndroid Build Coastguard Worker private Main g() { 233*795d594fSAndroid Build Coastguard Worker // avoids inlining 234*795d594fSAndroid Build Coastguard Worker throw new RuntimeException(); 235*795d594fSAndroid Build Coastguard Worker } 236*795d594fSAndroid Build Coastguard Worker main(String[] args)237*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 238*795d594fSAndroid Build Coastguard Worker new Main(); 239*795d594fSAndroid Build Coastguard Worker } 240*795d594fSAndroid Build Coastguard Worker 241*795d594fSAndroid Build Coastguard Worker } 242*795d594fSAndroid Build Coastguard Worker 243*795d594fSAndroid Build Coastguard Worker // Regression for when we created and kept equivalent phis with the same type. 244*795d594fSAndroid Build Coastguard Worker // The phi used in comparison would be different then the one used for access 245*795d594fSAndroid Build Coastguard Worker // so we could not safely discard it. 246*795d594fSAndroid Build Coastguard Worker class ListElement { 247*795d594fSAndroid Build Coastguard Worker private ListElement next; 248*795d594fSAndroid Build Coastguard Worker 249*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean ListElement.isShorter(ListElement, ListElement) instruction_simplifier (before) 250*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 251*795d594fSAndroid Build Coastguard Worker /// CHECK: NullCheck 252*795d594fSAndroid Build Coastguard Worker 253*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean ListElement.isShorter(ListElement, ListElement) instruction_simplifier (after) 254*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck isShorter(ListElement x, ListElement y)255*795d594fSAndroid Build Coastguard Worker static boolean isShorter(ListElement x, ListElement y) { 256*795d594fSAndroid Build Coastguard Worker ListElement xTail = x; 257*795d594fSAndroid Build Coastguard Worker ListElement yTail = y; 258*795d594fSAndroid Build Coastguard Worker while (yTail != null) { 259*795d594fSAndroid Build Coastguard Worker if (xTail == null) return true; 260*795d594fSAndroid Build Coastguard Worker xTail = xTail.next; 261*795d594fSAndroid Build Coastguard Worker yTail = yTail.next; 262*795d594fSAndroid Build Coastguard Worker } 263*795d594fSAndroid Build Coastguard Worker return false; 264*795d594fSAndroid Build Coastguard Worker } 265*795d594fSAndroid Build Coastguard Worker } 266