Skip to content

Commit d618008

Browse files
committed
8382711: Shenandoah: Support AOT code dumping
Reviewed-by: kvn, iveresov, wkemper, adinn
1 parent d96d196 commit d618008

5 files changed

Lines changed: 97 additions & 23 deletions

File tree

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

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -261,24 +261,32 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
261261

262262
// Test for in-cset
263263
if (is_strong) {
264-
__ mov(rscratch2, ShenandoahHeap::in_cset_fast_test_addr());
265-
__ lsr(rscratch1, r0, ShenandoahHeapRegion::region_size_bytes_shift_jint());
264+
if (AOTCodeCache::is_on_for_dump()) {
265+
__ lea(rscratch2, ExternalAddress(AOTRuntimeConstants::cset_base_address()));
266+
__ ldr(rscratch2, Address(rscratch2));
267+
__ lea(rscratch1, ExternalAddress(AOTRuntimeConstants::grain_shift_address()));
268+
__ ldrw(rscratch1, Address(rscratch1));
269+
__ lsrv(rscratch1, r0, rscratch1);
270+
} else {
271+
__ mov(rscratch2, ShenandoahHeap::in_cset_fast_test_addr());
272+
__ lsr(rscratch1, r0, ShenandoahHeapRegion::region_size_bytes_shift_jint());
273+
}
266274
__ ldrb(rscratch2, Address(rscratch2, rscratch1));
267275
__ tbz(rscratch2, 0, not_cset);
268276
}
269277

270278
__ push_call_clobbered_registers();
271279
if (is_strong) {
272280
if (is_narrow) {
273-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong_narrow));
281+
__ lea(lr, RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong_narrow)));
274282
} else {
275-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong));
283+
__ lea(lr, RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong)));
276284
}
277285
} else if (is_weak) {
278286
if (is_narrow) {
279-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak_narrow));
287+
__ lea(lr, RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak_narrow)));
280288
} else {
281-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak));
289+
__ lea(lr, RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak)));
282290
}
283291
} else {
284292
assert(is_phantom, "only remaining strength");
@@ -709,8 +717,16 @@ void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assemble
709717

710718
if (is_strong) {
711719
// Check for object in cset.
712-
__ mov(tmp2, ShenandoahHeap::in_cset_fast_test_addr());
713-
__ lsr(tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint());
720+
if (AOTCodeCache::is_on_for_dump()) {
721+
__ lea(tmp2, ExternalAddress(AOTRuntimeConstants::cset_base_address()));
722+
__ ldr(tmp2, Address(tmp2));
723+
__ lea(tmp1, ExternalAddress(AOTRuntimeConstants::grain_shift_address()));
724+
__ ldrw(tmp1, Address(tmp1));
725+
__ lsrv(tmp1, res, tmp1);
726+
} else {
727+
__ mov(tmp2, ShenandoahHeap::in_cset_fast_test_addr());
728+
__ lsr(tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint());
729+
}
714730
__ ldrb(tmp2, Address(tmp2, tmp1));
715731
__ cbz(tmp2, *stub->continuation());
716732
}
@@ -795,25 +811,25 @@ void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_s
795811
bool is_native = ShenandoahBarrierSet::is_native_access(decorators);
796812
if (is_strong) {
797813
if (is_native) {
798-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong));
814+
__ lea(lr, RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong)));
799815
} else {
800816
if (UseCompressedOops) {
801-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong_narrow));
817+
__ lea(lr, RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong_narrow)));
802818
} else {
803-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong));
819+
__ lea(lr, RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_strong)));
804820
}
805821
}
806822
} else if (is_weak) {
807823
assert(!is_native, "weak must not be called off-heap");
808824
if (UseCompressedOops) {
809-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak_narrow));
825+
__ lea(lr, RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak_narrow)));
810826
} else {
811-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak));
827+
__ lea(lr, RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak)));
812828
}
813829
} else {
814830
assert(is_phantom, "only remaining strength");
815831
assert(is_native, "phantom must only be called off-heap");
816-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_phantom));
832+
__ lea(lr, RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_phantom)));
817833
}
818834
__ blr(lr);
819835
__ mov(rscratch1, r0);

src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -312,9 +312,9 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
312312
if (is_strong) {
313313
// Test for object in cset
314314
// Allocate temporary registers
315-
for (int i = 0; i < 8; i++) {
315+
for (int i = 0; i < Register::available_gp_registers(); i++) {
316316
Register r = as_Register(i);
317-
if (r != rsp && r != rbp && r != dst && r != src.base() && r != src.index()) {
317+
if (r != rsp && r != rbp && r != rcx && r != dst && r != src.base() && r != src.index() ) {
318318
if (tmp1 == noreg) {
319319
tmp1 = r;
320320
} else {
@@ -333,8 +333,19 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
333333

334334
// Optimized cset-test
335335
__ movptr(tmp1, dst);
336-
__ shrptr(tmp1, ShenandoahHeapRegion::region_size_bytes_shift_jint());
337-
__ movptr(tmp2, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr());
336+
if (AOTCodeCache::is_on_for_dump()) {
337+
assert_different_registers(tmp1, tmp2, rcx);
338+
__ lea(tmp2, ExternalAddress(AOTRuntimeConstants::grain_shift_address()));
339+
__ push(rcx);
340+
__ movb(rcx, Address(tmp2));
341+
__ shrptr(tmp1);
342+
__ pop(rcx);
343+
__ lea(tmp2, ExternalAddress(AOTRuntimeConstants::cset_base_address()));
344+
__ movptr(tmp2, Address(tmp2));
345+
} else {
346+
__ shrptr(tmp1, ShenandoahHeapRegion::region_size_bytes_shift_jint());
347+
__ movptr(tmp2, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr());
348+
}
338349
__ movbool(tmp1, Address(tmp1, tmp2, Address::times_1));
339350
__ testbool(tmp1);
340351
__ jcc(Assembler::zero, not_cset);
@@ -886,8 +897,27 @@ void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assemble
886897
if (is_strong) {
887898
// Check for object being in the collection set.
888899
__ mov(tmp1, res);
889-
__ shrptr(tmp1, ShenandoahHeapRegion::region_size_bytes_shift_jint());
890-
__ movptr(tmp2, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr());
900+
if (AOTCodeCache::is_on_for_dump()) {
901+
__ push(rcx);
902+
__ lea(rcx, ExternalAddress(AOTRuntimeConstants::grain_shift_address()));
903+
__ movl(rcx, Address(rcx));
904+
if (tmp1 != rcx) {
905+
__ mov(tmp1, res);
906+
__ shrptr(tmp1);
907+
__ pop(rcx);
908+
} else {
909+
assert_different_registers(tmp2, rcx);
910+
__ mov(tmp2, res);
911+
__ shrptr(tmp2);
912+
__ pop(rcx);
913+
__ movptr(tmp1, tmp2);
914+
}
915+
__ lea(tmp2, ExternalAddress(AOTRuntimeConstants::cset_base_address()));
916+
__ movptr(tmp2, Address(tmp2));
917+
} else {
918+
__ shrptr(tmp1, ShenandoahHeapRegion::region_size_bytes_shift_jint());
919+
__ movptr(tmp2, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr());
920+
}
891921
__ movbool(tmp2, Address(tmp2, tmp1, Address::times_1));
892922
__ testbool(tmp2);
893923
__ jcc(Assembler::zero, *stub->continuation());

src/hotspot/share/code/aotCodeCache.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
#include "gc/g1/g1HeapRegion.hpp"
6464
#endif
6565
#if INCLUDE_SHENANDOAHGC
66+
#include "gc/shenandoah/shenandoahHeapRegion.hpp"
6667
#include "gc/shenandoah/shenandoahRuntime.hpp"
6768
#endif
6869
#if INCLUDE_ZGC
@@ -2476,14 +2477,16 @@ void AOTRuntimeConstants::initialize_from_runtime() {
24762477
BarrierSet* bs = BarrierSet::barrier_set();
24772478
address card_table_base = nullptr;
24782479
uint grain_shift = 0;
2480+
address cset_base = nullptr;
24792481
#if INCLUDE_G1GC
24802482
if (bs->is_a(BarrierSet::G1BarrierSet)) {
24812483
grain_shift = G1HeapRegion::LogOfHRGrainBytes;
24822484
} else
24832485
#endif
24842486
#if INCLUDE_SHENANDOAHGC
24852487
if (bs->is_a(BarrierSet::ShenandoahBarrierSet)) {
2486-
grain_shift = 0;
2488+
grain_shift = ShenandoahHeapRegion::region_size_bytes_shift_jint();
2489+
cset_base = ShenandoahHeap::in_cset_fast_test_addr();
24872490
} else
24882491
#endif
24892492
if (bs->is_a(BarrierSet::CardTableBarrierSet)) {
@@ -2495,11 +2498,13 @@ void AOTRuntimeConstants::initialize_from_runtime() {
24952498
}
24962499
_aot_runtime_constants._card_table_base = card_table_base;
24972500
_aot_runtime_constants._grain_shift = grain_shift;
2501+
_aot_runtime_constants._cset_base = cset_base;
24982502
}
24992503

25002504
address AOTRuntimeConstants::_field_addresses_list[] = {
25012505
((address)&_aot_runtime_constants._card_table_base),
25022506
((address)&_aot_runtime_constants._grain_shift),
2507+
((address)&_aot_runtime_constants._cset_base),
25032508
nullptr
25042509
};
25052510

src/hotspot/share/code/aotCodeCache.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,7 @@ class AOTRuntimeConstants {
688688
private:
689689
address _card_table_base;
690690
uint _grain_shift;
691+
address _cset_base;
691692
static address _field_addresses_list[];
692693
static AOTRuntimeConstants _aot_runtime_constants;
693694
// private constructor for unique singleton
@@ -703,13 +704,15 @@ class AOTRuntimeConstants {
703704
}
704705
static address card_table_base_address();
705706
static address grain_shift_address() { return (address)&_aot_runtime_constants._grain_shift; }
707+
static address cset_base_address() { return (address)&_aot_runtime_constants._cset_base; }
706708
static address* field_addresses_list() {
707709
return _field_addresses_list;
708710
}
709711
#else
710712
static bool contains(address adr) { return false; }
711713
static address card_table_base_address() { return nullptr; }
712714
static address grain_shift_address() { return nullptr; }
715+
static address cset_base_address() { return nullptr; }
713716
static address* field_addresses_list() { return nullptr; }
714717
#endif
715718
};

src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626

2727
#include "classfile/javaClasses.hpp"
28+
#include "code/aotCodeCache.hpp"
2829
#include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
2930
#include "gc/shenandoah/c2/shenandoahSupport.hpp"
3031
#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
@@ -928,12 +929,31 @@ void ShenandoahBarrierC2Support::test_in_cset(Node*& ctrl, Node*& not_cset_ctrl,
928929
PhaseIterGVN& igvn = phase->igvn();
929930

930931
Node* raw_val = new CastP2XNode(old_ctrl, val);
931-
Node* cset_idx = new URShiftXNode(raw_val, igvn.intcon(ShenandoahHeapRegion::region_size_bytes_shift_jint()));
932+
Node* region_size_shift = nullptr;
933+
if (AOTCodeCache::is_on_for_dump()) {
934+
Node* aot_addr = igvn.makecon(TypeRawPtr::make(AOTRuntimeConstants::grain_shift_address()));
935+
region_size_shift = new LoadINode(old_ctrl, raw_mem, aot_addr,
936+
DEBUG_ONLY(phase->C->get_adr_type(Compile::AliasIdxRaw)) NOT_DEBUG(nullptr),
937+
TypeInt::INT, MemNode::unordered);
938+
phase->register_new_node(region_size_shift, old_ctrl);
939+
} else {
940+
region_size_shift = igvn.intcon(ShenandoahHeapRegion::region_size_bytes_shift_jint());
941+
}
942+
Node* cset_idx = new URShiftXNode(raw_val, region_size_shift);
932943

933944
// Figure out the target cset address with raw pointer math.
934945
// This avoids matching AddP+LoadB that would emit inefficient code.
935946
// See JDK-8245465.
936-
Node* cset_addr_ptr = igvn.makecon(TypeRawPtr::make(ShenandoahHeap::in_cset_fast_test_addr()));
947+
Node* cset_addr_ptr = nullptr;
948+
if (AOTCodeCache::is_on_for_dump()) {
949+
Node* aot_addr = igvn.makecon(TypeRawPtr::make(AOTRuntimeConstants::cset_base_address()));
950+
cset_addr_ptr = new LoadPNode(old_ctrl, raw_mem, aot_addr,
951+
DEBUG_ONLY(phase->C->get_adr_type(Compile::AliasIdxRaw)) NOT_DEBUG(nullptr),
952+
TypeRawPtr::NOTNULL, MemNode::unordered);
953+
phase->register_new_node(cset_addr_ptr, old_ctrl);
954+
} else {
955+
cset_addr_ptr = igvn.makecon(TypeRawPtr::make(ShenandoahHeap::in_cset_fast_test_addr()));
956+
}
937957
Node* cset_addr = new CastP2XNode(old_ctrl, cset_addr_ptr);
938958
Node* cset_load_addr = new AddXNode(cset_addr, cset_idx);
939959
Node* cset_load_ptr = new CastX2PNode(cset_load_addr);

0 commit comments

Comments
 (0)