hotspot/src/share/vm/opto/ifg.cpp
changeset 4747 9b03cd97f2fb
parent 2154 72a9b7284ccf
child 4760 70aa3bc938c2
--- a/hotspot/src/share/vm/opto/ifg.cpp	Thu Jan 28 16:28:28 2010 -0800
+++ b/hotspot/src/share/vm/opto/ifg.cpp	Thu Jan 28 20:41:37 2010 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 1998-2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1998-2010 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -736,7 +736,28 @@
         // the flags and assumes it's dead.  This keeps the (useless)
         // flag-setting behavior alive while also keeping the (useful)
         // memory update effect.
-        for( uint k = ((n->Opcode() == Op_SCMemProj) ? 0:1); k < n->req(); k++ ) {
+        uint begin = 1;
+        uint end = n->req();
+        if (n->Opcode() == Op_SCMemProj) {
+          begin = 0;
+        } else if (n->is_Mach()) {
+          switch (n->as_Mach()->ideal_Opcode()) {
+            case Op_MemBarAcquire:
+            case Op_MemBarVolatile:
+              if (n->len() >= MemBarNode::Precedent + 1 &&
+                  n->in(MemBarNode::Precedent) != NULL &&
+                  n->in(MemBarNode::Precedent)->outcnt() == 1) {
+                // This membar node is the single user of it's input
+                // so the input won't be considered live and this node
+                // would get deleted during copy elimination so force
+                // it to be live.
+                end = MemBarNode::Precedent + 1;
+              }
+              break;
+          }
+        }
+
+        for( uint k = begin; k < end; k++ ) {
           Node *def = n->in(k);
           uint x = n2lidx(def);
           if( !x ) continue;