< 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 >