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 ----