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 { foo(Object o, int a)18*795d594fSAndroid Build Coastguard Worker public static void foo(Object o, int a) { 19*795d594fSAndroid Build Coastguard Worker Object result = null; 20*795d594fSAndroid Build Coastguard Worker if (o instanceof Main) { 21*795d594fSAndroid Build Coastguard Worker // The compiler optimizes the type of `o` by introducing 22*795d594fSAndroid Build Coastguard Worker // a `HBoundType` in this block. 23*795d594fSAndroid Build Coastguard Worker while (a != 3) { 24*795d594fSAndroid Build Coastguard Worker if (a == 2) { 25*795d594fSAndroid Build Coastguard Worker a++; 26*795d594fSAndroid Build Coastguard Worker result = o; 27*795d594fSAndroid Build Coastguard Worker continue; 28*795d594fSAndroid Build Coastguard Worker } else if (willInline()) { 29*795d594fSAndroid Build Coastguard Worker // This block will be detected as dead after inlining. 30*795d594fSAndroid Build Coastguard Worker result = new Object(); 31*795d594fSAndroid Build Coastguard Worker continue; 32*795d594fSAndroid Build Coastguard Worker } 33*795d594fSAndroid Build Coastguard Worker result = new Object(); 34*795d594fSAndroid Build Coastguard Worker } 35*795d594fSAndroid Build Coastguard Worker // The compiler produces a phi at the back edge for `result`. 36*795d594fSAndroid Build Coastguard Worker // Before dead block elimination, the phi has three inputs: 37*795d594fSAndroid Build Coastguard Worker // result = (new Object(), new Object(), HBoundType) 38*795d594fSAndroid Build Coastguard Worker // 39*795d594fSAndroid Build Coastguard Worker // After dead block elimination, the phi has now two inputs: 40*795d594fSAndroid Build Coastguard Worker // result = (new Object(), HBoundType) 41*795d594fSAndroid Build Coastguard Worker // 42*795d594fSAndroid Build Coastguard Worker // Our internal data structure for linking users and inputs expect 43*795d594fSAndroid Build Coastguard Worker // the input index stored in that data structure to be the index 44*795d594fSAndroid Build Coastguard Worker // in the inputs array. So the index before dead block elimination 45*795d594fSAndroid Build Coastguard Worker // of the `HBoundType` would be 2. Dead block elimination must update 46*795d594fSAndroid Build Coastguard Worker // that index to be 1. 47*795d594fSAndroid Build Coastguard Worker } 48*795d594fSAndroid Build Coastguard Worker System.out.println(result.getClass()); 49*795d594fSAndroid Build Coastguard Worker } 50*795d594fSAndroid Build Coastguard Worker willInline()51*795d594fSAndroid Build Coastguard Worker public static boolean willInline() { 52*795d594fSAndroid Build Coastguard Worker return false; 53*795d594fSAndroid Build Coastguard Worker } 54*795d594fSAndroid Build Coastguard Worker main(String[] args)55*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 56*795d594fSAndroid Build Coastguard Worker foo(new Main(), 2); 57*795d594fSAndroid Build Coastguard Worker } 58*795d594fSAndroid Build Coastguard Worker } 59