--- a/hotspot/src/share/vm/opto/graphKit.cpp Tue Apr 26 12:14:22 2011 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Wed Apr 27 15:40:36 2011 -0700
@@ -3447,9 +3447,22 @@
// Get the alias_index for raw card-mark memory
int adr_type = Compile::AliasIdxRaw;
+ Node* zero = __ ConI(0); // Dirty card value
+ BasicType bt = T_BYTE;
+
+ if (UseCondCardMark) {
+ // The classic GC reference write barrier is typically implemented
+ // as a store into the global card mark table. Unfortunately
+ // unconditional stores can result in false sharing and excessive
+ // coherence traffic as well as false transactional aborts.
+ // UseCondCardMark enables MP "polite" conditional card mark
+ // stores. In theory we could relax the load from ctrl() to
+ // no_ctrl, but that doesn't buy much latitude.
+ Node* card_val = __ load( __ ctrl(), card_adr, TypeInt::BYTE, bt, adr_type);
+ __ if_then(card_val, BoolTest::ne, zero);
+ }
+
// Smash zero into card
- Node* zero = __ ConI(0);
- BasicType bt = T_BYTE;
if( !UseConcMarkSweepGC ) {
__ store(__ ctrl(), card_adr, zero, bt, adr_type);
} else {
@@ -3457,6 +3470,10 @@
__ storeCM(__ ctrl(), card_adr, zero, oop_store, adr_idx, bt, adr_type);
}
+ if (UseCondCardMark) {
+ __ end_if();
+ }
+
// Final sync IdealKit and GraphKit.
final_sync(ideal);
}