blob: 17b11db29533380b410eeb6673669f923ed54c52 [file] [log] [blame]
Calin Juravle12617592015-10-16 16:28:46 +01001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17final class Final {
18 public String toString() {
19 return "final";
20 }
21}
22
23public class Main {
David Brazdilbadd8262016-02-02 16:28:56 +000024 /// CHECK-START: Final Main.testKeepCheckCast(java.lang.Object, boolean) builder (after)
Calin Juravle12617592015-10-16 16:28:46 +010025 /// CHECK: <<Phi:l\d+>> Phi klass:java.lang.Object
26 /// CHECK: <<Class:l\d+>> LoadClass
27 /// CHECK: CheckCast [<<Phi>>,<<Class>>]
28 /// CHECK: <<Ret:l\d+>> BoundType [<<Phi>>] klass:Final
29 /// CHECK: Return [<<Ret>>]
30
David Brazdil4833f5a2015-12-16 10:37:39 +000031 /// CHECK-START: Final Main.testKeepCheckCast(java.lang.Object, boolean) instruction_simplifier (after)
Calin Juravle12617592015-10-16 16:28:46 +010032 /// CHECK: <<Phi:l\d+>> Phi
33 /// CHECK: <<Class:l\d+>> LoadClass
34 /// CHECK: CheckCast [<<Phi>>,<<Class>>]
35 /// CHECK: <<Ret:l\d+>> BoundType [<<Phi>>]
36 /// CHECK: Return [<<Ret>>]
37 public static Final testKeepCheckCast(Object o, boolean cond) {
38 Object x = new Final();
39 while (cond) {
40 x = o;
41 cond = false;
42 }
43 return (Final) x;
44 }
45
David Brazdilbadd8262016-02-02 16:28:56 +000046 /// CHECK-START: void Main.testKeepInstanceOf(java.lang.Object, boolean) builder (after)
Calin Juravle12617592015-10-16 16:28:46 +010047 /// CHECK: <<Phi:l\d+>> Phi klass:java.lang.Object
48 /// CHECK: <<Class:l\d+>> LoadClass
49 /// CHECK: InstanceOf [<<Phi>>,<<Class>>]
50
51 /// CHECK-START: void Main.testKeepInstanceOf(java.lang.Object, boolean) dead_code_elimination (after)
52 /// CHECK: <<Phi:l\d+>> Phi
53 /// CHECK: <<Class:l\d+>> LoadClass
54 /// CHECK: InstanceOf [<<Phi>>,<<Class>>]
55 public static void testKeepInstanceOf(Object o, boolean cond) {
56 Object x = new Final();
57 while (cond) {
58 x = o;
59 cond = false;
60 }
61 if (x instanceof Final) {
62 System.out.println("instanceof succeed");
63 } else {
64 System.out.println("instanceof failed");
65 }
66 }
67
David Brazdilbadd8262016-02-02 16:28:56 +000068 /// CHECK-START: java.lang.String Main.testNoInline(java.lang.Object, boolean) builder (after)
Calin Juravle12617592015-10-16 16:28:46 +010069 /// CHECK: <<Phi:l\d+>> Phi klass:java.lang.Object
70 /// CHECK: <<NC:l\d+>> NullCheck [<<Phi>>]
71 /// CHECK: <<Ret:l\d+>> InvokeVirtual [<<NC>>] method_name:java.lang.Object.toString
72 /// CHECK: Return [<<Ret>>]
73
74 /// CHECK-START: java.lang.String Main.testNoInline(java.lang.Object, boolean) inliner (after)
75 /// CHECK: <<Phi:l\d+>> Phi
76 /// CHECK: <<NC:l\d+>> NullCheck [<<Phi>>]
77 /// CHECK: <<Ret:l\d+>> InvokeVirtual [<<NC>>] method_name:java.lang.Object.toString
78 /// CHECK: Return [<<Ret>>]
79 public static String testNoInline(Object o, boolean cond) {
80 Object x = new Final();
81 while (cond) {
82 x = o;
83 cond = false;
84 }
85 return x.toString();
86 }
87
88 public static void main(String[] args) {
89 try {
90 testKeepCheckCast(new Object(), true);
91 throw new Error("Expected check cast exception");
92 } catch (ClassCastException e) {
93 // expected
94 }
95
96 testKeepInstanceOf(new Object(), true);
97
98 if ("final".equals(testNoInline(new Object(), true))) {
99 throw new Error("Bad inlining");
100 }
101 }
102}