< prev index next >

src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp

Print this page
rev 56771 : 8233339: Shenandoah: Centralize load barrier decisions into ShenandoahBarrierSet

*** 201,222 **** const bool patch_before_barrier = access.is_oop() && (access.decorators() & C1_NEEDS_PATCHING) != 0; return BarrierSetC1::resolve_address(access, resolve_in_register || patch_before_barrier); } void ShenandoahBarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) { ! if (!access.is_oop()) { BarrierSetC1::load_at_resolved(access, result); return; } LIRGenerator* gen = access.gen(); ! DecoratorSet decorators = access.decorators(); ! bool is_traversal_mode = ShenandoahHeap::heap()->is_traversal_mode(); ! ! if ((decorators & IN_NATIVE) != 0 && !is_traversal_mode) { ! assert(access.is_oop(), "IN_NATIVE access only for oop values"); BarrierSetC1::load_at_resolved(access, result); LIR_OprList* args = new LIR_OprList(); LIR_Opr addr = access.resolved_addr(); addr = ensure_in_register(gen, addr); args->append(result); --- 201,224 ---- const bool patch_before_barrier = access.is_oop() && (access.decorators() & C1_NEEDS_PATCHING) != 0; return BarrierSetC1::resolve_address(access, resolve_in_register || patch_before_barrier); } void ShenandoahBarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) { ! DecoratorSet decorators = access.decorators(); ! assert((decorators & AS_RAW) == 0, "Unexpected decorator"); ! assert((decorators & AS_NO_KEEPALIVE) == 0, "Unexpected decorator"); ! BasicType type = access.type(); ! bool need_load_reference_barrier = ShenandoahBarrierSet::need_load_reference_barrier(decorators, type); ! ! if (!need_load_reference_barrier) { BarrierSetC1::load_at_resolved(access, result); return; } LIRGenerator* gen = access.gen(); ! if (ShenandoahBarrierSet::use_native_load_reference_barrier(decorators, type)) { BarrierSetC1::load_at_resolved(access, result); LIR_OprList* args = new LIR_OprList(); LIR_Opr addr = access.resolved_addr(); addr = ensure_in_register(gen, addr); args->append(result);
*** 227,253 **** LIR_Opr call_result = gen->call_runtime(&signature, args, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native), objectType, NULL); __ move(call_result, result); } else { - if (ShenandoahLoadRefBarrier) { LIR_Opr tmp = gen->new_register(T_OBJECT); BarrierSetC1::load_at_resolved(access, tmp); tmp = load_reference_barrier(access.gen(), tmp, access.resolved_addr()); __ move(tmp, result); - } else { - BarrierSetC1::load_at_resolved(access, result); - } } ! if (ShenandoahKeepAliveBarrier) { ! bool is_weak = (decorators & ON_WEAK_OOP_REF) != 0; ! bool is_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0; bool is_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0; - bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0 || is_traversal_mode; - if ((is_weak || is_phantom || is_anonymous) && keep_alive) { // Register the value in the referent field with the pre-barrier LabelObj *Lcont_anonymous; if (is_anonymous) { Lcont_anonymous = new LabelObj(); generate_referent_check(access, Lcont_anonymous); --- 229,247 ---- LIR_Opr call_result = gen->call_runtime(&signature, args, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native), objectType, NULL); __ move(call_result, result); } else { LIR_Opr tmp = gen->new_register(T_OBJECT); BarrierSetC1::load_at_resolved(access, tmp); tmp = load_reference_barrier(access.gen(), tmp, access.resolved_addr()); __ move(tmp, result); } ! if (ShenandoahBarrierSet::need_keep_alive_barrier(decorators, type)) { bool is_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0; // Register the value in the referent field with the pre-barrier LabelObj *Lcont_anonymous; if (is_anonymous) { Lcont_anonymous = new LabelObj(); generate_referent_check(access, Lcont_anonymous);
*** 256,266 **** result /* pre_val */); if (is_anonymous) { __ branch_destination(Lcont_anonymous->label()); } } - } } class C1ShenandoahPreBarrierCodeGenClosure : public StubAssemblerCodeGenClosure { virtual OopMapSet* generate_code(StubAssembler* sasm) { ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler(); --- 250,259 ----
< prev index next >