xref: /aosp_15_r20/art/test/2247-checker-write-barrier-elimination/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2022 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 class MultipleObject {
18*795d594fSAndroid Build Coastguard Worker     Object inner;
19*795d594fSAndroid Build Coastguard Worker     Object inner2;
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker     static Object inner_static;
22*795d594fSAndroid Build Coastguard Worker }
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker public class Main {
main(String[] args)25*795d594fSAndroid Build Coastguard Worker     public static void main(String[] args) throws Error {
26*795d594fSAndroid Build Coastguard Worker         // Several sets, same receiver.
27*795d594fSAndroid Build Coastguard Worker         $noinline$testInstanceFieldSets(new Main(), new Object(), new Object(), new Object());
28*795d594fSAndroid Build Coastguard Worker         $noinline$testStaticFieldSets(new Object(), new Object(), new Object());
29*795d594fSAndroid Build Coastguard Worker         // Object ArraySets can throw since they need a type check so we cannot perform the
30*795d594fSAndroid Build Coastguard Worker         // optimization.
31*795d594fSAndroid Build Coastguard Worker         $noinline$testArraySets(new Object[3], new Object(), new Object(), new Object());
32*795d594fSAndroid Build Coastguard Worker         // If we are swapping elements in the array, no need for a type check.
33*795d594fSAndroid Build Coastguard Worker         $noinline$testSwapArray(new Object[3]);
34*795d594fSAndroid Build Coastguard Worker         // If the array and the values have the same RTI, no need for a type check.
35*795d594fSAndroid Build Coastguard Worker         $noinline$testArraySetsSameRTI();
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker         // We cannot rely on `null` sets to perform the optimization.
38*795d594fSAndroid Build Coastguard Worker         $noinline$testNullInstanceFieldSets(new Main(), new Object());
39*795d594fSAndroid Build Coastguard Worker         $noinline$testNullStaticFieldSets(new Object());
40*795d594fSAndroid Build Coastguard Worker         $noinline$testNullArraySets(new Object[3], new Object());
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker         // Several sets, multiple receivers. (set obj1, obj2, obj1 and see that the card of obj1
43*795d594fSAndroid Build Coastguard Worker         // gets eliminated)
44*795d594fSAndroid Build Coastguard Worker         $noinline$testInstanceFieldSetsMultipleReceivers(
45*795d594fSAndroid Build Coastguard Worker                 new Main(), new Object(), new Object(), new Object());
46*795d594fSAndroid Build Coastguard Worker         $noinline$testStaticFieldSetsMultipleReceivers(new Object(), new Object(), new Object());
47*795d594fSAndroid Build Coastguard Worker         $noinline$testArraySetsMultipleReceiversSameRTI();
48*795d594fSAndroid Build Coastguard Worker 
49*795d594fSAndroid Build Coastguard Worker         // The write barrier elimination optimization is blocked by invokes, suspend checks, and
50*795d594fSAndroid Build Coastguard Worker         // instructions that can throw.
51*795d594fSAndroid Build Coastguard Worker         $noinline$testInstanceFieldSetsBlocked(
52*795d594fSAndroid Build Coastguard Worker                 new Main(), new Object(), new Object(), new Object());
53*795d594fSAndroid Build Coastguard Worker         $noinline$testStaticFieldSetsBlocked(new Main(), new Object(), new Object(), new Object());
54*795d594fSAndroid Build Coastguard Worker         $noinline$testArraySetsSameRTIBlocked(new Main());
55*795d594fSAndroid Build Coastguard Worker     }
56*795d594fSAndroid Build Coastguard Worker 
57*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: Main Main.$noinline$testInstanceFieldSets(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after)
58*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:Main.inner field_type:Reference write_barrier_kind:EmitBeingReliedOn
59*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
60*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:Main.inner2 field_type:Reference write_barrier_kind:DontEmit
61*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:Main.inner3 field_type:Reference write_barrier_kind:DontEmit
$noinline$testInstanceFieldSets(Main m, Object o, Object o2, Object o3)62*795d594fSAndroid Build Coastguard Worker     private static Main $noinline$testInstanceFieldSets(Main m, Object o, Object o2, Object o3) {
63*795d594fSAndroid Build Coastguard Worker         m.inner = o;
64*795d594fSAndroid Build Coastguard Worker         m.inner2 = o2;
65*795d594fSAndroid Build Coastguard Worker         m.inner3 = o3;
66*795d594fSAndroid Build Coastguard Worker         return m;
67*795d594fSAndroid Build Coastguard Worker     }
68*795d594fSAndroid Build Coastguard Worker 
69*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: void Main.$noinline$testStaticFieldSets(java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after)
70*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:Main.inner_static field_type:Reference write_barrier_kind:EmitBeingReliedOn
71*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
72*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:Main.inner_static2 field_type:Reference write_barrier_kind:DontEmit
73*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:Main.inner_static3 field_type:Reference write_barrier_kind:DontEmit
$noinline$testStaticFieldSets(Object o, Object o2, Object o3)74*795d594fSAndroid Build Coastguard Worker     private static void $noinline$testStaticFieldSets(Object o, Object o2, Object o3) {
75*795d594fSAndroid Build Coastguard Worker         inner_static = o;
76*795d594fSAndroid Build Coastguard Worker         inner_static2 = o2;
77*795d594fSAndroid Build Coastguard Worker         inner_static3 = o3;
78*795d594fSAndroid Build Coastguard Worker     }
79*795d594fSAndroid Build Coastguard Worker 
80*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.Object[] Main.$noinline$testArraySets(java.lang.Object[], java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after)
81*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNotBeingReliedOn
82*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
83*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNotBeingReliedOn
84*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
85*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNotBeingReliedOn
86*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
$noinline$testArraySets( Object[] arr, Object o, Object o2, Object o3)87*795d594fSAndroid Build Coastguard Worker     private static java.lang.Object[] $noinline$testArraySets(
88*795d594fSAndroid Build Coastguard Worker             Object[] arr, Object o, Object o2, Object o3) {
89*795d594fSAndroid Build Coastguard Worker         arr[0] = o;
90*795d594fSAndroid Build Coastguard Worker         arr[1] = o2;
91*795d594fSAndroid Build Coastguard Worker         arr[2] = o3;
92*795d594fSAndroid Build Coastguard Worker         return arr;
93*795d594fSAndroid Build Coastguard Worker     }
94*795d594fSAndroid Build Coastguard Worker 
95*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.Object[] Main.$noinline$testSwapArray(java.lang.Object[]) disassembly (after)
96*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn
97*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
98*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit
99*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit
$noinline$testSwapArray(Object[] arr)100*795d594fSAndroid Build Coastguard Worker     private static java.lang.Object[] $noinline$testSwapArray(Object[] arr) {
101*795d594fSAndroid Build Coastguard Worker         arr[0] = arr[1];
102*795d594fSAndroid Build Coastguard Worker         arr[1] = arr[2];
103*795d594fSAndroid Build Coastguard Worker         arr[2] = arr[0];
104*795d594fSAndroid Build Coastguard Worker         return arr;
105*795d594fSAndroid Build Coastguard Worker     }
106*795d594fSAndroid Build Coastguard Worker 
107*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.Object[] Main.$noinline$testArraySetsSameRTI() disassembly (after)
108*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn
109*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
110*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit
111*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit
$noinline$testArraySetsSameRTI()112*795d594fSAndroid Build Coastguard Worker     private static java.lang.Object[] $noinline$testArraySetsSameRTI() {
113*795d594fSAndroid Build Coastguard Worker         Object[] arr = new Object[3];
114*795d594fSAndroid Build Coastguard Worker         arr[0] = inner_static;
115*795d594fSAndroid Build Coastguard Worker         arr[1] = inner_static2;
116*795d594fSAndroid Build Coastguard Worker         arr[2] = inner_static3;
117*795d594fSAndroid Build Coastguard Worker         return arr;
118*795d594fSAndroid Build Coastguard Worker     }
119*795d594fSAndroid Build Coastguard Worker 
120*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: Main Main.$noinline$testNullInstanceFieldSets(Main, java.lang.Object) disassembly (after)
121*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:Main.inner field_type:Reference write_barrier_kind:DontEmit
122*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:Main.inner2 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn
123*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
124*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:Main.inner3 field_type:Reference write_barrier_kind:DontEmit
$noinline$testNullInstanceFieldSets(Main m, Object o)125*795d594fSAndroid Build Coastguard Worker     private static Main $noinline$testNullInstanceFieldSets(Main m, Object o) {
126*795d594fSAndroid Build Coastguard Worker         m.inner = null;
127*795d594fSAndroid Build Coastguard Worker         m.inner2 = o;
128*795d594fSAndroid Build Coastguard Worker         m.inner3 = null;
129*795d594fSAndroid Build Coastguard Worker         return m;
130*795d594fSAndroid Build Coastguard Worker     }
131*795d594fSAndroid Build Coastguard Worker 
132*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: void Main.$noinline$testNullStaticFieldSets(java.lang.Object) disassembly (after)
133*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:Main.inner_static field_type:Reference write_barrier_kind:DontEmit
134*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:Main.inner_static2 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn
135*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
136*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:Main.inner_static3 field_type:Reference write_barrier_kind:DontEmit
$noinline$testNullStaticFieldSets(Object o)137*795d594fSAndroid Build Coastguard Worker     private static void $noinline$testNullStaticFieldSets(Object o) {
138*795d594fSAndroid Build Coastguard Worker         inner_static = null;
139*795d594fSAndroid Build Coastguard Worker         inner_static2 = o;
140*795d594fSAndroid Build Coastguard Worker         inner_static3 = null;
141*795d594fSAndroid Build Coastguard Worker     }
142*795d594fSAndroid Build Coastguard Worker 
143*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.Object[] Main.$noinline$testNullArraySets(java.lang.Object[], java.lang.Object) disassembly (after)
144*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit
145*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNotBeingReliedOn
146*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
147*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit
$noinline$testNullArraySets(Object[] arr, Object o)148*795d594fSAndroid Build Coastguard Worker     private static Object[] $noinline$testNullArraySets(Object[] arr, Object o) {
149*795d594fSAndroid Build Coastguard Worker         arr[0] = null;
150*795d594fSAndroid Build Coastguard Worker         arr[1] = o;
151*795d594fSAndroid Build Coastguard Worker         arr[2] = null;
152*795d594fSAndroid Build Coastguard Worker         return arr;
153*795d594fSAndroid Build Coastguard Worker     }
154*795d594fSAndroid Build Coastguard Worker 
155*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: Main Main.$noinline$testInstanceFieldSetsMultipleReceivers(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after)
156*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:MultipleObject.inner field_type:Reference write_barrier_kind:EmitBeingReliedOn
157*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
158*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:MultipleObject.inner field_type:Reference write_barrier_kind:EmitNotBeingReliedOn
159*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
160*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:MultipleObject.inner2 field_type:Reference write_barrier_kind:DontEmit
$noinline$testInstanceFieldSetsMultipleReceivers( Main m, Object o, Object o2, Object o3)161*795d594fSAndroid Build Coastguard Worker     private static Main $noinline$testInstanceFieldSetsMultipleReceivers(
162*795d594fSAndroid Build Coastguard Worker             Main m, Object o, Object o2, Object o3) throws Error {
163*795d594fSAndroid Build Coastguard Worker         m.mo = new MultipleObject();
164*795d594fSAndroid Build Coastguard Worker         m.mo2 = new MultipleObject();
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker         m.mo.inner = o;
167*795d594fSAndroid Build Coastguard Worker         // This card table for `m.mo2` can't me removed. Note that in `m.mo2 = new
168*795d594fSAndroid Build Coastguard Worker         // MultipleObject();` above the receiver is `m`, not `m.mo2.
169*795d594fSAndroid Build Coastguard Worker         m.mo2.inner = o2;
170*795d594fSAndroid Build Coastguard Worker         // This card table for `m.mo` can me removed.
171*795d594fSAndroid Build Coastguard Worker         m.mo.inner2 = o3;
172*795d594fSAndroid Build Coastguard Worker         return m;
173*795d594fSAndroid Build Coastguard Worker     }
174*795d594fSAndroid Build Coastguard Worker 
175*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: void Main.$noinline$testStaticFieldSetsMultipleReceivers(java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after)
176*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:MultipleObject.inner_static field_type:Reference write_barrier_kind:EmitNotBeingReliedOn
177*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
178*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:Main.inner_static2 field_type:Reference write_barrier_kind:EmitBeingReliedOn
179*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
180*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:Main.inner_static3 field_type:Reference write_barrier_kind:DontEmit
$noinline$testStaticFieldSetsMultipleReceivers( Object o, Object o2, Object o3)181*795d594fSAndroid Build Coastguard Worker     private static void $noinline$testStaticFieldSetsMultipleReceivers(
182*795d594fSAndroid Build Coastguard Worker             Object o, Object o2, Object o3) {
183*795d594fSAndroid Build Coastguard Worker         MultipleObject.inner_static = o;
184*795d594fSAndroid Build Coastguard Worker         inner_static2 = o2;
185*795d594fSAndroid Build Coastguard Worker         inner_static3 = o3;
186*795d594fSAndroid Build Coastguard Worker     }
187*795d594fSAndroid Build Coastguard Worker 
188*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.Object[][] Main.$noinline$testArraySetsMultipleReceiversSameRTI() disassembly (after)
189*795d594fSAndroid Build Coastguard Worker     // Initializing the values
190*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn
191*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
192*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNotBeingReliedOn
193*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
194*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit
195*795d594fSAndroid Build Coastguard Worker     // Setting the `array_of_arrays`.
196*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn
197*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
198*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit
$noinline$testArraySetsMultipleReceiversSameRTI()199*795d594fSAndroid Build Coastguard Worker     private static java.lang.Object[][] $noinline$testArraySetsMultipleReceiversSameRTI() {
200*795d594fSAndroid Build Coastguard Worker         Object[] arr = new Object[3];
201*795d594fSAndroid Build Coastguard Worker         Object[] other_arr = new Object[3];
202*795d594fSAndroid Build Coastguard Worker 
203*795d594fSAndroid Build Coastguard Worker         arr[0] = inner_static;
204*795d594fSAndroid Build Coastguard Worker         other_arr[1] = inner_static2;
205*795d594fSAndroid Build Coastguard Worker         arr[2] = inner_static3;
206*795d594fSAndroid Build Coastguard Worker 
207*795d594fSAndroid Build Coastguard Worker         // Return them so that LSE doesn't delete them
208*795d594fSAndroid Build Coastguard Worker         Object[][] array_of_arrays = {arr, other_arr};
209*795d594fSAndroid Build Coastguard Worker         return array_of_arrays;
210*795d594fSAndroid Build Coastguard Worker     }
211*795d594fSAndroid Build Coastguard Worker 
$noinline$emptyMethod()212*795d594fSAndroid Build Coastguard Worker     private static void $noinline$emptyMethod() {}
213*795d594fSAndroid Build Coastguard Worker 
214*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: Main Main.$noinline$testInstanceFieldSetsBlocked(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after)
215*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:Main.inner field_type:Reference write_barrier_kind:EmitNotBeingReliedOn
216*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
217*795d594fSAndroid Build Coastguard Worker     /// CHECK: InvokeStaticOrDirect method_name:Main.$noinline$emptyMethod
218*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:Main.inner2 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn
219*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
220*795d594fSAndroid Build Coastguard Worker     /// CHECK: MonitorOperation kind:enter
221*795d594fSAndroid Build Coastguard Worker     /// CHECK: InstanceFieldSet field_name:Main.inner3 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn
222*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
$noinline$testInstanceFieldSetsBlocked( Main m, Object o, Object o2, Object o3)223*795d594fSAndroid Build Coastguard Worker     private static Main $noinline$testInstanceFieldSetsBlocked(
224*795d594fSAndroid Build Coastguard Worker             Main m, Object o, Object o2, Object o3) {
225*795d594fSAndroid Build Coastguard Worker         m.inner = o;
226*795d594fSAndroid Build Coastguard Worker         $noinline$emptyMethod();
227*795d594fSAndroid Build Coastguard Worker         m.inner2 = o2;
228*795d594fSAndroid Build Coastguard Worker         synchronized (m) {
229*795d594fSAndroid Build Coastguard Worker             m.inner3 = o3;
230*795d594fSAndroid Build Coastguard Worker         }
231*795d594fSAndroid Build Coastguard Worker         return m;
232*795d594fSAndroid Build Coastguard Worker     }
233*795d594fSAndroid Build Coastguard Worker 
234*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: void Main.$noinline$testStaticFieldSetsBlocked(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after)
235*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:Main.inner_static field_type:Reference write_barrier_kind:EmitNotBeingReliedOn
236*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
237*795d594fSAndroid Build Coastguard Worker     /// CHECK: InvokeStaticOrDirect method_name:Main.$noinline$emptyMethod
238*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:Main.inner_static2 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn
239*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
240*795d594fSAndroid Build Coastguard Worker     /// CHECK: MonitorOperation kind:enter
241*795d594fSAndroid Build Coastguard Worker     /// CHECK: StaticFieldSet field_name:Main.inner_static3 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn
242*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
$noinline$testStaticFieldSetsBlocked( Main m, Object o, Object o2, Object o3)243*795d594fSAndroid Build Coastguard Worker     private static void $noinline$testStaticFieldSetsBlocked(
244*795d594fSAndroid Build Coastguard Worker             Main m, Object o, Object o2, Object o3) {
245*795d594fSAndroid Build Coastguard Worker         inner_static = o;
246*795d594fSAndroid Build Coastguard Worker         $noinline$emptyMethod();
247*795d594fSAndroid Build Coastguard Worker         inner_static2 = o2;
248*795d594fSAndroid Build Coastguard Worker         synchronized (m) {
249*795d594fSAndroid Build Coastguard Worker             inner_static3 = o3;
250*795d594fSAndroid Build Coastguard Worker         }
251*795d594fSAndroid Build Coastguard Worker     }
252*795d594fSAndroid Build Coastguard Worker 
253*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.Object[] Main.$noinline$testArraySetsSameRTIBlocked(Main) disassembly (after)
254*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNotBeingReliedOn
255*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
256*795d594fSAndroid Build Coastguard Worker     /// CHECK: InvokeStaticOrDirect method_name:Main.$noinline$emptyMethod
257*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNotBeingReliedOn
258*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
259*795d594fSAndroid Build Coastguard Worker     /// CHECK: MonitorOperation kind:enter
260*795d594fSAndroid Build Coastguard Worker     /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNotBeingReliedOn
261*795d594fSAndroid Build Coastguard Worker     /// CHECK: ; card_table
$noinline$testArraySetsSameRTIBlocked(Main m)262*795d594fSAndroid Build Coastguard Worker     private static java.lang.Object[] $noinline$testArraySetsSameRTIBlocked(Main m) {
263*795d594fSAndroid Build Coastguard Worker         Object[] arr = new Object[3];
264*795d594fSAndroid Build Coastguard Worker         arr[0] = inner_static;
265*795d594fSAndroid Build Coastguard Worker         $noinline$emptyMethod();
266*795d594fSAndroid Build Coastguard Worker         arr[1] = inner_static2;
267*795d594fSAndroid Build Coastguard Worker         synchronized (m) {
268*795d594fSAndroid Build Coastguard Worker             arr[2] = inner_static3;
269*795d594fSAndroid Build Coastguard Worker         }
270*795d594fSAndroid Build Coastguard Worker         return arr;
271*795d594fSAndroid Build Coastguard Worker     }
272*795d594fSAndroid Build Coastguard Worker 
273*795d594fSAndroid Build Coastguard Worker     Object inner;
274*795d594fSAndroid Build Coastguard Worker     Object inner2;
275*795d594fSAndroid Build Coastguard Worker     Object inner3;
276*795d594fSAndroid Build Coastguard Worker 
277*795d594fSAndroid Build Coastguard Worker     MultipleObject mo;
278*795d594fSAndroid Build Coastguard Worker     MultipleObject mo2;
279*795d594fSAndroid Build Coastguard Worker 
280*795d594fSAndroid Build Coastguard Worker     static Object inner_static;
281*795d594fSAndroid Build Coastguard Worker     static Object inner_static2;
282*795d594fSAndroid Build Coastguard Worker     static Object inner_static3;
283*795d594fSAndroid Build Coastguard Worker }
284