diff -r c709424ad48f -r 5606867a5e6e src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp --- a/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp Fri Nov 08 10:55:14 2019 +0100 +++ b/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp Fri Nov 08 09:50:07 2019 -0500 @@ -22,8 +22,8 @@ */ #include "precompiled.hpp" +#include "gc/shenandoah/shenandoahBarrierSet.hpp" #include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp" -#include "gc/shenandoah/shenandoahConcurrentRoots.hpp" #include "gc/shenandoah/shenandoahForwarding.hpp" #include "gc/shenandoah/shenandoahHeap.inline.hpp" #include "gc/shenandoah/shenandoahHeapRegion.hpp" @@ -467,8 +467,10 @@ return; } - // 2: load a reference from src location and apply LRB if ShenandoahLoadRefBarrier is set - if (ShenandoahLoadRefBarrier) { + assert((decorators & ON_UNKNOWN_OOP_REF) == 0, "Not expected"); + + // 2: load a reference from src location and apply LRB if needed + if (ShenandoahBarrierSet::need_load_reference_barrier(decorators, type)) { Register result_dst = dst; bool use_tmp1_for_dst = false; @@ -487,9 +489,7 @@ BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread); - // Native barrier is for concurrent root processing - bool in_native = (decorators & IN_NATIVE) != 0; - if (in_native && ShenandoahConcurrentRoots::can_do_concurrent_roots()) { + if (ShenandoahBarrierSet::use_load_reference_barrier_native(decorators, type)) { load_reference_barrier_native(masm, dst, src); } else { load_reference_barrier(masm, dst, src); @@ -509,28 +509,20 @@ BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread); } - // 3: apply keep-alive barrier if ShenandoahKeepAliveBarrier is set - if (ShenandoahKeepAliveBarrier) { - bool on_weak = (decorators & ON_WEAK_OOP_REF) != 0; - bool on_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0; - bool on_reference = on_weak || on_phantom; - bool is_traversal_mode = ShenandoahHeap::heap()->is_traversal_mode(); - bool keep_alive = ((decorators & AS_NO_KEEPALIVE) == 0) || is_traversal_mode; - - if (on_reference && keep_alive) { - const Register thread = NOT_LP64(tmp_thread) LP64_ONLY(r15_thread); - assert_different_registers(dst, tmp1, tmp_thread); - NOT_LP64(__ get_thread(thread)); - // Generate the SATB pre-barrier code to log the value of - // the referent field in an SATB buffer. - shenandoah_write_barrier_pre(masm /* masm */, - noreg /* obj */, - dst /* pre_val */, - thread /* thread */, - tmp1 /* tmp */, - true /* tosca_live */, - true /* expand_call */); - } + // 3: apply keep-alive barrier if needed + if (ShenandoahBarrierSet::need_keep_alive_barrier(decorators, type)) { + const Register thread = NOT_LP64(tmp_thread) LP64_ONLY(r15_thread); + assert_different_registers(dst, tmp1, tmp_thread); + NOT_LP64(__ get_thread(thread)); + // Generate the SATB pre-barrier code to log the value of + // the referent field in an SATB buffer. + shenandoah_write_barrier_pre(masm /* masm */, + noreg /* obj */, + dst /* pre_val */, + thread /* thread */, + tmp1 /* tmp */, + true /* tosca_live */, + true /* expand_call */); } }