diff src/share/vm/opto/macro.cpp @ 3282:149bb459be66

7029167: add support for conditional card marks Reviewed-by: iveresov, kvn
author never
date Wed, 27 Apr 2011 15:40:36 -0700
parents b1a2afa37ec4
children bad7ecd0b6ed
line wrap: on
line diff
--- a/src/share/vm/opto/macro.cpp	Tue Apr 26 12:14:22 2011 -0700
+++ b/src/share/vm/opto/macro.cpp	Wed Apr 27 15:40:36 2011 -0700
@@ -221,9 +221,16 @@
     Node *shift = p2x->unique_out();
     Node *addp = shift->unique_out();
     for (DUIterator_Last jmin, j = addp->last_outs(jmin); j >= jmin; --j) {
-      Node *st = addp->last_out(j);
-      assert(st->is_Store(), "store required");
-      _igvn.replace_node(st, st->in(MemNode::Memory));
+      Node *mem = addp->last_out(j);
+      if (UseCondCardMark && mem->is_Load()) {
+        assert(mem->Opcode() == Op_LoadB, "unexpected code shape");
+        // The load is checking if the card has been written so
+        // replace it with zero to fold the test.
+        _igvn.replace_node(mem, intcon(0));
+        continue;
+      }
+      assert(mem->is_Store(), "store required");
+      _igvn.replace_node(mem, mem->in(MemNode::Memory));
     }
   } else {
     // G1 pre/post barriers