changeset 12372:2dfccd93510a

Merge
author Christos Kotselidis <christos.kotselidis@oracle.com>
date Fri, 11 Oct 2013 21:41:42 +0200
parents e32f2b195867 (diff) e800bf0c230c (current diff)
children 10b7986aa452
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java src/share/vm/classfile/genericSignatures.cpp src/share/vm/classfile/genericSignatures.hpp src/share/vm/gc_interface/collectedHeap.cpp src/share/vm/graal/graalRuntime.cpp test/gc/metaspace/ClassMetaspaceSizeInJmapHeap.java test/runtime/6878713/Test6878713.sh test/runtime/6878713/testcase.jar test/runtime/7020373/Test7020373.sh test/runtime/7020373/testcase.jar test/runtime/7051189/Xchecksig.sh test/testlibrary/OutputAnalyzerReportingTest.java test/testlibrary/OutputAnalyzerTest.java
diffstat 9 files changed, 63 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierAdditionTest.java	Fri Oct 11 19:20:45 2013 +0200
+++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierAdditionTest.java	Fri Oct 11 21:41:42 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() {
--- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierVerificationTest.java	Fri Oct 11 19:20:45 2013 +0200
+++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierVerificationTest.java	Fri Oct 11 21:41:42 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);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Fri Oct 11 19:20:45 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Fri Oct 11 21:41:42 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");
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Fri Oct 11 19:20:45 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Fri Oct 11 21:41:42 2013 +0200
@@ -731,8 +731,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));
                             }
                         }
@@ -749,7 +749,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));
                             }
                         }
@@ -951,7 +951,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;
@@ -959,12 +959,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) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierVerificationPhase.java	Fri Oct 11 19:20:45 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierVerificationPhase.java	Fri Oct 11 21:41:42 2013 +0200
@@ -71,7 +71,7 @@
         Iterator<Node> 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);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java	Fri Oct 11 19:20:45 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java	Fri Oct 11 21:41:42 2013 +0200
@@ -429,6 +429,11 @@
     }
 
     @Fold
+    public static boolean useDeferredInitBarriers() {
+        return config().useDeferredInitBarriers;
+    }
+
+    @Fold
     public static boolean useG1GC() {
         return config().useG1GC;
     }
--- a/src/share/vm/gc_interface/collectedHeap.cpp	Fri Oct 11 19:20:45 2013 +0200
+++ b/src/share/vm/gc_interface/collectedHeap.cpp	Fri Oct 11 21:41:42 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 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
--- a/src/share/vm/graal/graalGlobals.hpp	Fri Oct 11 19:20:45 2013 +0200
+++ b/src/share/vm/graal/graalGlobals.hpp	Fri Oct 11 21:41:42 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")                                  \
                                                                             \
--- a/src/share/vm/graal/graalRuntime.cpp	Fri Oct 11 19:20:45 2013 +0200
+++ b/src/share/vm/graal/graalRuntime.cpp	Fri Oct 11 21:41:42 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.