C2 verification pass shenandoah barriers

Roland Westrelin rwestrel at redhat.com
Wed Jun 8 08:04:05 UTC 2016


Thanks for looking at this.

> It's ok to commit if you change the read barriers in acmp to write
> barriers.

Here is a new webrev with the acmp barrier change and some other fixes
because of a bug in the verification code:

http://cr.openjdk.java.net/~roland/shenandoah-verif/webrev.01/

Patch of the changes from the previous webrev is below.

Roland.

diff --git a/src/share/vm/opto/graphKit.cpp b/src/share/vm/opto/graphKit.cpp
--- a/src/share/vm/opto/graphKit.cpp
+++ b/src/share/vm/opto/graphKit.cpp
@@ -4694,8 +4694,8 @@
     }
 
     if (ShenandoahVerifyOptoBarriers) {
-      a = shenandoah_read_barrier_impl(a, true, true);
-      b = shenandoah_read_barrier_impl(b, true, true);
+      a = shenandoah_write_barrier(a);
+      b = shenandoah_write_barrier(b);
       return;
     }
 
diff --git a/src/share/vm/opto/library_call.cpp b/src/share/vm/opto/library_call.cpp
--- a/src/share/vm/opto/library_call.cpp
+++ b/src/share/vm/opto/library_call.cpp
@@ -6346,8 +6346,8 @@
          top_dest != NULL && top_dest->klass() != NULL, "args are strange");
 
   src = shenandoah_read_barrier(src);
-  dest = shenandoah_read_barrier(dest);
-  counterMode_object = shenandoah_read_barrier(counterMode_object);
+  dest = shenandoah_write_barrier(dest);
+  counterMode_object = shenandoah_write_barrier(counterMode_object);
 
   // checks are the responsibility of the caller
   Node* src_start = src;
@@ -6459,6 +6459,14 @@
   // The receiver was checked for NULL already.
   Node* objCBC = argument(0);
 
+  Node* src = argument(1);
+  Node* dest = argument(4);
+  if (ShenandoahVerifyOptoBarriers) {
+    // emits write barriers when verification is on and so produce
+    // memory state
+    shenandoah_acmp_barrier(src, dest);
+  }
+
   // Load embeddedCipher field of CipherBlockChaining object.
   Node* embeddedCipherObj = load_field_from_object(objCBC, "embeddedCipher", "Lcom/sun/crypto/provider/SymmetricCipher;", /*is_exact*/ false);
 
@@ -6494,9 +6502,9 @@
   // see the original java code for why.
   RegionNode* region = new RegionNode(3);
   region->init_req(1, instof_false);
-  Node* src = argument(1);
-  Node* dest = argument(4);
-  shenandoah_acmp_barrier(src, dest);
+  if (!ShenandoahVerifyOptoBarriers) {
+    shenandoah_acmp_barrier(src, dest);
+  }
   Node* cmp_src_dest = _gvn.transform(new CmpPNode(src, dest));
   Node* bool_src_dest = _gvn.transform(new BoolNode(cmp_src_dest, BoolTest::eq));
   Node* src_dest_conjoint = generate_guard(bool_src_dest, NULL, PROB_MIN);
diff --git a/src/share/vm/opto/shenandoahSupport.cpp b/src/share/vm/opto/shenandoahSupport.cpp
--- a/src/share/vm/opto/shenandoahSupport.cpp
+++ b/src/share/vm/opto/shenandoahSupport.cpp
@@ -632,7 +632,7 @@
       } else if (in->is_Con()) {
         if (trace) {tty->print("Found constant"); in->dump();}
       } else if (in->is_ShenandoahBarrier()) {
-        if (t == ShenandoahStore && !in->Opcode() == Op_ShenandoahWriteBarrier) {
+        if (t == ShenandoahStore && in->Opcode() != Op_ShenandoahWriteBarrier) {
           return false;
         }
         barriers_used.push(in);
@@ -782,8 +782,8 @@
         } else {
           assert(in2->bottom_type()->isa_oopptr(), "");
           
-          if (!ShenandoahBarrierNode::verify_helper(in1, phis, visited, ShenandoahValue, trace, barriers_used) ||
-              !ShenandoahBarrierNode::verify_helper(in2, phis, visited, ShenandoahValue, trace, barriers_used)) {
+          if (!ShenandoahBarrierNode::verify_helper(in1, phis, visited, ShenandoahStore, trace, barriers_used) ||
+              !ShenandoahBarrierNode::verify_helper(in2, phis, visited, ShenandoahStore, trace, barriers_used)) {
             n->dump(10);
             ShouldNotReachHere();
           }
@@ -818,10 +818,10 @@
         } args[6];
       } calls[] = { 
         "aescrypt_encryptBlock",
-        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahStore },  { TypeFunc::Parms+2, ShenandoahStore },
+        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahStore },  { TypeFunc::Parms+2, ShenandoahLoad },
           { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
         "aescrypt_decryptBlock",
-        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahStore },  { TypeFunc::Parms+2, ShenandoahStore },
+        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahStore },  { TypeFunc::Parms+2, ShenandoahLoad },
           { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
         "multiplyToLen",
         { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+2, ShenandoahLoad },   { TypeFunc::Parms+4, ShenandoahStore },
@@ -836,7 +836,7 @@
         { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahLoad },   { TypeFunc::Parms+5, ShenandoahStore },
           { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
         "mulAdd",
-        { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahStore },  { -1,  ShenandoahNone},
+        { { TypeFunc::Parms, ShenandoahStore },  { TypeFunc::Parms+1, ShenandoahLoad },   { -1,  ShenandoahNone},
           { -1,  ShenandoahNone},                 { -1,  ShenandoahNone},                 { -1,  ShenandoahNone} },
         "vectorizedMismatch",
         { { TypeFunc::Parms, ShenandoahLoad },   { TypeFunc::Parms+1, ShenandoahLoad },   { -1,  ShenandoahNone},



More information about the shenandoah-dev mailing list