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