# HG changeset patch # User Christos Kotselidis # Date 1381536616 -7200 # Node ID 5fc50ffe4e655f8b8d58c7eb3aab0a389b8891eb # Parent 7b1f522884ee1c260b517d8d7f8ac6e53dd0e625# Parent 78e5badf4b8e932d6bb69e7243169dd84ae646cc Merge diff -r 78e5badf4b8e -r 5fc50ffe4e65 graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierAdditionTest.java --- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierAdditionTest.java Sat Oct 12 01:03:47 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierAdditionTest.java Sat Oct 12 02:10:16 2013 +0200 @@ -72,7 +72,13 @@ */ @Test public void test1() throws Exception { - test("test1Snippet", useG1GC() ? 4 : 2); + int expectedBarriers = 0; + if (useG1GC()) { + expectedBarriers = (useDeferredInitBarriers() ? 0 : 4); + } else { + expectedBarriers = (useDeferredInitBarriers() ? 0 : 2); + } + test("test1Snippet", expectedBarriers); } public static void test1Snippet() { @@ -88,7 +94,13 @@ */ @Test public void test2() throws Exception { - test("test2Snippet", useG1GC() ? 8 : 4); + int expectedBarriers = 0; + if (useG1GC()) { + expectedBarriers = (useDeferredInitBarriers() ? 0 : 8); + } else { + expectedBarriers = (useDeferredInitBarriers() ? 0 : 4); + } + test("test2Snippet", expectedBarriers); } public static void test2Snippet(boolean test) { @@ -134,7 +146,13 @@ */ @Test public void test4() throws Exception { - test("test4Snippet", useG1GC() ? 5 : 2); + int expectedBarriers = 0; + if (useG1GC()) { + expectedBarriers = (useDeferredInitBarriers() ? 1 : 5); + } else { + expectedBarriers = (useDeferredInitBarriers() ? 0 : 2); + } + test("test4Snippet", expectedBarriers); } public static Object test4Snippet() { diff -r 78e5badf4b8e -r 5fc50ffe4e65 graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierVerificationTest.java --- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierVerificationTest.java Sat Oct 12 01:03:47 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierVerificationTest.java Sat Oct 12 02:10:16 2013 +0200 @@ -62,8 +62,7 @@ private static native void safepoint(); - public static void test1Snippet() { - Container main = new Container(); + public static void test1Snippet(Container main) { Container temp1 = new Container(); Container temp2 = new Container(); barrierIndex = 0; @@ -86,8 +85,7 @@ test("test1Snippet", 2, new int[]{2}); } - public static void test2Snippet() { - Container main = new Container(); + public static void test2Snippet(Container main) { Container temp1 = new Container(); Container temp2 = new Container(); barrierIndex = 0; @@ -109,8 +107,7 @@ test("test2Snippet", 2, new int[]{2}); } - public static void test3Snippet(boolean test) { - Container main = new Container(); + public static void test3Snippet(Container main, boolean test) { Container temp1 = new Container(); Container temp2 = new Container(); barrierIndex = 0; @@ -160,8 +157,7 @@ test("test3Snippet", 4, new int[]{4}); } - public static void test4Snippet(boolean test) { - Container main = new Container(); + public static void test4Snippet(Container main, boolean test) { Container temp1 = new Container(); Container temp2 = new Container(); safepoint(); @@ -197,8 +193,7 @@ test("test4Snippet", 5, new int[]{1}); } - public static void test5Snippet() { - Container main = new Container(); + public static void test5Snippet(Container main) { Container temp1 = new Container(); Container temp2 = new Container(); safepoint(); @@ -253,8 +248,7 @@ test("test5Snippet", 5, new int[]{4, 5}); } - public static void test6Snippet(boolean test) { - Container main = new Container(); + public static void test6Snippet(Container main, boolean test) { Container temp1 = new Container(); Container temp2 = new Container(); safepoint(); @@ -294,8 +288,7 @@ test("test6Snippet", 5, new int[]{4}); } - public static void test7Snippet(boolean test) { - Container main = new Container(); + public static void test7Snippet(Container main, boolean test) { Container temp1 = new Container(); Container temp2 = new Container(); safepoint(); @@ -330,8 +323,7 @@ test("test7Snippet", 3, new int[]{1}); } - public static void test8Snippet(boolean test) { - Container main = new Container(); + public static void test8Snippet(Container main, boolean test) { Container temp1 = new Container(); Container temp2 = new Container(); safepoint(); @@ -359,9 +351,7 @@ test("test8Snippet", 2, new int[]{1, 2}); } - public static void test9Snippet(boolean test) { - Container main1 = new Container(); - Container main2 = new Container(); + public static void test9Snippet(Container main1, Container main2, boolean test) { Container temp1 = new Container(); Container temp2 = new Container(); safepoint(); @@ -409,9 +399,7 @@ test("test9Snippet", 4, new int[]{3, 4}); } - public static void test10Snippet(boolean test) { - Container main1 = new Container(); - Container main2 = new Container(); + public static void test10Snippet(Container main1, Container main2, boolean test) { Container temp1 = new Container(); Container temp2 = new Container(); safepoint(); @@ -471,10 +459,7 @@ test("test10Snippet", 5, new int[]{3, 4}); } - public static void test11Snippet(boolean test) { - Container main1 = new Container(); - Container main2 = new Container(); - Container main3 = new Container(); + public static void test11Snippet(Container main1, Container main2, Container main3, boolean test) { Container temp1 = new Container(); Container temp2 = new Container(); safepoint(); @@ -561,14 +546,12 @@ test("test11Snippet", 11, new int[]{5}); } - @Test + @Test(expected = AssertionError.class) public void test56() { test("test11Snippet", 11, new int[]{11}); } - public static void test12Snippet(boolean test) { - Container main = new Container(); - Container main1 = new Container(); + public static void test12Snippet(Container main, Container main1, boolean test) { Container temp1 = new Container(); Container temp2 = new Container(); barrierIndex = 0; @@ -718,7 +701,7 @@ * Catch assertion, test for expected one and re-throw in order to validate unit * test. */ - Assert.assertTrue(error.getMessage().equals("Write barrier must be present")); + Assert.assertTrue(error.getMessage().contains("Write barrier must be present")); return error; } finally { Debug.setConfig(config); diff -r 78e5badf4b8e -r 5fc50ffe4e65 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Sat Oct 12 01:03:47 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Sat Oct 12 02:10:16 2013 +0200 @@ -137,6 +137,7 @@ public final boolean useCRC32Intrinsics = getVMOption("UseCRC32Intrinsics"); public final boolean useG1GC = getVMOption("UseG1GC"); public final long gcTotalCollectionsAddress = getUninitializedLong(); + public final boolean useDeferredInitBarriers = getVMOption("GraalDeferredInitBarriers"); // Compressed Oops related values. public final boolean useCompressedOops = getVMOption("UseCompressedOops"); diff -r 78e5badf4b8e -r 5fc50ffe4e65 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Sat Oct 12 01:03:47 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Sat Oct 12 02:10:16 2013 +0200 @@ -732,8 +732,8 @@ } if (!(value.isConstant() && value.asConstant().isDefaultForKind())) { WriteNode write = new WriteNode(newObject, value, createFieldLocation(graph, (HotSpotResolvedJavaField) virtualInstance.field(i), true), - virtualInstance.field(i).getKind() == Kind.Object ? BarrierType.IMPRECISE : BarrierType.NONE, virtualInstance.field(i).getKind() == Kind.Object); - + (virtualInstance.field(i).getKind() == Kind.Object && !deferInitBarrier(newObject)) ? BarrierType.IMPRECISE : BarrierType.NONE, + virtualInstance.field(i).getKind() == Kind.Object); graph.addBeforeFixed(commit, graph.add(write)); } } @@ -750,7 +750,7 @@ } if (!(value.isConstant() && value.asConstant().isDefaultForKind())) { WriteNode write = new WriteNode(newObject, value, createArrayLocation(graph, element.getKind(), ConstantNode.forInt(i, graph), true), - value.kind() == Kind.Object ? BarrierType.PRECISE : BarrierType.NONE, value.kind() == Kind.Object); + (value.kind() == Kind.Object && !deferInitBarrier(newObject)) ? BarrierType.PRECISE : BarrierType.NONE, value.kind() == Kind.Object); graph.addBeforeFixed(commit, graph.add(write)); } } @@ -952,7 +952,7 @@ private static BarrierType getFieldStoreBarrierType(StoreFieldNode storeField) { BarrierType barrierType = BarrierType.NONE; - if (storeField.field().getKind() == Kind.Object) { + if (storeField.field().getKind() == Kind.Object && !deferInitBarrier(storeField.object())) { barrierType = BarrierType.IMPRECISE; } return barrierType; @@ -960,12 +960,16 @@ private static BarrierType getArrayStoreBarrierType(StoreIndexedNode store) { BarrierType barrierType = BarrierType.NONE; - if (store.elementKind() == Kind.Object) { + if (store.elementKind() == Kind.Object && !deferInitBarrier(store.array())) { barrierType = BarrierType.PRECISE; } return barrierType; } + private static boolean deferInitBarrier(ValueNode object) { + return useDeferredInitBarriers() && (object instanceof NewInstanceNode || object instanceof NewArrayNode); + } + private static BarrierType getUnsafeStoreBarrierType(UnsafeStoreNode store) { BarrierType barrierType = BarrierType.NONE; if (store.value().kind() == Kind.Object) { diff -r 78e5badf4b8e -r 5fc50ffe4e65 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierVerificationPhase.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierVerificationPhase.java Sat Oct 12 01:03:47 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierVerificationPhase.java Sat Oct 12 02:10:16 2013 +0200 @@ -71,7 +71,7 @@ Iterator iterator = frontier.iterator(); while (iterator.hasNext()) { Node currentNode = iterator.next(); - assert !isSafepoint(currentNode) : "Write barrier must be present"; + assert !isSafepoint(currentNode) : "Write barrier must be present " + write; if (useG1GC()) { if (!(currentNode instanceof G1PostWriteBarrier) || ((currentNode instanceof G1PostWriteBarrier) && !validateBarrier((AccessNode) write, (WriteBarrier) currentNode))) { expandFrontier(frontier, currentNode); diff -r 78e5badf4b8e -r 5fc50ffe4e65 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Sat Oct 12 01:03:47 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Sat Oct 12 02:10:16 2013 +0200 @@ -429,6 +429,11 @@ } @Fold + public static boolean useDeferredInitBarriers() { + return config().useDeferredInitBarriers; + } + + @Fold public static boolean useG1GC() { return config().useG1GC; } diff -r 78e5badf4b8e -r 5fc50ffe4e65 src/share/vm/gc_interface/collectedHeap.cpp --- a/src/share/vm/gc_interface/collectedHeap.cpp Sat Oct 12 01:03:47 2013 +0200 +++ b/src/share/vm/gc_interface/collectedHeap.cpp Sat Oct 12 02:10:16 2013 +0200 @@ -215,6 +215,9 @@ #ifdef COMPILER2 _defer_initial_card_mark = ReduceInitialCardMarks && can_elide_tlab_store_barriers() && (DeferInitialCardMark || card_mark_must_follow_store()); +#elif defined GRAAL + _defer_initial_card_mark = GraalDeferredInitBarriers && can_elide_tlab_store_barriers() + && (DeferInitialCardMark || card_mark_must_follow_store()); #else assert(_defer_initial_card_mark == false, "Who would set it?"); #endif diff -r 78e5badf4b8e -r 5fc50ffe4e65 src/share/vm/graal/graalGlobals.hpp --- a/src/share/vm/graal/graalGlobals.hpp Sat Oct 12 01:03:47 2013 +0200 +++ b/src/share/vm/graal/graalGlobals.hpp Sat Oct 12 02:10:16 2013 +0200 @@ -55,6 +55,9 @@ product(intx, TraceGraal, 0, \ "Trace level for Graal") \ \ + product(bool, GraalDeferredInitBarriers, false, \ + "Defer write barriers of young objects") \ + \ develop(bool, GraalUseFastLocking, true, \ "Use fast inlined locking code") \ \ diff -r 78e5badf4b8e -r 5fc50ffe4e65 src/share/vm/graal/graalRuntime.cpp --- a/src/share/vm/graal/graalRuntime.cpp Sat Oct 12 01:03:47 2013 +0200 +++ b/src/share/vm/graal/graalRuntime.cpp Sat Oct 12 02:10:16 2013 +0200 @@ -64,6 +64,9 @@ h->initialize(CHECK); // allocate instance and return via TLS oop obj = h->allocate_instance(CHECK); + if (GraalDeferredInitBarriers) { + obj = Universe::heap()->new_store_pre_barrier(thread, obj); + } thread->set_vm_result(obj); JRT_END @@ -80,6 +83,9 @@ Klass* elem_klass = ObjArrayKlass::cast(array_klass)->element_klass(); obj = oopFactory::new_objArray(elem_klass, length, CHECK); } + if (GraalDeferredInitBarriers) { + obj = Universe::heap()->new_store_pre_barrier(thread, obj); + } thread->set_vm_result(obj); // This is pretty rare but this runtime patch is stressful to deoptimization // if we deoptimize here so force a deopt to stress the path.