# HG changeset patch # User dpochepk # Date 1553532572 -10800 # Node ID 7816d989bf21dfa6f19e320cb86b6f03b6f84f34 # Parent 1b0163c877c0c45ed0fd43823808723d56ed1322 8216989: CardTableBarrierSetAssembler::gen_write_ref_array_post_barrier() does not check for zero length on AARCH64 Reviewed-by: adinn diff -r 1b0163c877c0 -r 7816d989bf21 src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.cpp --- a/src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.cpp Mon Mar 25 09:07:55 2019 -0700 +++ b/src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.cpp Mon Mar 25 19:49:32 2019 +0300 @@ -72,15 +72,12 @@ } void G1BarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators, - Register start, Register end, Register scratch, RegSet saved_regs) { + Register start, Register count, Register scratch, RegSet saved_regs) { __ push(saved_regs, sp); - // must compute element count unless barrier set interface is changed (other platforms supply count) - assert_different_registers(start, end, scratch); - __ lea(scratch, Address(end, BytesPerHeapOop)); - __ sub(scratch, scratch, start); // subtract start to get #bytes - __ lsr(scratch, scratch, LogBytesPerHeapOop); // convert to element count + assert_different_registers(start, count, scratch); + assert_different_registers(c_rarg0, count); __ mov(c_rarg0, start); - __ mov(c_rarg1, scratch); + __ mov(c_rarg1, count); __ call_VM_leaf(CAST_FROM_FN_PTR(address, G1BarrierSetRuntime::write_ref_array_post_entry), 2); __ pop(saved_regs, sp); } diff -r 1b0163c877c0 -r 7816d989bf21 src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.hpp --- a/src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.hpp Mon Mar 25 09:07:55 2019 -0700 +++ b/src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.hpp Mon Mar 25 19:49:32 2019 +0300 @@ -39,7 +39,7 @@ void gen_write_ref_array_pre_barrier(MacroAssembler* masm, DecoratorSet decorators, Register addr, Register count, RegSet saved_regs); void gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators, - Register start, Register end, Register tmp, RegSet saved_regs); + Register start, Register count, Register tmp, RegSet saved_regs); void g1_write_barrier_pre(MacroAssembler* masm, Register obj, diff -r 1b0163c877c0 -r 7816d989bf21 src/hotspot/cpu/aarch64/gc/shared/cardTableBarrierSetAssembler_aarch64.cpp --- a/src/hotspot/cpu/aarch64/gc/shared/cardTableBarrierSetAssembler_aarch64.cpp Mon Mar 25 09:07:55 2019 -0700 +++ b/src/hotspot/cpu/aarch64/gc/shared/cardTableBarrierSetAssembler_aarch64.cpp Mon Mar 25 19:49:32 2019 +0300 @@ -62,18 +62,22 @@ } void CardTableBarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators, - Register start, Register end, Register scratch, RegSet saved_regs) { + Register start, Register count, Register scratch, RegSet saved_regs) { BarrierSet* bs = BarrierSet::barrier_set(); CardTableBarrierSet* ctbs = barrier_set_cast(bs); CardTable* ct = ctbs->card_table(); - Label L_loop; + Label L_loop, L_done; + const Register end = count; + __ cbz(count, L_done); // zero count - nothing to do + + __ lea(end, Address(start, count, Address::lsl(LogBytesPerHeapOop))); // end = start + count << LogBytesPerHeapOop + __ sub(end, end, BytesPerHeapOop); // last element address to make inclusive __ lsr(start, start, CardTable::card_shift); __ lsr(end, end, CardTable::card_shift); - __ sub(end, end, start); // number of bytes to copy + __ sub(count, end, start); // number of bytes to copy - const Register count = end; // 'end' register contains bytes count now __ load_byte_map_base(scratch); __ add(start, start, scratch); if (ct->scanned_concurrently()) { @@ -83,6 +87,7 @@ __ strb(zr, Address(start, count)); __ subs(count, count, 1); __ br(Assembler::GE, L_loop); + __ bind(L_done); } void CardTableBarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, diff -r 1b0163c877c0 -r 7816d989bf21 src/hotspot/cpu/aarch64/gc/shared/cardTableBarrierSetAssembler_aarch64.hpp --- a/src/hotspot/cpu/aarch64/gc/shared/cardTableBarrierSetAssembler_aarch64.hpp Mon Mar 25 09:07:55 2019 -0700 +++ b/src/hotspot/cpu/aarch64/gc/shared/cardTableBarrierSetAssembler_aarch64.hpp Mon Mar 25 19:49:32 2019 +0300 @@ -33,7 +33,7 @@ void store_check(MacroAssembler* masm, Register obj, Address dst); virtual void gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators, - Register start, Register end, Register tmp, RegSet saved_regs); + Register start, Register count, Register tmp, RegSet saved_regs); virtual void oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Address dst, Register val, Register tmp1, Register tmp2); diff -r 1b0163c877c0 -r 7816d989bf21 src/hotspot/cpu/aarch64/gc/shared/modRefBarrierSetAssembler_aarch64.cpp --- a/src/hotspot/cpu/aarch64/gc/shared/modRefBarrierSetAssembler_aarch64.cpp Mon Mar 25 09:07:55 2019 -0700 +++ b/src/hotspot/cpu/aarch64/gc/shared/modRefBarrierSetAssembler_aarch64.cpp Mon Mar 25 19:49:32 2019 +0300 @@ -37,10 +37,10 @@ } void ModRefBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop, - Register start, Register end, Register tmp, + Register start, Register count, Register tmp, RegSet saved_regs) { if (is_oop) { - gen_write_ref_array_post_barrier(masm, decorators, start, end, tmp, saved_regs); + gen_write_ref_array_post_barrier(masm, decorators, start, count, tmp, saved_regs); } } diff -r 1b0163c877c0 -r 7816d989bf21 src/hotspot/cpu/aarch64/gc/shared/modRefBarrierSetAssembler_aarch64.hpp --- a/src/hotspot/cpu/aarch64/gc/shared/modRefBarrierSetAssembler_aarch64.hpp Mon Mar 25 09:07:55 2019 -0700 +++ b/src/hotspot/cpu/aarch64/gc/shared/modRefBarrierSetAssembler_aarch64.hpp Mon Mar 25 19:49:32 2019 +0300 @@ -37,7 +37,7 @@ virtual void gen_write_ref_array_pre_barrier(MacroAssembler* masm, DecoratorSet decorators, Register addr, Register count, RegSet saved_regs) {} virtual void gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators, - Register start, Register end, Register tmp, RegSet saved_regs) {} + Register start, Register count, Register tmp, RegSet saved_regs) {} virtual void oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Address dst, Register val, Register tmp1, Register tmp2) = 0; @@ -46,7 +46,7 @@ virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop, Register addr, Register count, RegSet saved_regs); virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop, - Register start, Register end, Register tmp, RegSet saved_regs); + Register start, Register count, Register tmp, RegSet saved_regs); virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Address dst, Register val, Register tmp1, Register tmp2); }; diff -r 1b0163c877c0 -r 7816d989bf21 src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp --- a/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp Mon Mar 25 09:07:55 2019 -0700 +++ b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp Mon Mar 25 19:49:32 2019 +0300 @@ -73,16 +73,13 @@ } void ShenandoahBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop, - Register start, Register end, Register scratch, RegSet saved_regs) { + Register start, Register count, Register scratch, RegSet saved_regs) { if (is_oop) { __ push(saved_regs, sp); - // must compute element count unless barrier set interface is changed (other platforms supply count) - assert_different_registers(start, end, scratch); - __ lea(scratch, Address(end, BytesPerHeapOop)); - __ sub(scratch, scratch, start); // subtract start to get #bytes - __ lsr(scratch, scratch, LogBytesPerHeapOop); // convert to element count + assert_different_registers(start, count, scratch); + assert_different_registers(c_rarg0, count); __ mov(c_rarg0, start); - __ mov(c_rarg1, scratch); + __ mov(c_rarg1, count); __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_post_entry), 2); __ pop(saved_regs, sp); } diff -r 1b0163c877c0 -r 7816d989bf21 src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.hpp --- a/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.hpp Mon Mar 25 09:07:55 2019 -0700 +++ b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.hpp Mon Mar 25 19:49:32 2019 +0300 @@ -78,7 +78,7 @@ virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop, Register addr, Register count, RegSet saved_regs); virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop, - Register start, Register end, Register tmp, RegSet saved_regs); + Register start, Register count, Register tmp, RegSet saved_regs); virtual void load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register dst, Address src, Register tmp1, Register tmp_thread); virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, diff -r 1b0163c877c0 -r 7816d989bf21 src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp --- a/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp Mon Mar 25 09:07:55 2019 -0700 +++ b/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp Mon Mar 25 19:49:32 2019 +0300 @@ -1375,8 +1375,6 @@ __ pop(RegSet::of(d, count), sp); if (VerifyOops) verify_oop_array(size, d, count, r16); - __ sub(count, count, 1); // make an inclusive end pointer - __ lea(count, Address(d, count, Address::lsl(exact_log2(size)))); } bs->arraycopy_epilogue(_masm, decorators, is_oop, d, count, rscratch1, RegSet()); @@ -1448,8 +1446,6 @@ __ pop(RegSet::of(d, count), sp); if (VerifyOops) verify_oop_array(size, d, count, r16); - __ sub(count, count, 1); // make an inclusive end pointer - __ lea(count, Address(d, count, Address::lsl(exact_log2(size)))); } bs->arraycopy_epilogue(_masm, decorators, is_oop, d, count, rscratch1, RegSet()); __ leave(); @@ -1842,8 +1838,7 @@ __ br(Assembler::EQ, L_done_pop); __ BIND(L_do_card_marks); - __ add(to, to, -heapOopSize); // make an inclusive end pointer - bs->arraycopy_epilogue(_masm, decorators, is_oop, start_to, to, rscratch1, wb_post_saved_regs); + bs->arraycopy_epilogue(_masm, decorators, is_oop, start_to, count_save, rscratch1, wb_post_saved_regs); __ bind(L_done_pop); __ pop(RegSet::of(r18, r19, r20, r21), sp);