# HG changeset patch # User aharlap # Date 1511395081 18000 # Node ID 62d5973082e31a5b779ebb4672bb8f7b2d1bd3e4 # Parent 26dbe08d1c171edf8d18cd1a8e4d6e1eed0cdc35 8185591: guarantee(_byte_map[_guard_index] == last_card) failed: card table guard has been modified Summary: Properly handle zero count in gen_write_ref_array_post_barrier() Reviewed-by: tschatzl, kbarrett diff -r 26dbe08d1c17 -r 62d5973082e3 src/hotspot/cpu/arm/stubGenerator_arm.cpp --- a/src/hotspot/cpu/arm/stubGenerator_arm.cpp Thu Nov 23 15:51:06 2017 +0100 +++ b/src/hotspot/cpu/arm/stubGenerator_arm.cpp Wed Nov 22 18:58:01 2017 -0500 @@ -2968,7 +2968,9 @@ CardTableModRefBS* ct = barrier_set_cast(bs); assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); - Label L_cardtable_loop; + Label L_cardtable_loop, L_done; + + __ cbz_32(count, L_done); // zero count - nothing to do __ add_ptr_scaled_int32(count, addr, count, LogBytesPerHeapOop); __ sub(count, count, BytesPerHeapOop); // last addr @@ -2987,6 +2989,7 @@ __ strb(zero, Address(addr, 1, post_indexed)); __ subs(count, count, 1); __ b(L_cardtable_loop, ge); + __ BIND(L_done); } break; case BarrierSet::ModRef: diff -r 26dbe08d1c17 -r 62d5973082e3 src/hotspot/cpu/sparc/stubGenerator_sparc.cpp --- a/src/hotspot/cpu/sparc/stubGenerator_sparc.cpp Thu Nov 23 15:51:06 2017 +0100 +++ b/src/hotspot/cpu/sparc/stubGenerator_sparc.cpp Wed Nov 22 18:58:01 2017 -0500 @@ -898,7 +898,9 @@ assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); assert_different_registers(addr, count, tmp); - Label L_loop; + Label L_loop, L_done; + + __ cmp_and_br_short(count, 0, Assembler::equal, Assembler::pt, L_done); // zero count - nothing to do __ sll_ptr(count, LogBytesPerHeapOop, count); __ sub(count, BytesPerHeapOop, count); @@ -914,6 +916,7 @@ __ subcc(count, 1, count); __ brx(Assembler::greaterEqual, false, Assembler::pt, L_loop); __ delayed()->add(addr, 1, addr); + __ BIND(L_done); } break; case BarrierSet::ModRef: diff -r 26dbe08d1c17 -r 62d5973082e3 src/hotspot/cpu/x86/stubGenerator_x86_64.cpp --- a/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp Thu Nov 23 15:51:06 2017 +0100 +++ b/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp Wed Nov 22 18:58:01 2017 -0500 @@ -1264,9 +1264,12 @@ CardTableModRefBS* ct = barrier_set_cast(bs); assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); - Label L_loop; + Label L_loop, L_done; const Register end = count; + __ testl(count, count); + __ jcc(Assembler::zero, L_done); // zero count - nothing to do + __ leaq(end, Address(start, count, TIMES_OOP, 0)); // end == start+count*oop_size __ subptr(end, BytesPerHeapOop); // end - 1 to make inclusive __ shrptr(start, CardTableModRefBS::card_shift); @@ -1280,6 +1283,7 @@ __ movb(Address(start, count, Address::times_1), 0); __ decrement(count); __ jcc(Assembler::greaterEqual, L_loop); + __ BIND(L_done); } break; default: