# HG changeset patch # User ehelin # Date 1448627996 -3600 # Node ID 943740ea0d17f6523f6f748797e912baec2198ff # Parent 421a6405ca303687c84f4321ce0aa9e3e6df9772 8144072: G1ParScanThreadState::update_rs does not need to call is_in_reserved Reviewed-by: tschatzl, mgerdin diff -r 421a6405ca30 -r 943740ea0d17 hotspot/src/share/vm/gc/g1/g1ParScanThreadState.hpp --- a/hotspot/src/share/vm/gc/g1/g1ParScanThreadState.hpp Fri Nov 27 13:39:50 2015 +0100 +++ b/hotspot/src/share/vm/gc/g1/g1ParScanThreadState.hpp Fri Nov 27 13:39:56 2015 +0100 @@ -101,7 +101,7 @@ template void update_rs(HeapRegion* from, T* p, oop o) { // If the new value of the field points to the same region or // is the to-space, we don't need to include it in the Rset updates. - if (!from->is_in_reserved(o) && !from->is_young()) { + if (!HeapRegion::is_in_same_region(p, o) && !from->is_young()) { size_t card_index = ctbs()->index_for(p); // If the card hasn't been added to the buffer, do it. if (ctbs()->mark_card_deferred(card_index)) { diff -r 421a6405ca30 -r 943740ea0d17 hotspot/src/share/vm/gc/g1/heapRegion.hpp --- a/hotspot/src/share/vm/gc/g1/heapRegion.hpp Fri Nov 27 13:39:50 2015 +0100 +++ b/hotspot/src/share/vm/gc/g1/heapRegion.hpp Fri Nov 27 13:39:56 2015 +0100 @@ -351,6 +351,15 @@ ~((1 << (size_t) LogOfHRGrainBytes) - 1); } + + // Returns whether a field is in the same region as the obj it points to. + template + static bool is_in_same_region(T* p, oop obj) { + assert(p != NULL, "p can't be NULL"); + assert(obj != NULL, "obj can't be NULL"); + return (((uintptr_t) p ^ cast_from_oop(obj)) >> LogOfHRGrainBytes) == 0; + } + static size_t max_region_size(); static size_t min_region_size_in_words();