Skip to content

Commit 7d1ce05

Browse files
committed
8382277: Shenandoah: Improve mutator runtime entry points
Reviewed-by: kdnilsen, xpeng, rkennke
1 parent e7ee8cd commit 7d1ce05

3 files changed

Lines changed: 48 additions & 16 deletions

File tree

src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ class ShenandoahBarrierSet: public BarrierSet {
9696
void on_thread_detach(Thread* thread) override;
9797

9898
static inline oop resolve_forwarded_not_null(oop p);
99-
static inline oop resolve_forwarded_not_null_mutator(oop p);
10099
static inline oop resolve_forwarded(oop p);
101100

102101
template <DecoratorSet decorators, typename T>
@@ -109,7 +108,7 @@ class ShenandoahBarrierSet: public BarrierSet {
109108

110109
inline oop load_reference_barrier(oop obj);
111110

112-
template <class T>
111+
template <DecoratorSet decorators, class T>
113112
inline oop load_reference_barrier_mutator(oop obj, T* load_addr);
114113

115114
template <class T>

src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,49 @@ inline oop ShenandoahBarrierSet::resolve_forwarded(oop p) {
5656
}
5757
}
5858

59-
inline oop ShenandoahBarrierSet::resolve_forwarded_not_null_mutator(oop p) {
60-
return ShenandoahForwarding::get_forwardee_mutator(p);
61-
}
62-
63-
template <class T>
59+
template <DecoratorSet decorators, class T>
6460
inline oop ShenandoahBarrierSet::load_reference_barrier_mutator(oop obj, T* load_addr) {
65-
assert(ShenandoahLoadRefBarrier, "should be enabled");
66-
shenandoah_assert_in_cset(load_addr, obj);
61+
assert(ShenandoahLoadRefBarrier, "Should be enabled");
62+
63+
constexpr bool on_weak = HasDecorator<decorators, ON_WEAK_OOP_REF>::value;
64+
constexpr bool on_phantom = HasDecorator<decorators, ON_PHANTOM_OOP_REF>::value;
65+
66+
// Handle nulls. Strong loads filtered nulls with cset checks.
67+
// Weak/phantom loads need to check for nulls here.
68+
if (on_weak || on_phantom) {
69+
if (obj == nullptr) {
70+
return nullptr;
71+
}
72+
} else {
73+
assert(obj != nullptr, "Should have been filtered before");
74+
}
75+
76+
// Prevent resurrection of unreachable phantom (i.e. weak-native) references.
77+
if (on_phantom &&
78+
_heap->is_concurrent_weak_root_in_progress() &&
79+
_heap->is_in_active_generation(obj) &&
80+
!_heap->marking_context()->is_marked(obj)) {
81+
return nullptr;
82+
}
83+
84+
// Prevent resurrection of unreachable weak references.
85+
if (on_weak &&
86+
_heap->is_concurrent_weak_root_in_progress() &&
87+
_heap->is_in_active_generation(obj) &&
88+
!_heap->marking_context()->is_marked_strong(obj)) {
89+
return nullptr;
90+
}
91+
92+
// Weak/phantom loads need additional cset check.
93+
if (on_phantom || on_weak) {
94+
if (!_heap->has_forwarded_objects() || !_heap->in_collection_set(obj)) {
95+
return obj;
96+
}
97+
} else {
98+
shenandoah_assert_in_cset(load_addr, obj);
99+
}
67100

68-
oop fwd = resolve_forwarded_not_null_mutator(obj);
101+
oop fwd = ShenandoahForwarding::get_forwardee_mutator(obj);
69102
if (obj == fwd) {
70103
assert(_heap->is_evacuation_in_progress(), "evac should be in progress");
71104
Thread* const t = Thread::current();

src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,27 +49,27 @@ JRT_LEAF(void, ShenandoahRuntime::write_barrier_pre(oopDesc* orig))
4949
JRT_END
5050

5151
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_strong(oopDesc* src, oop* load_addr))
52-
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator(src, load_addr);
52+
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_STRONG_OOP_REF, oop>(src, load_addr);
5353
JRT_END
5454

5555
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_strong_narrow(oopDesc* src, narrowOop* load_addr))
56-
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator(src, load_addr);
56+
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_STRONG_OOP_REF, narrowOop>(src, load_addr);
5757
JRT_END
5858

5959
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_weak(oopDesc* src, oop* load_addr))
60-
return (oopDesc*) ShenandoahBarrierSet::barrier_set()->load_reference_barrier<oop>(ON_WEAK_OOP_REF, oop(src), load_addr);
60+
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_WEAK_OOP_REF, oop>(src, load_addr);
6161
JRT_END
6262

6363
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_weak_narrow(oopDesc* src, narrowOop* load_addr))
64-
return (oopDesc*) ShenandoahBarrierSet::barrier_set()->load_reference_barrier<narrowOop>(ON_WEAK_OOP_REF, oop(src), load_addr);
64+
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_WEAK_OOP_REF, narrowOop>(src, load_addr);
6565
JRT_END
6666

6767
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_phantom(oopDesc* src, oop* load_addr))
68-
return (oopDesc*) ShenandoahBarrierSet::barrier_set()->load_reference_barrier<oop>(ON_PHANTOM_OOP_REF, oop(src), load_addr);
68+
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_PHANTOM_OOP_REF, oop>(src, load_addr);
6969
JRT_END
7070

7171
JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_phantom_narrow(oopDesc* src, narrowOop* load_addr))
72-
return (oopDesc*) ShenandoahBarrierSet::barrier_set()->load_reference_barrier<narrowOop>(ON_PHANTOM_OOP_REF, oop(src), load_addr);
72+
return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator<ON_PHANTOM_OOP_REF, narrowOop>(src, load_addr);
7373
JRT_END
7474

7575
JRT_LEAF(void, ShenandoahRuntime::clone_barrier(oopDesc* src))

0 commit comments

Comments
 (0)