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

Print this page
rev 6582 : 8047330: Remove unrolled card loops in G1 SparsePRTEntry
Summary: Removed unrolled card loops in sparsePRT.cpp
Reviewed-by:
Contributed-by: andreas.sjoberg@oracle.com
rev 6583 : 8047328: Change typedef CardIdx_t from int to uint16_t
Summary: Changed the typedef and made the necessary changes to code interacting with the SparsePRTEntry class.
Reviewed-by:
Contributed-by: andreas.sjoberg@oracle.com

@@ -33,48 +33,48 @@
 
 #define SPARSE_PRT_VERBOSE 0
 
 void SparsePRTEntry::init(RegionIdx_t region_ind) {
   _region_ind = region_ind;
-  _next_index = NullEntry;
+  _next_index = RSHashTable::NullEntry;
+  _next_null = 0;
 
-  for (int i = 0; i < cards_num(); i++) {
-    _cards[i] = NullEntry;
-  }
 }
 
 bool SparsePRTEntry::contains_card(CardIdx_t card_index) const {
-  for (int i = 0; i < cards_num(); i++) {
+  for (int i = 0; i < _next_null; i++) {
     if (_cards[i] == card_index) return true;
   }
   return false;
 }
 
-int SparsePRTEntry::num_valid_cards() const {
-  int sum = 0;
-  for (int i = 0; i < cards_num(); i++) {
-    sum += (_cards[i] != NullEntry);
-  }
-  return sum;
-}
 
 SparsePRTEntry::AddCardResult SparsePRTEntry::add_card(CardIdx_t card_index) {
-  for (int i = 0; i < cards_num(); i++) {
-    CardIdx_t c = _cards[i];
-    if (c == card_index) return found;
-    if (c == NullEntry) { _cards[i] = card_index; return added; }
+  for (int i = 0; i < _next_null; i++) {
+    CardIdx_t c = card(i);
+    if (c == card_index) {
+      return found;
+    }
+  }
+  if (_next_null < cards_num() -1) {
+    _cards[_next_null] = card_index;
+    _next_null++;
+    return added;
   }
   // Otherwise, we're full.
   return overflow;
 }
 
 void SparsePRTEntry::copy_cards(CardIdx_t* cards) const {
-  memcpy(cards, _cards, cards_num() * sizeof(CardIdx_t));
+  memcpy(cards, _cards, _next_null * sizeof(CardIdx_t));
 }
 
 void SparsePRTEntry::copy_cards(SparsePRTEntry* e) const {
-  copy_cards(&e->_cards[0]);
+  copy_cards(e->_cards);
+  assert(_next_null >= 0, "invariant");
+  assert(_next_null <= cards_num(), "invariant");
+  e->_next_null = _next_null;
 }
 
 // ----------------------------------------------------------------------
 
 RSHashTable::RSHashTable(size_t capacity) :

@@ -218,54 +218,57 @@
   e->copy_cards(e2);
   _occupied_cards += e2->num_valid_cards();
   assert(e2->num_valid_cards() > 0, "Postcondition.");
 }
 
-CardIdx_t RSHashTableIter::find_first_card_in_list() {
-  CardIdx_t res;
+bool RSHashTableIter::find_first_card_in_list(CardIdx_t & res) {
   while (_bl_ind != RSHashTable::NullEntry) {
-    res = _rsht->entry(_bl_ind)->card(0);
-    if (res != SparsePRTEntry::NullEntry) {
-      return res;
+    SparsePRTEntry * sparse_entry = _rsht->entry(_bl_ind);
+    if (sparse_entry->num_valid_cards() > 0) {
+      res = sparse_entry->card(0);
+      return true;
     } else {
-      _bl_ind = _rsht->entry(_bl_ind)->next_index();
+      _bl_ind = sparse_entry->next_index();
     }
   }
   // Otherwise, none found:
-  return SparsePRTEntry::NullEntry;
+  return false;
 }
 
 size_t RSHashTableIter::compute_card_ind(CardIdx_t ci) {
   return (_rsht->entry(_bl_ind)->r_ind() * HeapRegion::CardsPerRegion) + ci;
 }
 
 bool RSHashTableIter::has_next(size_t& card_index) {
   _card_ind++;
   CardIdx_t ci;
-  if (_card_ind < SparsePRTEntry::cards_num() &&
-      ((ci = _rsht->entry(_bl_ind)->card(_card_ind)) !=
-       SparsePRTEntry::NullEntry)) {
+  if (_bl_ind >= 0) {
+    SparsePRTEntry * e = _rsht->entry(_bl_ind);
+    if (_card_ind < e->num_valid_cards()) {
+      ci = e->card(_card_ind);
     card_index = compute_card_ind(ci);
     return true;
   }
+  }
+  
   // Otherwise, must find the next valid entry.
   _card_ind = 0;
 
   if (_bl_ind != RSHashTable::NullEntry) {
       _bl_ind = _rsht->entry(_bl_ind)->next_index();
-      ci = find_first_card_in_list();
-      if (ci != SparsePRTEntry::NullEntry) {
+      bool found = find_first_card_in_list(ci);
+      if (found) {
         card_index = compute_card_ind(ci);
         return true;
       }
   }
   // If we didn't return above, must go to the next non-null table index.
   _tbl_ind++;
   while ((size_t)_tbl_ind < _rsht->capacity()) {
     _bl_ind = _rsht->_buckets[_tbl_ind];
-    ci = find_first_card_in_list();
-    if (ci != SparsePRTEntry::NullEntry) {
+    bool found = find_first_card_in_list(ci);
+    if (found) {
       card_index = compute_card_ind(ci);
       return true;
     }
     // Otherwise, try next entry.
     _tbl_ind++;