< prev index next >

src/share/vm/opto/graphKit.cpp

Print this page
rev 8802 : G1 performance improvements: card batching, joining, sorting, prefetching and write barrier fence elision and simplification based on a global syncrhonization using handshakes piggybacking on thread-local safepoints.
rev 8803 : Implementation improvements to pass JPRT

@@ -4183,10 +4183,11 @@
   Node* tls = __ thread(); // ThreadLocalStorage
 
   Node* no_base = __ top();
   float likely  = PROB_LIKELY(0.999);
   float unlikely  = PROB_UNLIKELY(0.999);
+  Node* clean_card = __ ConI((jint)CardTableModRefBS::clean_card_val());
   Node* young_card = __ ConI((jint)G1SATBCardTableModRefBS::g1_young_card_val());
   Node* dirty_card = __ ConI((jint)CardTableModRefBS::dirty_card_val());
   Node* zeroX = __ ConX(0);
 
   // Get the alias_index for raw card-mark memory

@@ -4240,10 +4241,15 @@
         // Ok must mark the card if not already dirty
 
         // load the original value of the card
         Node* card_val = __ load(__ ctrl(), card_adr, TypeInt::INT, T_BYTE, Compile::AliasIdxRaw);
 
+        if (G1ElideMembar) {
+          __ if_then(card_val, BoolTest::eq, clean_card); {
+            g1_mark_card(ideal, card_adr, oop_store, alias_idx, index, index_adr, buffer, tf);
+          } __ end_if();
+        } else {
         __ if_then(card_val, BoolTest::ne, young_card); {
           sync_kit(ideal);
           // Use Op_MemBarVolatile to achieve the effect of a StoreLoad barrier.
           insert_mem_bar(Op_MemBarVolatile, oop_store);
           __ sync_kit(this);

@@ -4251,10 +4257,11 @@
           Node* card_val_reload = __ load(__ ctrl(), card_adr, TypeInt::INT, T_BYTE, Compile::AliasIdxRaw);
           __ if_then(card_val_reload, BoolTest::ne, dirty_card); {
             g1_mark_card(ideal, card_adr, oop_store, alias_idx, index, index_adr, buffer, tf);
           } __ end_if();
         } __ end_if();
+        }
       } __ end_if();
     } __ end_if();
   } else {
     // Object.clone() instrinsic uses this path.
     g1_mark_card(ideal, card_adr, oop_store, alias_idx, index, index_adr, buffer, tf);
< prev index next >