xref: /aosp_15_r20/art/test/476-checker-ctor-memory-barrier/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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 // TODO: Add more tests after we can inline functions with calls.
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker class ClassWithoutFinals {
20*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void ClassWithoutFinals.<init>() inliner (after)
21*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: ConstructorFence
ClassWithoutFinals()22*795d594fSAndroid Build Coastguard Worker   public ClassWithoutFinals() {}
23*795d594fSAndroid Build Coastguard Worker }
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker class ClassWithFinals {
26*795d594fSAndroid Build Coastguard Worker   public final int x;
27*795d594fSAndroid Build Coastguard Worker   public ClassWithFinals obj;
28*795d594fSAndroid Build Coastguard Worker   public static boolean doThrow = false;
29*795d594fSAndroid Build Coastguard Worker 
ClassWithFinals(boolean cond)30*795d594fSAndroid Build Coastguard Worker   public ClassWithFinals(boolean cond) {
31*795d594fSAndroid Build Coastguard Worker     x = 1;
32*795d594fSAndroid Build Coastguard Worker     throw new RuntimeException();
33*795d594fSAndroid Build Coastguard Worker     // should not inline this constructor
34*795d594fSAndroid Build Coastguard Worker   }
35*795d594fSAndroid Build Coastguard Worker 
36*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void ClassWithFinals.<init>() inliner (after)
37*795d594fSAndroid Build Coastguard Worker   /// CHECK:      ConstructorFence
38*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  ConstructorFence
39*795d594fSAndroid Build Coastguard Worker 
40*795d594fSAndroid Build Coastguard Worker   /*
41*795d594fSAndroid Build Coastguard Worker    * Check that the correct assembly instructions are selected for a Store/Store fence.
42*795d594fSAndroid Build Coastguard Worker    *
43*795d594fSAndroid Build Coastguard Worker    * - ARM variants:   DMB ISHST (store-store fence for inner shareable domain)
44*795d594fSAndroid Build Coastguard Worker    * - Intel variants: no-op (store-store does not need a fence).
45*795d594fSAndroid Build Coastguard Worker    */
46*795d594fSAndroid Build Coastguard Worker 
47*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: void ClassWithFinals.<init>() disassembly (after)
48*795d594fSAndroid Build Coastguard Worker   /// CHECK:      ConstructorFence
49*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: dmb ishst
50*795d594fSAndroid Build Coastguard Worker 
51*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM: void ClassWithFinals.<init>() disassembly (after)
52*795d594fSAndroid Build Coastguard Worker   /// CHECK:      ConstructorFence
53*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: dmb ishst
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-X86_64: void ClassWithFinals.<init>() disassembly (after)
56*795d594fSAndroid Build Coastguard Worker   /// CHECK:      ConstructorFence
57*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  {{[slm]}}fence
58*795d594fSAndroid Build Coastguard Worker 
59*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-X86: void ClassWithFinals.<init>() disassembly (after)
60*795d594fSAndroid Build Coastguard Worker   /// CHECK:      ConstructorFence
61*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  {{[slm]}}fence
ClassWithFinals()62*795d594fSAndroid Build Coastguard Worker   public ClassWithFinals() {
63*795d594fSAndroid Build Coastguard Worker     // Exactly one constructor barrier.
64*795d594fSAndroid Build Coastguard Worker     // Note: Do not store 0 as that can be eliminated together with the constructor
65*795d594fSAndroid Build Coastguard Worker     // barrier by the code pattern substitution in the inliner.
66*795d594fSAndroid Build Coastguard Worker     x = 1;
67*795d594fSAndroid Build Coastguard Worker   }
68*795d594fSAndroid Build Coastguard Worker 
69*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void ClassWithFinals.<init>(int) inliner (after)
70*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<This:l\d+>>            ParameterValue
71*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<NewInstance:l\d+>>     NewInstance
72*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
73*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
74*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<This>>]
75*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
ClassWithFinals(int x)76*795d594fSAndroid Build Coastguard Worker   public ClassWithFinals(int x) {
77*795d594fSAndroid Build Coastguard Worker     // This should have exactly three barriers:
78*795d594fSAndroid Build Coastguard Worker     //   - one for the new-instance
79*795d594fSAndroid Build Coastguard Worker     //   - one for the constructor
80*795d594fSAndroid Build Coastguard Worker     //   - one for the `new` which should be inlined.
81*795d594fSAndroid Build Coastguard Worker     obj = new ClassWithFinals();
82*795d594fSAndroid Build Coastguard Worker     this.x = x;
83*795d594fSAndroid Build Coastguard Worker   }
84*795d594fSAndroid Build Coastguard Worker }
85*795d594fSAndroid Build Coastguard Worker 
86*795d594fSAndroid Build Coastguard Worker class InheritFromClassWithFinals extends ClassWithFinals {
87*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void InheritFromClassWithFinals.<init>() inliner (after)
88*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<This:l\d+>>            ParameterValue
89*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          ConstructorFence [<<This>>]
90*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
91*795d594fSAndroid Build Coastguard Worker 
92*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void InheritFromClassWithFinals.<init>() inliner (after)
93*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  InvokeStaticOrDirect
InheritFromClassWithFinals()94*795d594fSAndroid Build Coastguard Worker   public InheritFromClassWithFinals() {
95*795d594fSAndroid Build Coastguard Worker     // Should inline the super constructor.
96*795d594fSAndroid Build Coastguard Worker     //
97*795d594fSAndroid Build Coastguard Worker     // Exactly one constructor barrier here.
98*795d594fSAndroid Build Coastguard Worker   }
99*795d594fSAndroid Build Coastguard Worker 
100*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void InheritFromClassWithFinals.<init>(boolean) inliner (after)
101*795d594fSAndroid Build Coastguard Worker   /// CHECK:      InvokeStaticOrDirect
102*795d594fSAndroid Build Coastguard Worker 
103*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void InheritFromClassWithFinals.<init>(boolean) inliner (after)
104*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  ConstructorFence
InheritFromClassWithFinals(boolean cond)105*795d594fSAndroid Build Coastguard Worker   public InheritFromClassWithFinals(boolean cond) {
106*795d594fSAndroid Build Coastguard Worker     super(cond);
107*795d594fSAndroid Build Coastguard Worker     // should not inline the super constructor
108*795d594fSAndroid Build Coastguard Worker   }
109*795d594fSAndroid Build Coastguard Worker 
110*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void InheritFromClassWithFinals.<init>(int) inliner (after)
111*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<This:l\d+>>            ParameterValue
112*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NewHere:l\d+>>     NewInstance klass:InheritFromClassWithFinals
113*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<This>>]
114*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewHere>>]
115*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewHere>>]
116*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
117*795d594fSAndroid Build Coastguard Worker 
118*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void InheritFromClassWithFinals.<init>(int) inliner (after)
119*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  InvokeStaticOrDirect
InheritFromClassWithFinals(int unused)120*795d594fSAndroid Build Coastguard Worker   public InheritFromClassWithFinals(int unused) {
121*795d594fSAndroid Build Coastguard Worker     // super();  // implicitly the first invoke in this constructor.
122*795d594fSAndroid Build Coastguard Worker     //   Should inline the super constructor and insert a constructor fence there.
123*795d594fSAndroid Build Coastguard Worker 
124*795d594fSAndroid Build Coastguard Worker     // Should inline the new instance call (barrier); and add another one
125*795d594fSAndroid Build Coastguard Worker     // because the superclass has finals.
126*795d594fSAndroid Build Coastguard Worker     new InheritFromClassWithFinals();
127*795d594fSAndroid Build Coastguard Worker   }
128*795d594fSAndroid Build Coastguard Worker }
129*795d594fSAndroid Build Coastguard Worker 
130*795d594fSAndroid Build Coastguard Worker class HaveFinalsAndInheritFromClassWithFinals extends ClassWithFinals {
131*795d594fSAndroid Build Coastguard Worker   final int y;
132*795d594fSAndroid Build Coastguard Worker 
133*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>() inliner (after)
134*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<This:l\d+>>            ParameterValue
135*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          ConstructorFence [<<This>>]
136*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          ConstructorFence [<<This>>]
137*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
138*795d594fSAndroid Build Coastguard Worker 
139*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>() inliner (after)
140*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: InvokeStaticOrDirect
HaveFinalsAndInheritFromClassWithFinals()141*795d594fSAndroid Build Coastguard Worker   public HaveFinalsAndInheritFromClassWithFinals() {
142*795d594fSAndroid Build Coastguard Worker     // Should inline the super constructor and keep the memory barrier.
143*795d594fSAndroid Build Coastguard Worker     y = 0;
144*795d594fSAndroid Build Coastguard Worker   }
145*795d594fSAndroid Build Coastguard Worker 
146*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(boolean) inliner (after)
147*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<This:l\d+>>            ParameterValue
148*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          InvokeStaticOrDirect
149*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          ConstructorFence [<<This>>]
150*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
HaveFinalsAndInheritFromClassWithFinals(boolean cond)151*795d594fSAndroid Build Coastguard Worker   public HaveFinalsAndInheritFromClassWithFinals(boolean cond) {
152*795d594fSAndroid Build Coastguard Worker     super(cond);
153*795d594fSAndroid Build Coastguard Worker     // should not inline the super constructor
154*795d594fSAndroid Build Coastguard Worker     y = 0;
155*795d594fSAndroid Build Coastguard Worker   }
156*795d594fSAndroid Build Coastguard Worker 
157*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(int) inliner (after)
158*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<This:l\d+>>            ParameterValue
159*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NewHF:l\d+>>       NewInstance klass:HaveFinalsAndInheritFromClassWithFinals
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<NewIF:l\d+>>       NewInstance klass:InheritFromClassWithFinals
161*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<This>>]
162*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewHF>>]
163*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewHF>>]
164*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewHF>>]
165*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewIF>>]
166*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewIF>>]
167*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<This>>]
168*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
169*795d594fSAndroid Build Coastguard Worker 
170*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void HaveFinalsAndInheritFromClassWithFinals.<init>(int) inliner (after)
171*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  InvokeStaticOrDirect
HaveFinalsAndInheritFromClassWithFinals(int unused)172*795d594fSAndroid Build Coastguard Worker   public HaveFinalsAndInheritFromClassWithFinals(int unused) {
173*795d594fSAndroid Build Coastguard Worker     // super()
174*795d594fSAndroid Build Coastguard Worker     // -- Inlined super constructor, insert memory barrier here.
175*795d594fSAndroid Build Coastguard Worker     y = 0;
176*795d594fSAndroid Build Coastguard Worker 
177*795d594fSAndroid Build Coastguard Worker     // Should inline new instance and keep both memory barriers.
178*795d594fSAndroid Build Coastguard Worker     // One more memory barrier for new-instance.
179*795d594fSAndroid Build Coastguard Worker     // (3 total for this new-instance #1)
180*795d594fSAndroid Build Coastguard Worker     new HaveFinalsAndInheritFromClassWithFinals();
181*795d594fSAndroid Build Coastguard Worker     // Should inline new instance and have exactly one barrier.
182*795d594fSAndroid Build Coastguard Worker     // One more barrier for new-instance.
183*795d594fSAndroid Build Coastguard Worker     // (2 total for this new-instance #2)
184*795d594fSAndroid Build Coastguard Worker     new InheritFromClassWithFinals();
185*795d594fSAndroid Build Coastguard Worker 
186*795d594fSAndroid Build Coastguard Worker     // -- End of constructor, insert memory barrier here to freeze 'y'.
187*795d594fSAndroid Build Coastguard Worker   }
188*795d594fSAndroid Build Coastguard Worker }
189*795d594fSAndroid Build Coastguard Worker 
190*795d594fSAndroid Build Coastguard Worker public class Main {
191*795d594fSAndroid Build Coastguard Worker 
192*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: ClassWithFinals Main.noInlineNoConstructorBarrier() inliner (after)
193*795d594fSAndroid Build Coastguard Worker   /// CHECK:      InvokeStaticOrDirect
194*795d594fSAndroid Build Coastguard Worker 
195*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: ClassWithFinals Main.noInlineNoConstructorBarrier() inliner (after)
196*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<NewInstance:l\d+>>     NewInstance
197*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          ConstructorFence [<<NewInstance>>]
198*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
noInlineNoConstructorBarrier()199*795d594fSAndroid Build Coastguard Worker   public static ClassWithFinals noInlineNoConstructorBarrier() {
200*795d594fSAndroid Build Coastguard Worker     // Exactly one barrier for the new-instance.
201*795d594fSAndroid Build Coastguard Worker     return new ClassWithFinals(false);
202*795d594fSAndroid Build Coastguard Worker     // should not inline the constructor
203*795d594fSAndroid Build Coastguard Worker   }
204*795d594fSAndroid Build Coastguard Worker 
205*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.inlineNew() inliner (after)
206*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<NewInstance:l\d+>>     NewInstance
207*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
208*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
209*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
210*795d594fSAndroid Build Coastguard Worker 
211*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.inlineNew() inliner (after)
212*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  InvokeStaticOrDirect
inlineNew()213*795d594fSAndroid Build Coastguard Worker   public static void inlineNew() {
214*795d594fSAndroid Build Coastguard Worker     // Exactly 2 barriers. One for new-instance, one for constructor with finals.
215*795d594fSAndroid Build Coastguard Worker     new ClassWithFinals();
216*795d594fSAndroid Build Coastguard Worker   }
217*795d594fSAndroid Build Coastguard Worker 
218*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.inlineNew1() inliner (after)
219*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<NewInstance:l\d+>>     NewInstance
220*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
221*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
222*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
223*795d594fSAndroid Build Coastguard Worker 
224*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.inlineNew1() inliner (after)
225*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  InvokeStaticOrDirect
inlineNew1()226*795d594fSAndroid Build Coastguard Worker   public static void inlineNew1() {
227*795d594fSAndroid Build Coastguard Worker     new InheritFromClassWithFinals();
228*795d594fSAndroid Build Coastguard Worker   }
229*795d594fSAndroid Build Coastguard Worker 
230*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.inlineNew2() inliner (after)
231*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<NewInstance:l\d+>>     NewInstance
232*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
233*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
234*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
235*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
236*795d594fSAndroid Build Coastguard Worker 
237*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.inlineNew2() inliner (after)
238*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  InvokeStaticOrDirect
inlineNew2()239*795d594fSAndroid Build Coastguard Worker   public static void inlineNew2() {
240*795d594fSAndroid Build Coastguard Worker     new HaveFinalsAndInheritFromClassWithFinals();
241*795d594fSAndroid Build Coastguard Worker   }
242*795d594fSAndroid Build Coastguard Worker 
243*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.inlineNew3() inliner (after)
244*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<NewInstance:l\d+>>     NewInstance
245*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
246*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
247*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance>>]
248*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
249*795d594fSAndroid Build Coastguard Worker   /// CHECK: <<NewInstance2:l\d+>>    NewInstance
250*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance2>>]
251*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance2>>]
252*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      ConstructorFence [<<NewInstance2>>]
253*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      ConstructorFence
254*795d594fSAndroid Build Coastguard Worker 
255*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.inlineNew3() inliner (after)
256*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  InvokeStaticOrDirect
inlineNew3()257*795d594fSAndroid Build Coastguard Worker   public static void inlineNew3() {
258*795d594fSAndroid Build Coastguard Worker     new HaveFinalsAndInheritFromClassWithFinals();
259*795d594fSAndroid Build Coastguard Worker     new HaveFinalsAndInheritFromClassWithFinals();
260*795d594fSAndroid Build Coastguard Worker   }
261*795d594fSAndroid Build Coastguard Worker 
262*795d594fSAndroid Build Coastguard Worker   static int[] mCodePointsEmpty = new int[0];
263*795d594fSAndroid Build Coastguard Worker 
264*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testNewString() inliner (after)
265*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  ConstructorFence
266*795d594fSAndroid Build Coastguard Worker   /// CHECK:      InvokeStaticOrDirect method_load_kind:StringInit
267*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  ConstructorFence
268*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:  InvokeStaticOrDirect
testNewString()269*795d594fSAndroid Build Coastguard Worker   public static void testNewString() {
270*795d594fSAndroid Build Coastguard Worker     // Strings are special because of StringFactory hackeries.
271*795d594fSAndroid Build Coastguard Worker     //
272*795d594fSAndroid Build Coastguard Worker     // Assume they handle their own fencing internally in the StringFactory.
273*795d594fSAndroid Build Coastguard Worker     int[] codePoints = null;
274*795d594fSAndroid Build Coastguard Worker     String some_new_string = new String(mCodePointsEmpty, 0, 0);
275*795d594fSAndroid Build Coastguard Worker   }
276*795d594fSAndroid Build Coastguard Worker 
main(String[] args)277*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {}
278*795d594fSAndroid Build Coastguard Worker }
279