8382277: Shenandoah: Improve mutator runtime entry points

Reviewed-by: kdnilsen, xpeng, rkennke
This commit is contained in:
Aleksey Shipilev 2026-04-21 06:18:30 +00:00
parent e7ee8cd39d
commit 7d1ce05ca8
3 changed files with 48 additions and 16 deletions

View File

@ -96,7 +96,6 @@ public:
void on_thread_detach(Thread* thread) override;
static inline oop resolve_forwarded_not_null(oop p);
static inline oop resolve_forwarded_not_null_mutator(oop p);
static inline oop resolve_forwarded(oop p);
template <DecoratorSet decorators, typename T>
@ -109,7 +108,7 @@ public:
inline oop load_reference_barrier(oop obj);
template <class T>
template <DecoratorSet decorators, class T>
inline oop load_reference_barrier_mutator(oop obj, T* load_addr);
template <class T>

View File

@ -56,16 +56,49 @@ inline oop ShenandoahBarrierSet::resolve_forwarded(oop p) {
}
}
inline oop ShenandoahBarrierSet::resolve_forwarded_not_null_mutator(oop p) {
return ShenandoahForwarding::get_forwardee_mutator(p);
}
template <class T>
template <DecoratorSet decorators, class T>
inline oop ShenandoahBarrierSet::load_reference_barrier_mutator(oop obj, T* load_addr) {
assert(ShenandoahLoadRefBarrier, "should be enabled");
shenandoah_assert_in_cset(load_addr, obj);
assert(ShenandoahLoadRefBarrier, "Should be enabled");
oop fwd = resolve_forwarded_not_null_mutator(obj);
constexpr bool on_weak = HasDecorator<decorators, ON_WEAK_OOP_REF>::value;
constexpr bool on_phantom = HasDecorator<decorators, ON_PHANTOM_OOP_REF>::value;
// Handle nulls. Strong loads filtered nulls with cset checks.
// Weak/phantom loads need to check for nulls here.
if (on_weak || on_phantom) {
if (obj == nullptr) {
return nullptr;
}
} else {
assert(obj != nullptr, "Should have been filtered before");
}
// Prevent resurrection of unreachable phantom (i.e. weak-native) references.
if (on_phantom &&
_heap->is_concurrent_weak_root_in_progress() &&
_heap->is_in_active_generation(obj) &&
!_heap->marking_context()->is_marked(obj)) {
return nullptr;
}
// Prevent resurrection of unreachable weak references.
if (on_weak &&
_heap->is_concurrent_weak_root_in_progress() &&
_heap->is_in_active_generation(obj) &&
!_heap->marking_context()->is_marked_strong(obj)) {
return nullptr;
}
// Weak/phantom loads need additional cset check.
if (on_phantom || on_weak) {
if (!_heap->has_forwarded_objects() || !_heap->in_collection_set(obj)) {
return obj;
}
} else {
shenandoah_assert_in_cset(load_addr, obj);
}
oop fwd = ShenandoahForwarding::get_forwardee_mutator(obj);
if (obj == fwd) {
assert(_heap->is_evacuation_in_progress(), "evac should be in progress");
Thread* const t = Thread::current();

View File

@ -49,27 +49,27 @@ JRT_LEAF(void, ShenandoahRuntime::write_barrier_pre(oopDesc* orig))
JRT_END
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_strong(oopDesc* src, oop* load_addr))
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator(src, load_addr);
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_STRONG_OOP_REF, oop>(src, load_addr);
JRT_END
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_strong_narrow(oopDesc* src, narrowOop* load_addr))
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator(src, load_addr);
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_STRONG_OOP_REF, narrowOop>(src, load_addr);
JRT_END
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_weak(oopDesc* src, oop* load_addr))
return (oopDesc*) ShenandoahBarrierSet::barrier_set()->load_reference_barrier<oop>(ON_WEAK_OOP_REF, oop(src), load_addr);
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_WEAK_OOP_REF, oop>(src, load_addr);
JRT_END
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_weak_narrow(oopDesc* src, narrowOop* load_addr))
return (oopDesc*) ShenandoahBarrierSet::barrier_set()->load_reference_barrier<narrowOop>(ON_WEAK_OOP_REF, oop(src), load_addr);
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_WEAK_OOP_REF, narrowOop>(src, load_addr);
JRT_END
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_phantom(oopDesc* src, oop* load_addr))
return (oopDesc*) ShenandoahBarrierSet::barrier_set()->load_reference_barrier<oop>(ON_PHANTOM_OOP_REF, oop(src), load_addr);
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_PHANTOM_OOP_REF, oop>(src, load_addr);
JRT_END
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_phantom_narrow(oopDesc* src, narrowOop* load_addr))
return (oopDesc*) ShenandoahBarrierSet::barrier_set()->load_reference_barrier<narrowOop>(ON_PHANTOM_OOP_REF, oop(src), load_addr);
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_PHANTOM_OOP_REF, narrowOop>(src, load_addr);
JRT_END
JRT_LEAF(void, ShenandoahRuntime::clone_barrier(oopDesc* src))