112617599757b625bd59e6c62e022c30735073622Calin Juravle/* 212617599757b625bd59e6c62e022c30735073622Calin Juravle * Copyright (C) 2015 The Android Open Source Project 312617599757b625bd59e6c62e022c30735073622Calin Juravle * 412617599757b625bd59e6c62e022c30735073622Calin Juravle * Licensed under the Apache License, Version 2.0 (the "License"); 512617599757b625bd59e6c62e022c30735073622Calin Juravle * you may not use this file except in compliance with the License. 612617599757b625bd59e6c62e022c30735073622Calin Juravle * You may obtain a copy of the License at 712617599757b625bd59e6c62e022c30735073622Calin Juravle * 812617599757b625bd59e6c62e022c30735073622Calin Juravle * http://www.apache.org/licenses/LICENSE-2.0 912617599757b625bd59e6c62e022c30735073622Calin Juravle * 1012617599757b625bd59e6c62e022c30735073622Calin Juravle * Unless required by applicable law or agreed to in writing, software 1112617599757b625bd59e6c62e022c30735073622Calin Juravle * distributed under the License is distributed on an "AS IS" BASIS, 1212617599757b625bd59e6c62e022c30735073622Calin Juravle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1312617599757b625bd59e6c62e022c30735073622Calin Juravle * See the License for the specific language governing permissions and 1412617599757b625bd59e6c62e022c30735073622Calin Juravle * limitations under the License. 1512617599757b625bd59e6c62e022c30735073622Calin Juravle */ 1612617599757b625bd59e6c62e022c30735073622Calin Juravle 1712617599757b625bd59e6c62e022c30735073622Calin Juravlefinal class Final { 1812617599757b625bd59e6c62e022c30735073622Calin Juravle public String toString() { 1912617599757b625bd59e6c62e022c30735073622Calin Juravle return "final"; 2012617599757b625bd59e6c62e022c30735073622Calin Juravle } 2112617599757b625bd59e6c62e022c30735073622Calin Juravle} 2212617599757b625bd59e6c62e022c30735073622Calin Juravle 2312617599757b625bd59e6c62e022c30735073622Calin Juravlepublic class Main { 24badd826664896d4a9628a5a89b78016894aa414bDavid Brazdil /// CHECK-START: Final Main.testKeepCheckCast(java.lang.Object, boolean) builder (after) 2512617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Phi:l\d+>> Phi klass:java.lang.Object 2612617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Class:l\d+>> LoadClass 2712617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: CheckCast [<<Phi>>,<<Class>>] 2812617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Ret:l\d+>> BoundType [<<Phi>>] klass:Final 2912617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: Return [<<Ret>>] 3012617599757b625bd59e6c62e022c30735073622Calin Juravle 314833f5a1990c76bc2be89504225fb13cca22bedfDavid Brazdil /// CHECK-START: Final Main.testKeepCheckCast(java.lang.Object, boolean) instruction_simplifier (after) 3212617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Phi:l\d+>> Phi 3312617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Class:l\d+>> LoadClass 3412617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: CheckCast [<<Phi>>,<<Class>>] 3512617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Ret:l\d+>> BoundType [<<Phi>>] 3612617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: Return [<<Ret>>] 3712617599757b625bd59e6c62e022c30735073622Calin Juravle public static Final testKeepCheckCast(Object o, boolean cond) { 3812617599757b625bd59e6c62e022c30735073622Calin Juravle Object x = new Final(); 3912617599757b625bd59e6c62e022c30735073622Calin Juravle while (cond) { 4012617599757b625bd59e6c62e022c30735073622Calin Juravle x = o; 4112617599757b625bd59e6c62e022c30735073622Calin Juravle cond = false; 4212617599757b625bd59e6c62e022c30735073622Calin Juravle } 4312617599757b625bd59e6c62e022c30735073622Calin Juravle return (Final) x; 4412617599757b625bd59e6c62e022c30735073622Calin Juravle } 4512617599757b625bd59e6c62e022c30735073622Calin Juravle 46badd826664896d4a9628a5a89b78016894aa414bDavid Brazdil /// CHECK-START: void Main.testKeepInstanceOf(java.lang.Object, boolean) builder (after) 4712617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Phi:l\d+>> Phi klass:java.lang.Object 4812617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Class:l\d+>> LoadClass 4912617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: InstanceOf [<<Phi>>,<<Class>>] 5012617599757b625bd59e6c62e022c30735073622Calin Juravle 5142103c6daa606d4e1753ef567836ef556be51cdcWojciech Staszkiewicz /// CHECK-START: void Main.testKeepInstanceOf(java.lang.Object, boolean) dead_code_elimination$initial (after) 5212617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Phi:l\d+>> Phi 5312617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Class:l\d+>> LoadClass 5412617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: InstanceOf [<<Phi>>,<<Class>>] 5512617599757b625bd59e6c62e022c30735073622Calin Juravle public static void testKeepInstanceOf(Object o, boolean cond) { 5612617599757b625bd59e6c62e022c30735073622Calin Juravle Object x = new Final(); 5712617599757b625bd59e6c62e022c30735073622Calin Juravle while (cond) { 5812617599757b625bd59e6c62e022c30735073622Calin Juravle x = o; 5912617599757b625bd59e6c62e022c30735073622Calin Juravle cond = false; 6012617599757b625bd59e6c62e022c30735073622Calin Juravle } 6112617599757b625bd59e6c62e022c30735073622Calin Juravle if (x instanceof Final) { 6212617599757b625bd59e6c62e022c30735073622Calin Juravle System.out.println("instanceof succeed"); 6312617599757b625bd59e6c62e022c30735073622Calin Juravle } else { 6412617599757b625bd59e6c62e022c30735073622Calin Juravle System.out.println("instanceof failed"); 6512617599757b625bd59e6c62e022c30735073622Calin Juravle } 6612617599757b625bd59e6c62e022c30735073622Calin Juravle } 6712617599757b625bd59e6c62e022c30735073622Calin Juravle 68badd826664896d4a9628a5a89b78016894aa414bDavid Brazdil /// CHECK-START: java.lang.String Main.testNoInline(java.lang.Object, boolean) builder (after) 6912617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Phi:l\d+>> Phi klass:java.lang.Object 7012617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<NC:l\d+>> NullCheck [<<Phi>>] 7112617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Ret:l\d+>> InvokeVirtual [<<NC>>] method_name:java.lang.Object.toString 7212617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: Return [<<Ret>>] 7312617599757b625bd59e6c62e022c30735073622Calin Juravle 7412617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK-START: java.lang.String Main.testNoInline(java.lang.Object, boolean) inliner (after) 7512617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Phi:l\d+>> Phi 7612617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<NC:l\d+>> NullCheck [<<Phi>>] 7712617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: <<Ret:l\d+>> InvokeVirtual [<<NC>>] method_name:java.lang.Object.toString 7812617599757b625bd59e6c62e022c30735073622Calin Juravle /// CHECK: Return [<<Ret>>] 7912617599757b625bd59e6c62e022c30735073622Calin Juravle public static String testNoInline(Object o, boolean cond) { 8012617599757b625bd59e6c62e022c30735073622Calin Juravle Object x = new Final(); 8112617599757b625bd59e6c62e022c30735073622Calin Juravle while (cond) { 8212617599757b625bd59e6c62e022c30735073622Calin Juravle x = o; 8312617599757b625bd59e6c62e022c30735073622Calin Juravle cond = false; 8412617599757b625bd59e6c62e022c30735073622Calin Juravle } 8512617599757b625bd59e6c62e022c30735073622Calin Juravle return x.toString(); 8612617599757b625bd59e6c62e022c30735073622Calin Juravle } 8712617599757b625bd59e6c62e022c30735073622Calin Juravle 8812617599757b625bd59e6c62e022c30735073622Calin Juravle public static void main(String[] args) { 8912617599757b625bd59e6c62e022c30735073622Calin Juravle try { 9012617599757b625bd59e6c62e022c30735073622Calin Juravle testKeepCheckCast(new Object(), true); 9112617599757b625bd59e6c62e022c30735073622Calin Juravle throw new Error("Expected check cast exception"); 9212617599757b625bd59e6c62e022c30735073622Calin Juravle } catch (ClassCastException e) { 9312617599757b625bd59e6c62e022c30735073622Calin Juravle // expected 9412617599757b625bd59e6c62e022c30735073622Calin Juravle } 9512617599757b625bd59e6c62e022c30735073622Calin Juravle 9612617599757b625bd59e6c62e022c30735073622Calin Juravle testKeepInstanceOf(new Object(), true); 9712617599757b625bd59e6c62e022c30735073622Calin Juravle 9812617599757b625bd59e6c62e022c30735073622Calin Juravle if ("final".equals(testNoInline(new Object(), true))) { 9912617599757b625bd59e6c62e022c30735073622Calin Juravle throw new Error("Bad inlining"); 10012617599757b625bd59e6c62e022c30735073622Calin Juravle } 10112617599757b625bd59e6c62e022c30735073622Calin Juravle } 10212617599757b625bd59e6c62e022c30735073622Calin Juravle} 103