src/share/vm/gc_implementation/g1/concurrentMark.cpp

Print this page
rev 2896 : 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
Summary: There is a high number of mispredicted branches associated with calling BitMap::iteratate() from within CMBitMapRO::iterate(). Implement a version of CMBitMapRO::iterate() directly using inline-able routines.
Reviewed-by:

*** 101,121 **** int CMBitMapRO::heapWordDiffToOffsetDiff(size_t diff) const { assert((diff & ((1 << _shifter) - 1)) == 0, "argument check"); return (int) (diff >> _shifter); } - bool CMBitMapRO::iterate(BitMapClosure* cl, MemRegion mr) { - HeapWord* left = MAX2(_bmStartWord, mr.start()); - HeapWord* right = MIN2(_bmStartWord + _bmWordSize, mr.end()); - if (right > left) { - // Right-open interval [leftOffset, rightOffset). - return _bm.iterate(cl, heapWordToOffset(left), heapWordToOffset(right)); - } else { - return true; - } - } - void CMBitMapRO::mostly_disjoint_range_union(BitMap* from_bitmap, size_t from_start_index, HeapWord* to_start_word, size_t word_num) { _bm.mostly_disjoint_range_union(from_bitmap, --- 101,110 ----