--- old/src/share/vm/opto/graphKit.cpp Wed Mar 30 17:59:14 2011 +++ new/src/share/vm/opto/graphKit.cpp Wed Mar 30 17:59:14 2011 @@ -3447,12 +3447,24 @@ // Combine card table base and card offset Node* card_adr = __ AddP(__ top(), byte_map_base_node(), card_offset ); - // Get the alias_index for raw card-mark memory int adr_type = Compile::AliasIdxRaw; - // Smash zero into card - Node* zero = __ ConI(0); + 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 if( !UseConcMarkSweepGC ) { __ store(__ ctrl(), card_adr, zero, bt, adr_type); } else { @@ -3460,6 +3472,10 @@ __ storeCM(__ ctrl(), card_adr, zero, oop_store, adr_idx, bt, adr_type); } + if (UseCondCardMark) { + __ end_if(); + } + // Final sync IdealKit and GraphKit. sync_kit(ideal); }