blob: f24dc4abaef9bbc46ce3c246e0ef3ebe182e9b3b [file] [log] [blame]
Calin Juravle27df7582015-04-17 19:12:31 +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
Calin Juravle3cd4fc82015-05-14 15:15:42 +010017// TODO: Add more tests after we can inline functions with calls.
Calin Juravle27df7582015-04-17 19:12:31 +010018
19class ClassWithoutFinals {
20 // CHECK-START: void ClassWithoutFinals.<init>() register (after)
David Brazdilc74652862015-05-13 17:50:09 +010021 // CHECK-NOT: MemoryBarrier kind:StoreStore
Calin Juravle27df7582015-04-17 19:12:31 +010022 public ClassWithoutFinals() {}
23}
24
25class ClassWithFinals {
26 public final int x;
27 public ClassWithFinals obj;
28
29 // CHECK-START: void ClassWithFinals.<init>(boolean) register (after)
David Brazdil71141192015-05-19 18:29:40 +010030 // CHECK: MemoryBarrier kind:StoreStore
31 // CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +010032 public ClassWithFinals(boolean cond) {
33 x = 0;
34 if (cond) {
35 // avoid inlining
36 throw new RuntimeException();
37 }
38 }
39
40 // CHECK-START: void ClassWithFinals.<init>() register (after)
David Brazdil71141192015-05-19 18:29:40 +010041 // CHECK: MemoryBarrier kind:StoreStore
42 // CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +010043 public ClassWithFinals() {
44 x = 0;
45 }
46
47 // CHECK-START: void ClassWithFinals.<init>(int) register (after)
David Brazdil71141192015-05-19 18:29:40 +010048 // CHECK: MemoryBarrier kind:StoreStore
49 // CHECK: MemoryBarrier kind:StoreStore
50 // CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +010051 public ClassWithFinals(int x) {
52 // This should have two barriers:
53 // - one for the constructor
54 // - one for the `new` which should be inlined.
55 obj = new ClassWithFinals();
56 this.x = x;
57 }
58}
59
60class InheritFromClassWithFinals extends ClassWithFinals {
61 // CHECK-START: void InheritFromClassWithFinals.<init>() register (after)
David Brazdil71141192015-05-19 18:29:40 +010062 // CHECK: MemoryBarrier kind:StoreStore
63 // CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +010064
65 // CHECK-START: void InheritFromClassWithFinals.<init>() register (after)
David Brazdil71141192015-05-19 18:29:40 +010066 // CHECK-NOT: InvokeStaticOrDirect
Calin Juravle27df7582015-04-17 19:12:31 +010067 public InheritFromClassWithFinals() {
68 // Should inline the super constructor.
69 }
70
71 // CHECK-START: void InheritFromClassWithFinals.<init>(boolean) register (after)
David Brazdil71141192015-05-19 18:29:40 +010072 // CHECK: InvokeStaticOrDirect
Calin Juravle27df7582015-04-17 19:12:31 +010073
74 // CHECK-START: void InheritFromClassWithFinals.<init>(boolean) register (after)
David Brazdil71141192015-05-19 18:29:40 +010075 // CHECK-NOT: MemoryBarrier kind:StoreStore
Calin Juravle27df7582015-04-17 19:12:31 +010076 public InheritFromClassWithFinals(boolean cond) {
77 super(cond);
78 // should not inline the super constructor
79 }
Calin Juravle3cd4fc82015-05-14 15:15:42 +010080
81 // CHECK-START: void InheritFromClassWithFinals.<init>(int) register (after)
David Brazdil71141192015-05-19 18:29:40 +010082 // CHECK: MemoryBarrier kind:StoreStore
83 // CHECK: MemoryBarrier kind:StoreStore
84 // CHECK: ReturnVoid
Calin Juravle3cd4fc82015-05-14 15:15:42 +010085
86 // CHECK-START: void InheritFromClassWithFinals.<init>(int) register (after)
David Brazdil71141192015-05-19 18:29:40 +010087 // CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +010088 public InheritFromClassWithFinals(int unused) {
89 // Should inline the super constructor and insert a memory barrier.
90
91 // Should inline the new instance call and insert another memory barrier.
92 new InheritFromClassWithFinals();
93 }
Calin Juravle27df7582015-04-17 19:12:31 +010094}
95
96class HaveFinalsAndInheritFromClassWithFinals extends ClassWithFinals {
97 final int y;
98
99 // CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>() register (after)
David Brazdil71141192015-05-19 18:29:40 +0100100 // CHECK: MemoryBarrier kind:StoreStore
101 // CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +0100102
103 // CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>() register (after)
104 // CHECK-NOT: InvokeStaticOrDirect
105 public HaveFinalsAndInheritFromClassWithFinals() {
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100106 // Should inline the super constructor and remove the memory barrier.
Calin Juravle27df7582015-04-17 19:12:31 +0100107 y = 0;
108 }
109
110 // CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(boolean) register (after)
David Brazdil71141192015-05-19 18:29:40 +0100111 // CHECK: InvokeStaticOrDirect
112 // CHECK: MemoryBarrier kind:StoreStore
113 // CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +0100114 public HaveFinalsAndInheritFromClassWithFinals(boolean cond) {
115 super(cond);
116 // should not inline the super constructor
117 y = 0;
118 }
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100119
120 // CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(int) register (after)
David Brazdil71141192015-05-19 18:29:40 +0100121 // CHECK: MemoryBarrier kind:StoreStore
122 // CHECK: MemoryBarrier kind:StoreStore
123 // CHECK: MemoryBarrier kind:StoreStore
124 // CHECK-NEXT: ReturnVoid
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100125
126 // CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(int) register (after)
David Brazdil71141192015-05-19 18:29:40 +0100127 // CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100128 public HaveFinalsAndInheritFromClassWithFinals(int unused) {
129 // Should inline the super constructor and keep just one memory barrier.
130 y = 0;
131
132 // Should inline new instance and keep one barrier.
133 new HaveFinalsAndInheritFromClassWithFinals();
134 // Should inline new instance and keep one barrier.
135 new InheritFromClassWithFinals();
136 }
Calin Juravle27df7582015-04-17 19:12:31 +0100137}
138
139public class Main {
140
141 // CHECK-START: ClassWithFinals Main.noInlineNoConstructorBarrier() register (after)
David Brazdil71141192015-05-19 18:29:40 +0100142 // CHECK: InvokeStaticOrDirect
Calin Juravle27df7582015-04-17 19:12:31 +0100143
144 // CHECK-START: ClassWithFinals Main.noInlineNoConstructorBarrier() register (after)
David Brazdil71141192015-05-19 18:29:40 +0100145 // CHECK-NOT: MemoryBarrier kind:StoreStore
Calin Juravle27df7582015-04-17 19:12:31 +0100146 public static ClassWithFinals noInlineNoConstructorBarrier() {
147 return new ClassWithFinals(false);
148 }
149
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100150 // CHECK-START: void Main.inlineNew() register (after)
David Brazdil71141192015-05-19 18:29:40 +0100151 // CHECK: MemoryBarrier kind:StoreStore
152 // CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +0100153
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100154 // CHECK-START: void Main.inlineNew() register (after)
David Brazdil71141192015-05-19 18:29:40 +0100155 // CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100156 public static void inlineNew() {
157 new ClassWithFinals();
Calin Juravle27df7582015-04-17 19:12:31 +0100158 }
159
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100160 // CHECK-START: void Main.inlineNew1() register (after)
David Brazdil71141192015-05-19 18:29:40 +0100161 // CHECK: MemoryBarrier kind:StoreStore
162 // CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +0100163
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100164 // CHECK-START: void Main.inlineNew1() register (after)
David Brazdil71141192015-05-19 18:29:40 +0100165 // CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100166 public static void inlineNew1() {
167 new InheritFromClassWithFinals();
Calin Juravle27df7582015-04-17 19:12:31 +0100168 }
169
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100170 // CHECK-START: void Main.inlineNew2() register (after)
David Brazdil71141192015-05-19 18:29:40 +0100171 // CHECK: MemoryBarrier kind:StoreStore
172 // CHECK-NEXT: ReturnVoid
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100173
174 // CHECK-START: void Main.inlineNew2() register (after)
David Brazdil71141192015-05-19 18:29:40 +0100175 // CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100176 public static void inlineNew2() {
177 new HaveFinalsAndInheritFromClassWithFinals();
178 }
179
180 // CHECK-START: void Main.inlineNew3() register (after)
David Brazdil71141192015-05-19 18:29:40 +0100181 // CHECK: MemoryBarrier kind:StoreStore
182 // CHECK: MemoryBarrier kind:StoreStore
183 // CHECK-NEXT: ReturnVoid
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100184
185 // CHECK-START: void Main.inlineNew3() register (after)
David Brazdil71141192015-05-19 18:29:40 +0100186 // CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100187 public static void inlineNew3() {
188 new HaveFinalsAndInheritFromClassWithFinals();
189 new HaveFinalsAndInheritFromClassWithFinals();
190 }
191
192 public static void main(String[] args) {}
Calin Juravle27df7582015-04-17 19:12:31 +0100193}