# HG changeset patch # Parent 29edf1cb3c02f70b03a358c3dd958a62853e4ce5 diff -r 29edf1cb3c02 src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp --- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp Fri Mar 13 17:45:55 2020 +0800 +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp Fri Mar 13 23:05:14 2020 +0100 @@ -985,9 +985,25 @@ phase->register_new_node(raw_rbtrue, ctrl); Node* cset_offset = new URShiftXNode(raw_rbtrue, phase->igvn().intcon(ShenandoahHeapRegion::region_size_bytes_shift_jint())); phase->register_new_node(cset_offset, ctrl); - Node* in_cset_fast_test_base_addr = phase->igvn().makecon(TypeRawPtr::make(ShenandoahHeap::in_cset_fast_test_addr())); - phase->set_ctrl(in_cset_fast_test_base_addr, phase->C->root()); - Node* in_cset_fast_test_adr = new AddPNode(phase->C->top(), in_cset_fast_test_base_addr, cset_offset); + + Node* thread = new ThreadLocalNode(); + phase->register_new_node(thread, ctrl); + Node* offset = phase->igvn().MakeConX(in_bytes(ShenandoahThreadLocalData::cset_base_addr_offset())); + phase->set_ctrl(offset, phase->C->root()); + Node* cset_base_addr_addr = new AddPNode(phase->C->top(), thread, offset); + phase->register_new_node(cset_base_addr_addr, ctrl); + uint cset_base_addr_idx = Compile::AliasIdxRaw; + const TypePtr* cset_base_addr_type = NULL; // debug-mode-only argument + debug_only(cset_base_addr_type = phase->C->get_adr_type(cset_base_addr_idx)); + Node* in_cset_fast_test_base_addr = new LoadXNode(ctrl, raw_mem, cset_base_addr_addr, cset_base_addr_type, TypeX_X, MemNode::unordered); + phase->register_new_node(in_cset_fast_test_base_addr, ctrl); + + Node* locl = new AddXNode(cset_offset, in_cset_fast_test_base_addr); + phase->register_new_node(locl, ctrl); + Node* locp = new CastX2PNode(locl); + phase->register_new_node(locp, ctrl); + + Node* in_cset_fast_test_adr = new AddPNode(phase->C->top(), locp, phase->igvn().MakeConX(0)); phase->register_new_node(in_cset_fast_test_adr, ctrl); uint in_cset_fast_test_idx = Compile::AliasIdxRaw; const TypePtr* in_cset_fast_test_adr_type = NULL; // debug-mode-only argument diff -r 29edf1cb3c02 src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Fri Mar 13 17:45:55 2020 +0800 +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Fri Mar 13 23:05:14 2020 +0100 @@ -196,6 +196,9 @@ ShenandoahThreadLocalData::set_gc_state(thread, _heap->gc_state()); ShenandoahThreadLocalData::initialize_gclab(thread); } + if (thread->is_Java_thread()) { + ShenandoahThreadLocalData::init_cset_base_addr(thread, _heap->in_cset_fast_test_addr()); + } } void ShenandoahBarrierSet::on_thread_detach(Thread *thread) { diff -r 29edf1cb3c02 src/hotspot/share/gc/shenandoah/shenandoahThreadLocalData.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahThreadLocalData.hpp Fri Mar 13 17:45:55 2020 +0800 +++ b/src/hotspot/share/gc/shenandoah/shenandoahThreadLocalData.hpp Fri Mar 13 23:05:14 2020 +0100 @@ -47,6 +47,8 @@ bool _force_satb_flush; int _disarmed_value; + address _cset_base_addr; + ShenandoahThreadLocalData() : _gc_state(0), _oom_during_evac(0), @@ -54,7 +56,8 @@ _gclab(NULL), _gclab_size(0), _worker_id(INVALID_WORKER_ID), - _force_satb_flush(false) { + _force_satb_flush(false), + _cset_base_addr(NULL) { } ~ShenandoahThreadLocalData() { @@ -147,6 +150,10 @@ data(thread)->_disarmed_value = value; } + static void init_cset_base_addr(Thread* thread, address cset_base_addr) { + data(thread)->_cset_base_addr = cset_base_addr; + } + #ifdef ASSERT static void set_evac_allowed(Thread* thread, bool evac_allowed) { if (evac_allowed) { @@ -181,6 +188,10 @@ static ByteSize disarmed_value_offset() { return Thread::gc_data_offset() + byte_offset_of(ShenandoahThreadLocalData, _disarmed_value); } + + static ByteSize cset_base_addr_offset() { + return Thread::gc_data_offset() + byte_offset_of(ShenandoahThreadLocalData, _cset_base_addr); + } }; #endif // SHARE_GC_SHENANDOAH_SHENANDOAHTHREADLOCALDATA_HPP