--- old/src/share/vm/opto/parse3.cpp 2015-10-14 13:54:27.040579429 +0200 +++ new/src/share/vm/opto/parse3.cpp 2015-10-14 13:54:26.948581654 +0200 @@ -162,6 +162,10 @@ // Compute address and memory type. int offset = field->offset_in_bytes(); const TypePtr* adr_type = C->alias_type(field)->adr_type(); + + // Insert read barrier for Shenandoah. + obj = shenandoah_read_barrier(obj); + Node *adr = basic_plus_adr(obj, obj, offset); BasicType bt = field->layout_type(); @@ -244,6 +248,9 @@ // another volatile read. if (is_vol) insert_mem_bar(Op_MemBarRelease); + // Insert write barrier for Shenandoah. + obj = shenandoah_write_barrier(obj); + // Compute address and memory type. int offset = field->offset_in_bytes(); const TypePtr* adr_type = C->alias_type(field)->adr_type(); @@ -273,6 +280,9 @@ } else { field_type = TypeOopPtr::make_from_klass(field->type()->as_klass()); } + + val = shenandoah_read_barrier_nomem(val); + store = store_oop_to_object(control(), obj, adr, adr_type, val, field_type, bt, mo); } else { bool needs_atomic_access = is_vol || AlwaysAtomicAccesses;