Skip to content
This repository was archived by the owner on Aug 27, 2022. It is now read-only.

Commit b0c28fa

Browse files
committed
8256011: Shenandoah: Don't resurrect finalizably reachable objects
Reviewed-by: shade, zgu
1 parent 41139e3 commit b0c28fa

16 files changed

+303
-283
lines changed

src/hotspot/cpu/aarch64/gc/shenandoah/c1/shenandoahBarrierSetC1_aarch64.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ LIR_Opr ShenandoahBarrierSetC1::atomic_xchg_at_resolved(LIRAccess& access, LIRIt
109109
__ xchg(access.resolved_addr(), value_opr, result, tmp);
110110

111111
if (access.is_oop()) {
112-
result = load_reference_barrier(access.gen(), result, LIR_OprFact::addressConst(0), ShenandoahBarrierSet::AccessKind::NORMAL);
112+
result = load_reference_barrier(access.gen(), result, LIR_OprFact::addressConst(0), access.decorators());
113113
LIR_Opr tmp = gen->new_register(type);
114114
__ move(result, tmp);
115115
result = tmp;

src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp

Lines changed: 71 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -225,11 +225,17 @@ void ShenandoahBarrierSetAssembler::resolve_forward_pointer_not_null(MacroAssemb
225225
}
226226
}
227227

228-
void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm, Register dst, Address load_addr, ShenandoahBarrierSet::AccessKind kind) {
228+
void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm, Register dst, Address load_addr, DecoratorSet decorators) {
229229
assert(ShenandoahLoadRefBarrier, "Should be enabled");
230230
assert(dst != rscratch2, "need rscratch2");
231231
assert_different_registers(load_addr.base(), load_addr.index(), rscratch1, rscratch2);
232232

233+
bool is_strong = ShenandoahBarrierSet::is_strong_access(decorators);
234+
bool is_weak = ShenandoahBarrierSet::is_weak_access(decorators);
235+
bool is_phantom = ShenandoahBarrierSet::is_phantom_access(decorators);
236+
bool is_native = ShenandoahBarrierSet::is_native_access(decorators);
237+
bool is_narrow = UseCompressedOops && !is_native;
238+
233239
Label heap_stable, not_cset;
234240
__ enter();
235241
Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
@@ -252,34 +258,30 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
252258
__ mov(r0, dst);
253259

254260
// Test for in-cset
255-
if (kind == ShenandoahBarrierSet::AccessKind::NORMAL) {
261+
if (is_strong) {
256262
__ mov(rscratch2, ShenandoahHeap::in_cset_fast_test_addr());
257263
__ lsr(rscratch1, r0, ShenandoahHeapRegion::region_size_bytes_shift_jint());
258264
__ ldrb(rscratch2, Address(rscratch2, rscratch1));
259265
__ tbz(rscratch2, 0, not_cset);
260266
}
261267

262268
__ push_call_clobbered_registers();
263-
switch (kind) {
264-
case ShenandoahBarrierSet::AccessKind::NORMAL:
265-
if (UseCompressedOops) {
266-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_narrow));
267-
} else {
268-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier));
269-
}
270-
break;
271-
case ShenandoahBarrierSet::AccessKind::WEAK:
272-
if (UseCompressedOops) {
273-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak_narrow));
274-
} else {
275-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak));
276-
}
277-
break;
278-
case ShenandoahBarrierSet::AccessKind::NATIVE:
269+
if (is_strong) {
270+
if (is_narrow) {
271+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong_narrow));
272+
} else {
273+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong));
274+
}
275+
} else if (is_weak) {
276+
if (is_narrow) {
277+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak_narrow));
278+
} else {
279279
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak));
280-
break;
281-
default:
282-
ShouldNotReachHere();
280+
}
281+
} else {
282+
assert(is_phantom, "only remaining strength");
283+
assert(!is_narrow, "phantom access cannot be narrow");
284+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak));
283285
}
284286
__ blr(lr);
285287
__ mov(rscratch1, r0);
@@ -338,8 +340,7 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet d
338340

339341
BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
340342

341-
ShenandoahBarrierSet::AccessKind kind = ShenandoahBarrierSet::access_kind(decorators, type);
342-
load_reference_barrier(masm, dst, src, kind);
343+
load_reference_barrier(masm, dst, src, decorators);
343344

344345
if (dst != result_dst) {
345346
__ mov(result_dst, dst);
@@ -617,6 +618,12 @@ void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assemble
617618
ShenandoahBarrierSetC1* bs = (ShenandoahBarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1();
618619
__ bind(*stub->entry());
619620

621+
DecoratorSet decorators = stub->decorators();
622+
bool is_strong = ShenandoahBarrierSet::is_strong_access(decorators);
623+
bool is_weak = ShenandoahBarrierSet::is_weak_access(decorators);
624+
bool is_phantom = ShenandoahBarrierSet::is_phantom_access(decorators);
625+
bool is_native = ShenandoahBarrierSet::is_native_access(decorators);
626+
620627
Register obj = stub->obj()->as_register();
621628
Register res = stub->result()->as_register();
622629
Register addr = stub->addr()->as_pointer_register();
@@ -629,42 +636,27 @@ void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assemble
629636
__ mov(res, obj);
630637
}
631638

632-
// Check for null.
633-
__ cbz(res, *stub->continuation());
634-
635-
// Check for object in cset.
636-
__ mov(tmp2, ShenandoahHeap::in_cset_fast_test_addr());
637-
__ lsr(tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint());
638-
__ ldrb(tmp2, Address(tmp2, tmp1));
639-
__ cbz(tmp2, *stub->continuation());
640-
641-
// Check if object is already forwarded.
642-
Label slow_path;
643-
__ ldr(tmp1, Address(res, oopDesc::mark_offset_in_bytes()));
644-
__ eon(tmp1, tmp1, zr);
645-
__ ands(zr, tmp1, markWord::lock_mask_in_place);
646-
__ br(Assembler::NE, slow_path);
647-
648-
// Decode forwarded object.
649-
__ orr(tmp1, tmp1, markWord::marked_value);
650-
__ eon(res, tmp1, zr);
651-
__ b(*stub->continuation());
639+
if (is_strong) {
640+
// Check for object in cset.
641+
__ mov(tmp2, ShenandoahHeap::in_cset_fast_test_addr());
642+
__ lsr(tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint());
643+
__ ldrb(tmp2, Address(tmp2, tmp1));
644+
__ cbz(tmp2, *stub->continuation());
645+
}
652646

653-
__ bind(slow_path);
654647
ce->store_parameter(res, 0);
655648
ce->store_parameter(addr, 1);
656-
switch (stub->kind()) {
657-
case ShenandoahBarrierSet::AccessKind::NORMAL:
658-
__ far_call(RuntimeAddress(bs->load_reference_barrier_normal_rt_code_blob()->code_begin()));
659-
break;
660-
case ShenandoahBarrierSet::AccessKind::WEAK:
661-
__ far_call(RuntimeAddress(bs->load_reference_barrier_weak_rt_code_blob()->code_begin()));
662-
break;
663-
case ShenandoahBarrierSet::AccessKind::NATIVE:
664-
__ far_call(RuntimeAddress(bs->load_reference_barrier_native_rt_code_blob()->code_begin()));
665-
break;
666-
default:
667-
ShouldNotReachHere();
649+
if (is_strong) {
650+
if (is_native) {
651+
__ far_call(RuntimeAddress(bs->load_reference_barrier_strong_native_rt_code_blob()->code_begin()));
652+
} else {
653+
__ far_call(RuntimeAddress(bs->load_reference_barrier_strong_rt_code_blob()->code_begin()));
654+
}
655+
} else if (is_weak) {
656+
__ far_call(RuntimeAddress(bs->load_reference_barrier_weak_rt_code_blob()->code_begin()));
657+
} else {
658+
assert(is_phantom, "only remaining strength");
659+
__ far_call(RuntimeAddress(bs->load_reference_barrier_phantom_rt_code_blob()->code_begin()));
668660
}
669661

670662
__ b(*stub->continuation());
@@ -720,33 +712,39 @@ void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAss
720712
__ epilogue();
721713
}
722714

723-
void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_stub(StubAssembler* sasm, ShenandoahBarrierSet::AccessKind kind) {
715+
void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_stub(StubAssembler* sasm, DecoratorSet decorators) {
724716
__ prologue("shenandoah_load_reference_barrier", false);
725717
// arg0 : object to be resolved
726718

727719
__ push_call_clobbered_registers();
728720
__ load_parameter(0, r0);
729721
__ load_parameter(1, r1);
730-
switch (kind) {
731-
case ShenandoahBarrierSet::AccessKind::NORMAL:
732-
if (UseCompressedOops) {
733-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_narrow));
734-
} else {
735-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier));
736-
}
737-
break;
738-
case ShenandoahBarrierSet::AccessKind::WEAK:
722+
723+
bool is_strong = ShenandoahBarrierSet::is_strong_access(decorators);
724+
bool is_weak = ShenandoahBarrierSet::is_weak_access(decorators);
725+
bool is_phantom = ShenandoahBarrierSet::is_phantom_access(decorators);
726+
bool is_native = ShenandoahBarrierSet::is_native_access(decorators);
727+
if (is_strong) {
728+
if (is_native) {
729+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong));
730+
} else {
739731
if (UseCompressedOops) {
740-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak_narrow));
732+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong_narrow));
741733
} else {
742-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak));
734+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong));
743735
}
744-
break;
745-
case ShenandoahBarrierSet::AccessKind::NATIVE:
736+
}
737+
} else if (is_weak) {
738+
assert(!is_native, "weak must not be called off-heap");
739+
if (UseCompressedOops) {
740+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak_narrow));
741+
} else {
746742
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak));
747-
break;
748-
default:
749-
ShouldNotReachHere();
743+
}
744+
} else {
745+
assert(is_phantom, "only remaining strength");
746+
assert(is_native, "phantom must only be called off-heap");
747+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_phantom));
750748
}
751749
__ blr(lr);
752750
__ mov(rscratch1, r0);

src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class ShenandoahBarrierSetAssembler: public BarrierSetAssembler {
5656

5757
void resolve_forward_pointer(MacroAssembler* masm, Register dst, Register tmp = noreg);
5858
void resolve_forward_pointer_not_null(MacroAssembler* masm, Register dst, Register tmp = noreg);
59-
void load_reference_barrier(MacroAssembler* masm, Register dst, Address load_addr, ShenandoahBarrierSet::AccessKind kind);
59+
void load_reference_barrier(MacroAssembler* masm, Register dst, Address load_addr, DecoratorSet decorators);
6060

6161
public:
6262

@@ -66,7 +66,7 @@ class ShenandoahBarrierSetAssembler: public BarrierSetAssembler {
6666
void gen_pre_barrier_stub(LIR_Assembler* ce, ShenandoahPreBarrierStub* stub);
6767
void gen_load_reference_barrier_stub(LIR_Assembler* ce, ShenandoahLoadReferenceBarrierStub* stub);
6868
void generate_c1_pre_barrier_runtime_stub(StubAssembler* sasm);
69-
void generate_c1_load_reference_barrier_runtime_stub(StubAssembler* sasm, ShenandoahBarrierSet::AccessKind kind);
69+
void generate_c1_load_reference_barrier_runtime_stub(StubAssembler* sasm, DecoratorSet decorators);
7070
#endif
7171

7272
virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,

src/hotspot/cpu/x86/gc/shenandoah/c1/shenandoahBarrierSetC1_x86.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,7 @@ LIR_Opr ShenandoahBarrierSetC1::atomic_xchg_at_resolved(LIRAccess& access, LIRIt
111111
__ xchg(access.resolved_addr(), result, result, LIR_OprFact::illegalOpr);
112112

113113
if (access.is_oop()) {
114-
ShenandoahBarrierSet::AccessKind kind = ShenandoahBarrierSet::access_kind(access.decorators(), access.type());
115-
result = load_reference_barrier(access.gen(), result, LIR_OprFact::addressConst(0), kind);
114+
result = load_reference_barrier(access.gen(), result, LIR_OprFact::addressConst(0), access.decorators());
116115
LIR_Opr tmp = gen->new_register(type);
117116
__ move(result, tmp);
118117
result = tmp;

0 commit comments

Comments
 (0)