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