7170145: C1 doesn't respect the JMM with volatile field loads

Reviewed-by: kvn, roland
This commit is contained in:
Christian Thalinger 2012-05-25 11:39:13 -07:00
parent a9ea68bd3f
commit 687fab1763

@ -141,8 +141,11 @@ class ValueNumberingVisitor: public InstructionVisitor {
// visitor functions
void do_StoreField (StoreField* x) {
if (x->is_init_point()) {
// putstatic is an initialization point so treat it as a wide kill
if (x->is_init_point() || // putstatic is an initialization point so treat it as a wide kill
// This is actually too strict and the JMM doesn't require
// this in all cases (e.g. load a; volatile store b; load a)
// but possible future optimizations might require this.
x->field()->is_volatile()) {
kill_memory();
} else {
kill_field(x->field());
@ -160,8 +163,8 @@ class ValueNumberingVisitor: public InstructionVisitor {
void do_Local (Local* x) { /* nothing to do */ }
void do_Constant (Constant* x) { /* nothing to do */ }
void do_LoadField (LoadField* x) {
if (x->is_init_point()) {
// getstatic is an initialization point so treat it as a wide kill
if (x->is_init_point() || // getstatic is an initialization point so treat it as a wide kill
x->field()->is_volatile()) { // the JMM requires this
kill_memory();
}
}