diff options
Diffstat (limited to 'test')
7 files changed, 97 insertions, 175 deletions
diff --git a/test/2247-checker-write-barrier-elimination/src/Main.java b/test/2247-checker-write-barrier-elimination/src/Main.java index edf5bc2eab..c03ada30b5 100644 --- a/test/2247-checker-write-barrier-elimination/src/Main.java +++ b/test/2247-checker-write-barrier-elimination/src/Main.java @@ -55,10 +55,13 @@ public class Main { } /// CHECK-START: Main Main.$noinline$testInstanceFieldSets(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) - /// CHECK: InstanceFieldSet field_name:Main.inner field_type:Reference write_barrier_kind:EmitBeingReliedOn - /// CHECK: ; card_table + /// CHECK: InstanceFieldSet field_name:Main.inner field_type:Reference write_barrier_kind:EmitNoNullCheck /// CHECK: InstanceFieldSet field_name:Main.inner2 field_type:Reference write_barrier_kind:DontEmit /// CHECK: InstanceFieldSet field_name:Main.inner3 field_type:Reference write_barrier_kind:DontEmit + + /// CHECK-START: Main Main.$noinline$testInstanceFieldSets(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) + /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static Main $noinline$testInstanceFieldSets(Main m, Object o, Object o2, Object o3) { m.inner = o; m.inner2 = o2; @@ -67,10 +70,13 @@ public class Main { } /// CHECK-START: void Main.$noinline$testStaticFieldSets(java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) - /// CHECK: StaticFieldSet field_name:Main.inner_static field_type:Reference write_barrier_kind:EmitBeingReliedOn - /// CHECK: ; card_table + /// CHECK: StaticFieldSet field_name:Main.inner_static field_type:Reference write_barrier_kind:EmitNoNullCheck /// CHECK: StaticFieldSet field_name:Main.inner_static2 field_type:Reference write_barrier_kind:DontEmit /// CHECK: StaticFieldSet field_name:Main.inner_static3 field_type:Reference write_barrier_kind:DontEmit + + /// CHECK-START: void Main.$noinline$testStaticFieldSets(java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) + /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static void $noinline$testStaticFieldSets(Object o, Object o2, Object o3) { inner_static = o; inner_static2 = o2; @@ -78,12 +84,15 @@ public class Main { } /// CHECK-START: java.lang.Object[] Main.$noinline$testArraySets(java.lang.Object[], java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) - /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNotBeingReliedOn + /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNoNullCheck + /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNoNullCheck + /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNoNullCheck + + /// CHECK-START: java.lang.Object[] Main.$noinline$testArraySets(java.lang.Object[], java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) /// CHECK: ; card_table - /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNotBeingReliedOn /// CHECK: ; card_table - /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNotBeingReliedOn /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static java.lang.Object[] $noinline$testArraySets( Object[] arr, Object o, Object o2, Object o3) { arr[0] = o; @@ -93,10 +102,13 @@ public class Main { } /// CHECK-START: java.lang.Object[] Main.$noinline$testSwapArray(java.lang.Object[]) disassembly (after) - /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn - /// CHECK: ; card_table + /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNoNullCheck /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit + + /// CHECK-START: java.lang.Object[] Main.$noinline$testSwapArray(java.lang.Object[]) disassembly (after) + /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static java.lang.Object[] $noinline$testSwapArray(Object[] arr) { arr[0] = arr[1]; arr[1] = arr[2]; @@ -105,10 +117,13 @@ public class Main { } /// CHECK-START: java.lang.Object[] Main.$noinline$testArraySetsSameRTI() disassembly (after) - /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn - /// CHECK: ; card_table + /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNoNullCheck /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit + + /// CHECK-START: java.lang.Object[] Main.$noinline$testArraySetsSameRTI() disassembly (after) + /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static java.lang.Object[] $noinline$testArraySetsSameRTI() { Object[] arr = new Object[3]; arr[0] = inner_static; @@ -119,9 +134,12 @@ public class Main { /// CHECK-START: Main Main.$noinline$testNullInstanceFieldSets(Main, java.lang.Object) disassembly (after) /// CHECK: InstanceFieldSet field_name:Main.inner field_type:Reference write_barrier_kind:DontEmit - /// CHECK: InstanceFieldSet field_name:Main.inner2 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn - /// CHECK: ; card_table + /// CHECK: InstanceFieldSet field_name:Main.inner2 field_type:Reference write_barrier_kind:EmitWithNullCheck /// CHECK: InstanceFieldSet field_name:Main.inner3 field_type:Reference write_barrier_kind:DontEmit + + /// CHECK-START: Main Main.$noinline$testNullInstanceFieldSets(Main, java.lang.Object) disassembly (after) + /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static Main $noinline$testNullInstanceFieldSets(Main m, Object o) { m.inner = null; m.inner2 = o; @@ -131,9 +149,12 @@ public class Main { /// CHECK-START: void Main.$noinline$testNullStaticFieldSets(java.lang.Object) disassembly (after) /// CHECK: StaticFieldSet field_name:Main.inner_static field_type:Reference write_barrier_kind:DontEmit - /// CHECK: StaticFieldSet field_name:Main.inner_static2 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn - /// CHECK: ; card_table + /// CHECK: StaticFieldSet field_name:Main.inner_static2 field_type:Reference write_barrier_kind:EmitWithNullCheck /// CHECK: StaticFieldSet field_name:Main.inner_static3 field_type:Reference write_barrier_kind:DontEmit + + /// CHECK-START: void Main.$noinline$testNullStaticFieldSets(java.lang.Object) disassembly (after) + /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static void $noinline$testNullStaticFieldSets(Object o) { inner_static = null; inner_static2 = o; @@ -142,9 +163,12 @@ public class Main { /// CHECK-START: java.lang.Object[] Main.$noinline$testNullArraySets(java.lang.Object[], java.lang.Object) disassembly (after) /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit - /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNotBeingReliedOn - /// CHECK: ; card_table + /// CHECK: ArraySet needs_type_check:true can_trigger_gc:true write_barrier_kind:EmitNoNullCheck /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit + + /// CHECK-START: java.lang.Object[] Main.$noinline$testNullArraySets(java.lang.Object[], java.lang.Object) disassembly (after) + /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static Object[] $noinline$testNullArraySets(Object[] arr, Object o) { arr[0] = null; arr[1] = o; @@ -153,11 +177,18 @@ public class Main { } /// CHECK-START: Main Main.$noinline$testInstanceFieldSetsMultipleReceivers(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) - /// CHECK: InstanceFieldSet field_name:MultipleObject.inner field_type:Reference write_barrier_kind:EmitBeingReliedOn + // There are two extra card_tables for the initialization of the MultipleObject. + /// CHECK: InstanceFieldSet field_name:MultipleObject.inner field_type:Reference write_barrier_kind:EmitNoNullCheck + /// CHECK: InstanceFieldSet field_name:MultipleObject.inner field_type:Reference write_barrier_kind:EmitWithNullCheck + /// CHECK: InstanceFieldSet field_name:MultipleObject.inner2 field_type:Reference write_barrier_kind:DontEmit + + // Each one of the two NewInstance instructions have their own `card_table` reference. + /// CHECK-START: Main Main.$noinline$testInstanceFieldSetsMultipleReceivers(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) /// CHECK: ; card_table - /// CHECK: InstanceFieldSet field_name:MultipleObject.inner field_type:Reference write_barrier_kind:EmitNotBeingReliedOn /// CHECK: ; card_table - /// CHECK: InstanceFieldSet field_name:MultipleObject.inner2 field_type:Reference write_barrier_kind:DontEmit + /// CHECK: ; card_table + /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static Main $noinline$testInstanceFieldSetsMultipleReceivers( Main m, Object o, Object o2, Object o3) throws Error { m.mo = new MultipleObject(); @@ -173,11 +204,14 @@ public class Main { } /// CHECK-START: void Main.$noinline$testStaticFieldSetsMultipleReceivers(java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) - /// CHECK: StaticFieldSet field_name:MultipleObject.inner_static field_type:Reference write_barrier_kind:EmitNotBeingReliedOn + /// CHECK: StaticFieldSet field_name:MultipleObject.inner_static field_type:Reference write_barrier_kind:EmitWithNullCheck + /// CHECK: StaticFieldSet field_name:Main.inner_static2 field_type:Reference write_barrier_kind:EmitNoNullCheck + /// CHECK: StaticFieldSet field_name:Main.inner_static3 field_type:Reference write_barrier_kind:DontEmit + + /// CHECK-START: void Main.$noinline$testStaticFieldSetsMultipleReceivers(java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) /// CHECK: ; card_table - /// CHECK: StaticFieldSet field_name:Main.inner_static2 field_type:Reference write_barrier_kind:EmitBeingReliedOn /// CHECK: ; card_table - /// CHECK: StaticFieldSet field_name:Main.inner_static3 field_type:Reference write_barrier_kind:DontEmit + /// CHECK-NOT: ; card_table private static void $noinline$testStaticFieldSetsMultipleReceivers( Object o, Object o2, Object o3) { MultipleObject.inner_static = o; @@ -187,15 +221,20 @@ public class Main { /// CHECK-START: java.lang.Object[][] Main.$noinline$testArraySetsMultipleReceiversSameRTI() disassembly (after) // Initializing the values - /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn - /// CHECK: ; card_table - /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNotBeingReliedOn - /// CHECK: ; card_table + /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNoNullCheck + /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNoNullCheck /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit // Setting the `array_of_arrays`. - /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn - /// CHECK: ; card_table + /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNoNullCheck /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit + + /// CHECK-START: java.lang.Object[][] Main.$noinline$testArraySetsMultipleReceiversSameRTI() disassembly (after) + // Two array sets can't eliminate the write barrier + /// CHECK: ; card_table + /// CHECK: ; card_table + // One write barrier for the array of arrays' sets + /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static java.lang.Object[][] $noinline$testArraySetsMultipleReceiversSameRTI() { Object[] arr = new Object[3]; Object[] other_arr = new Object[3]; @@ -212,14 +251,17 @@ public class Main { private static void $noinline$emptyMethod() {} /// CHECK-START: Main Main.$noinline$testInstanceFieldSetsBlocked(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) - /// CHECK: InstanceFieldSet field_name:Main.inner field_type:Reference write_barrier_kind:EmitNotBeingReliedOn - /// CHECK: ; card_table + /// CHECK: InstanceFieldSet field_name:Main.inner field_type:Reference write_barrier_kind:EmitWithNullCheck /// CHECK: InvokeStaticOrDirect method_name:Main.$noinline$emptyMethod - /// CHECK: InstanceFieldSet field_name:Main.inner2 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn - /// CHECK: ; card_table + /// CHECK: InstanceFieldSet field_name:Main.inner2 field_type:Reference write_barrier_kind:EmitWithNullCheck /// CHECK: MonitorOperation kind:enter - /// CHECK: InstanceFieldSet field_name:Main.inner3 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn + /// CHECK: InstanceFieldSet field_name:Main.inner3 field_type:Reference write_barrier_kind:EmitWithNullCheck + + /// CHECK-START: Main Main.$noinline$testInstanceFieldSetsBlocked(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) + /// CHECK: ; card_table + /// CHECK: ; card_table /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static Main $noinline$testInstanceFieldSetsBlocked( Main m, Object o, Object o2, Object o3) { m.inner = o; @@ -232,14 +274,17 @@ public class Main { } /// CHECK-START: void Main.$noinline$testStaticFieldSetsBlocked(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) - /// CHECK: StaticFieldSet field_name:Main.inner_static field_type:Reference write_barrier_kind:EmitNotBeingReliedOn - /// CHECK: ; card_table + /// CHECK: StaticFieldSet field_name:Main.inner_static field_type:Reference write_barrier_kind:EmitWithNullCheck /// CHECK: InvokeStaticOrDirect method_name:Main.$noinline$emptyMethod - /// CHECK: StaticFieldSet field_name:Main.inner_static2 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn - /// CHECK: ; card_table + /// CHECK: StaticFieldSet field_name:Main.inner_static2 field_type:Reference write_barrier_kind:EmitWithNullCheck /// CHECK: MonitorOperation kind:enter - /// CHECK: StaticFieldSet field_name:Main.inner_static3 field_type:Reference write_barrier_kind:EmitNotBeingReliedOn + /// CHECK: StaticFieldSet field_name:Main.inner_static3 field_type:Reference write_barrier_kind:EmitWithNullCheck + + /// CHECK-START: void Main.$noinline$testStaticFieldSetsBlocked(Main, java.lang.Object, java.lang.Object, java.lang.Object) disassembly (after) /// CHECK: ; card_table + /// CHECK: ; card_table + /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static void $noinline$testStaticFieldSetsBlocked( Main m, Object o, Object o2, Object o3) { inner_static = o; @@ -251,14 +296,17 @@ public class Main { } /// CHECK-START: java.lang.Object[] Main.$noinline$testArraySetsSameRTIBlocked(Main) disassembly (after) - /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNotBeingReliedOn - /// CHECK: ; card_table + /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNoNullCheck /// CHECK: InvokeStaticOrDirect method_name:Main.$noinline$emptyMethod - /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNotBeingReliedOn - /// CHECK: ; card_table + /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNoNullCheck /// CHECK: MonitorOperation kind:enter - /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNotBeingReliedOn + /// CHECK: ArraySet needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitNoNullCheck + + /// CHECK-START: java.lang.Object[] Main.$noinline$testArraySetsSameRTIBlocked(Main) disassembly (after) + /// CHECK: ; card_table + /// CHECK: ; card_table /// CHECK: ; card_table + /// CHECK-NOT: ; card_table private static java.lang.Object[] $noinline$testArraySetsSameRTIBlocked(Main m) { Object[] arr = new Object[3]; arr[0] = inner_static; diff --git a/test/2272-checker-codegen-honor-write-barrier-kind/expected-stderr.txt b/test/2272-checker-codegen-honor-write-barrier-kind/expected-stderr.txt deleted file mode 100644 index e69de29bb2..0000000000 --- a/test/2272-checker-codegen-honor-write-barrier-kind/expected-stderr.txt +++ /dev/null diff --git a/test/2272-checker-codegen-honor-write-barrier-kind/expected-stdout.txt b/test/2272-checker-codegen-honor-write-barrier-kind/expected-stdout.txt deleted file mode 100644 index e69de29bb2..0000000000 --- a/test/2272-checker-codegen-honor-write-barrier-kind/expected-stdout.txt +++ /dev/null diff --git a/test/2272-checker-codegen-honor-write-barrier-kind/info.txt b/test/2272-checker-codegen-honor-write-barrier-kind/info.txt deleted file mode 100644 index 455bb77de3..0000000000 --- a/test/2272-checker-codegen-honor-write-barrier-kind/info.txt +++ /dev/null @@ -1,3 +0,0 @@ -Two regression tests: -1) Regression test to honor the write barrier kind and set the dirty bit. -2) Regression test for skipping a needed write barrier at runtime. diff --git a/test/2272-checker-codegen-honor-write-barrier-kind/run.py b/test/2272-checker-codegen-honor-write-barrier-kind/run.py deleted file mode 100644 index ebdb9b5896..0000000000 --- a/test/2272-checker-codegen-honor-write-barrier-kind/run.py +++ /dev/null @@ -1,19 +0,0 @@ -#! /bin/bash -# -# Copyright (C) 2023 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -def run(ctx, args): - # Limit the managed heap to 16 MiB to force more garbage collections. - ctx.default_run(args, runtime_option=["-Xmx16m"]) diff --git a/test/2272-checker-codegen-honor-write-barrier-kind/src/Main.java b/test/2272-checker-codegen-honor-write-barrier-kind/src/Main.java deleted file mode 100644 index f07286b5b9..0000000000 --- a/test/2272-checker-codegen-honor-write-barrier-kind/src/Main.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -public class Main { - public static void main(String[] args) { - $noinline$testHonorWriteBarrier(); - $noinline$testDontSkipWriteBarrier(); - } - - public static void $noinline$testHonorWriteBarrier() { - String[] arr = {"Hello", "World"}; - // We first run the gc to make sure the card is clean. - Runtime.getRuntime().gc(); - // Continually call $noinline$testArraySetsHonorWriteBarrier while allocating over 64 MiB of - // memory (with heap size limited to 16 MiB), in order to increase memory pressure and - // eventually trigger a concurrent garbage collection, which will start by putting the GC in - // marking mode to trigger the bug. - for (int i = 0; i != 64 * 1024; ++i) { - $noinline$allocateAtLeast1KiB(); - $noinline$testArraySetsHonorWriteBarrier(arr, "Universe"); - } - } - - // When the bug was present, $noinline$testArraySetsHonorWriteBarrier would never set the card - // as dirty (which is incorrect). arr[1]'s' write barrier depends on arr[0]'s write barrier. The - // disappeared BoundType in prepare_for_register_allocation shouldn't skip marking the card - // dirty. - - /// CHECK-START: java.lang.String[] Main.$noinline$testArraySetsHonorWriteBarrier(java.lang.String[], java.lang.String) prepare_for_register_allocation (before) - /// CHECK: <<Null:l\d+>> NullConstant - /// CHECK: <<BT:l\d+>> BoundType [<<Null>>] - /// CHECK: ArraySet [<<arr:l\d+>>,<<index:i\d+>>,<<BT>>] value_can_be_null:true needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn - /// CHECK: ArraySet value_can_be_null:true needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit - - /// CHECK-START: java.lang.String[] Main.$noinline$testArraySetsHonorWriteBarrier(java.lang.String[], java.lang.String) prepare_for_register_allocation (after) - /// CHECK: <<Null:l\d+>> NullConstant - /// CHECK: ArraySet [<<arr:l\d+>>,<<index:i\d+>>,<<Null>>] value_can_be_null:true needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn - /// CHECK: ArraySet value_can_be_null:true needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit - - /// CHECK-START: java.lang.String[] Main.$noinline$testArraySetsHonorWriteBarrier(java.lang.String[], java.lang.String) prepare_for_register_allocation (after) - /// CHECK-NOT: BoundType - - /// CHECK-START: java.lang.String[] Main.$noinline$testArraySetsHonorWriteBarrier(java.lang.String[], java.lang.String) disassembly (after) - /// CHECK: ArraySet value_can_be_null:true needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn - // / CHECK: ; card_table - /// CHECK: ArraySet value_can_be_null:true needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit - private static java.lang.String[] $noinline$testArraySetsHonorWriteBarrier( - String[] arr, String o2) { - Object o = null; - arr[0] = (String) o; - arr[1] = o2; - return arr; - } - - public static void $noinline$testDontSkipWriteBarrier() { - String[] arr = {"Hello", "World"}; - // We first run the gc to make sure the card is clean. - Runtime.getRuntime().gc(); - // Continually call $noinline$testArraySets while allocating over 64 MiB of memory (with - // heap size limited to 16 MiB), in order to increase memory pressure and eventually trigger - // a concurrent garbage collection, which will start by putting the GC in marking mode to - // trigger the bug. - for (int i = 0; i != 64 * 1024; ++i) { - $noinline$allocateAtLeast1KiB(); - $noinline$testArraySetsDontSkipWriteBarrier(arr, null, "Universe"); - } - } - - // When the bug was present, $noinline$testArraySetsDontSkipWriteBarrier would never set the - // card as dirty (which is incorrect). arr[1]'s write barrier depends on arr[0]'s write barrier. - // The code path should mark the card dirty without a null check on `o` in `arr[0] = o`. - - /// CHECK-START: java.lang.String[] Main.$noinline$testArraySetsDontSkipWriteBarrier(java.lang.String[], java.lang.String, java.lang.String) disassembly (after) - /// CHECK: ArraySet value_can_be_null:true needs_type_check:false can_trigger_gc:false write_barrier_kind:EmitBeingReliedOn - /// CHECK: ArraySet value_can_be_null:true needs_type_check:false can_trigger_gc:false write_barrier_kind:DontEmit - private static java.lang.String[] $noinline$testArraySetsDontSkipWriteBarrier( - String[] arr, String o, String o2) { - arr[0] = o; - arr[1] = o2; - return arr; - } - - // Allocate at least 1 KiB of memory on the managed heap. - // Retain some allocated memory and release old allocations so that the - // garbage collector has something to do. - public static void $noinline$allocateAtLeast1KiB() { - memory[allocationIndex] = new Object[1024 / 4]; - ++allocationIndex; - if (allocationIndex == memory.length) { - allocationIndex = 0; - } - } - - public static Object[] memory = new Object[1024]; - public static int allocationIndex = 0; -} diff --git a/test/knownfailures.json b/test/knownfailures.json index a0b7dcd760..269b68d014 100644 --- a/test/knownfailures.json +++ b/test/knownfailures.json @@ -1,5 +1,10 @@ [ { + "tests": "2247-checker-write-barrier-elimination", + "description": ["Disable 2247- until we fix the WBE issue."], + "bug": "http://b/310755375" + }, + { "tests": "153-reference-stress", "description": ["Disable 153-reference-stress temporarily until a fix", "arrives."], |