blob: c2a2a100fbafd5e96b858d7cba02a95534c901f6 [file] [log] [blame]
Calin Juravle27df7582015-04-17 19:12:31 +01001/*
Roland Levillain6a92a032015-07-23 12:15:01 +01002 * 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 */
Calin Juravle27df7582015-04-17 19:12:31 +010016
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 {
David Brazdila06d66a2015-05-28 11:14:54 +010020 /// CHECK-START: void ClassWithoutFinals.<init>() register (after)
21 /// 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;
Nicolas Geoffray5949fa02015-12-18 10:57:10 +000028 public static boolean doThrow = false;
Calin Juravle27df7582015-04-17 19:12:31 +010029
David Brazdila06d66a2015-05-28 11:14:54 +010030 /// CHECK-START: void ClassWithFinals.<init>(boolean) register (after)
31 /// CHECK: MemoryBarrier kind:StoreStore
32 /// CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +010033 public ClassWithFinals(boolean cond) {
34 x = 0;
Nicolas Geoffray5949fa02015-12-18 10:57:10 +000035 if (doThrow) {
Calin Juravle27df7582015-04-17 19:12:31 +010036 // avoid inlining
37 throw new RuntimeException();
38 }
39 }
40
David Brazdila06d66a2015-05-28 11:14:54 +010041 /// CHECK-START: void ClassWithFinals.<init>() register (after)
42 /// CHECK: MemoryBarrier kind:StoreStore
43 /// CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +010044 public ClassWithFinals() {
45 x = 0;
46 }
47
David Brazdila06d66a2015-05-28 11:14:54 +010048 /// CHECK-START: void ClassWithFinals.<init>(int) register (after)
49 /// CHECK: MemoryBarrier kind:StoreStore
50 /// CHECK: MemoryBarrier kind:StoreStore
51 /// CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +010052 public ClassWithFinals(int x) {
53 // This should have two barriers:
54 // - one for the constructor
55 // - one for the `new` which should be inlined.
56 obj = new ClassWithFinals();
57 this.x = x;
58 }
59}
60
61class InheritFromClassWithFinals extends ClassWithFinals {
David Brazdila06d66a2015-05-28 11:14:54 +010062 /// CHECK-START: void InheritFromClassWithFinals.<init>() register (after)
63 /// CHECK: MemoryBarrier kind:StoreStore
64 /// CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +010065
David Brazdila06d66a2015-05-28 11:14:54 +010066 /// CHECK-START: void InheritFromClassWithFinals.<init>() register (after)
67 /// CHECK-NOT: InvokeStaticOrDirect
Calin Juravle27df7582015-04-17 19:12:31 +010068 public InheritFromClassWithFinals() {
69 // Should inline the super constructor.
70 }
71
David Brazdila06d66a2015-05-28 11:14:54 +010072 /// CHECK-START: void InheritFromClassWithFinals.<init>(boolean) register (after)
73 /// CHECK: InvokeStaticOrDirect
Calin Juravle27df7582015-04-17 19:12:31 +010074
David Brazdila06d66a2015-05-28 11:14:54 +010075 /// CHECK-START: void InheritFromClassWithFinals.<init>(boolean) register (after)
76 /// CHECK-NOT: MemoryBarrier kind:StoreStore
Calin Juravle27df7582015-04-17 19:12:31 +010077 public InheritFromClassWithFinals(boolean cond) {
78 super(cond);
79 // should not inline the super constructor
80 }
Calin Juravle3cd4fc82015-05-14 15:15:42 +010081
David Brazdila06d66a2015-05-28 11:14:54 +010082 /// CHECK-START: void InheritFromClassWithFinals.<init>(int) register (after)
83 /// CHECK: MemoryBarrier kind:StoreStore
84 /// CHECK: MemoryBarrier kind:StoreStore
85 /// CHECK: ReturnVoid
Calin Juravle3cd4fc82015-05-14 15:15:42 +010086
David Brazdila06d66a2015-05-28 11:14:54 +010087 /// CHECK-START: void InheritFromClassWithFinals.<init>(int) register (after)
88 /// CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +010089 public InheritFromClassWithFinals(int unused) {
90 // Should inline the super constructor and insert a memory barrier.
91
92 // Should inline the new instance call and insert another memory barrier.
93 new InheritFromClassWithFinals();
94 }
Calin Juravle27df7582015-04-17 19:12:31 +010095}
96
97class HaveFinalsAndInheritFromClassWithFinals extends ClassWithFinals {
98 final int y;
99
David Brazdila06d66a2015-05-28 11:14:54 +0100100 /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>() register (after)
101 /// CHECK: MemoryBarrier kind:StoreStore
102 /// CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +0100103
David Brazdila06d66a2015-05-28 11:14:54 +0100104 /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>() register (after)
105 /// CHECK-NOT: InvokeStaticOrDirect
Calin Juravle27df7582015-04-17 19:12:31 +0100106 public HaveFinalsAndInheritFromClassWithFinals() {
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100107 // Should inline the super constructor and remove the memory barrier.
Calin Juravle27df7582015-04-17 19:12:31 +0100108 y = 0;
109 }
110
David Brazdila06d66a2015-05-28 11:14:54 +0100111 /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(boolean) register (after)
112 /// CHECK: InvokeStaticOrDirect
113 /// CHECK: MemoryBarrier kind:StoreStore
114 /// CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +0100115 public HaveFinalsAndInheritFromClassWithFinals(boolean cond) {
116 super(cond);
117 // should not inline the super constructor
118 y = 0;
119 }
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100120
David Brazdila06d66a2015-05-28 11:14:54 +0100121 /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(int) register (after)
122 /// CHECK: MemoryBarrier kind:StoreStore
123 /// CHECK: MemoryBarrier kind:StoreStore
124 /// CHECK: MemoryBarrier kind:StoreStore
125 /// CHECK-NEXT: ReturnVoid
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100126
David Brazdila06d66a2015-05-28 11:14:54 +0100127 /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(int) register (after)
128 /// CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100129 public HaveFinalsAndInheritFromClassWithFinals(int unused) {
130 // Should inline the super constructor and keep just one memory barrier.
131 y = 0;
132
133 // Should inline new instance and keep one barrier.
134 new HaveFinalsAndInheritFromClassWithFinals();
135 // Should inline new instance and keep one barrier.
136 new InheritFromClassWithFinals();
137 }
Calin Juravle27df7582015-04-17 19:12:31 +0100138}
139
140public class Main {
141
David Brazdila06d66a2015-05-28 11:14:54 +0100142 /// CHECK-START: ClassWithFinals Main.noInlineNoConstructorBarrier() register (after)
143 /// CHECK: InvokeStaticOrDirect
Calin Juravle27df7582015-04-17 19:12:31 +0100144
David Brazdila06d66a2015-05-28 11:14:54 +0100145 /// CHECK-START: ClassWithFinals Main.noInlineNoConstructorBarrier() register (after)
146 /// CHECK-NOT: MemoryBarrier kind:StoreStore
Calin Juravle27df7582015-04-17 19:12:31 +0100147 public static ClassWithFinals noInlineNoConstructorBarrier() {
148 return new ClassWithFinals(false);
149 }
150
David Brazdila06d66a2015-05-28 11:14:54 +0100151 /// CHECK-START: void Main.inlineNew() register (after)
152 /// CHECK: MemoryBarrier kind:StoreStore
153 /// CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +0100154
David Brazdila06d66a2015-05-28 11:14:54 +0100155 /// CHECK-START: void Main.inlineNew() register (after)
156 /// CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100157 public static void inlineNew() {
158 new ClassWithFinals();
Calin Juravle27df7582015-04-17 19:12:31 +0100159 }
160
David Brazdila06d66a2015-05-28 11:14:54 +0100161 /// CHECK-START: void Main.inlineNew1() register (after)
162 /// CHECK: MemoryBarrier kind:StoreStore
163 /// CHECK-NEXT: ReturnVoid
Calin Juravle27df7582015-04-17 19:12:31 +0100164
David Brazdila06d66a2015-05-28 11:14:54 +0100165 /// CHECK-START: void Main.inlineNew1() register (after)
166 /// CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100167 public static void inlineNew1() {
168 new InheritFromClassWithFinals();
Calin Juravle27df7582015-04-17 19:12:31 +0100169 }
170
David Brazdila06d66a2015-05-28 11:14:54 +0100171 /// CHECK-START: void Main.inlineNew2() register (after)
172 /// CHECK: MemoryBarrier kind:StoreStore
173 /// CHECK-NEXT: ReturnVoid
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100174
David Brazdila06d66a2015-05-28 11:14:54 +0100175 /// CHECK-START: void Main.inlineNew2() register (after)
176 /// CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100177 public static void inlineNew2() {
178 new HaveFinalsAndInheritFromClassWithFinals();
179 }
180
David Brazdila06d66a2015-05-28 11:14:54 +0100181 /// CHECK-START: void Main.inlineNew3() register (after)
182 /// CHECK: MemoryBarrier kind:StoreStore
183 /// CHECK: MemoryBarrier kind:StoreStore
184 /// CHECK-NEXT: ReturnVoid
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100185
David Brazdila06d66a2015-05-28 11:14:54 +0100186 /// CHECK-START: void Main.inlineNew3() register (after)
187 /// CHECK-NOT: InvokeStaticOrDirect
Calin Juravle3cd4fc82015-05-14 15:15:42 +0100188 public static void inlineNew3() {
189 new HaveFinalsAndInheritFromClassWithFinals();
190 new HaveFinalsAndInheritFromClassWithFinals();
191 }
192
193 public static void main(String[] args) {}
Calin Juravle27df7582015-04-17 19:12:31 +0100194}