changeset 1677:bdd14610f204 hs19-b07

6984979: OptimizeFill misses some cases with an odd memory graph Reviewed-by: kvn
author never
date Wed, 15 Sep 2010 20:25:37 -0700
parents f6b107f3629a
children a367fee99714
files src/share/vm/opto/loopTransform.cpp
diffstat 1 files changed, 12 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/opto/loopTransform.cpp	Fri Sep 10 13:40:05 2010 -0400
+++ b/src/share/vm/opto/loopTransform.cpp	Wed Sep 15 20:25:37 2010 -0700
@@ -2447,6 +2447,13 @@
     msg_node = store->in(MemNode::Address);
   }
 
+  if (msg == NULL &&
+      (!store->in(MemNode::Memory)->is_Phi() ||
+       store->in(MemNode::Memory)->in(LoopNode::LoopBackControl) != store)) {
+    msg = "store memory isn't proper phi";
+    msg_node = store->in(MemNode::Memory);
+  }
+
   // Make sure there is an appropriate fill routine
   BasicType t = store->as_Mem()->memory_type();
   const char* fill_name;
@@ -2570,7 +2577,7 @@
     Node* n = lpt->_body.at(i);
     // These values can be replaced with other nodes if they are used
     // outside the loop.
-    if (n == store || n == head->loopexit() || n == head->incr()) continue;
+    if (n == store || n == head->loopexit() || n == head->incr() || n == store->in(MemNode::Memory)) continue;
     for (SimpleDUIterator iter(n); iter.has_next(); iter.next()) {
       Node* use = iter.get();
       if (!lpt->_body.contains(use)) {
@@ -2715,6 +2722,10 @@
 
   // Redirect the old control and memory edges that are outside the loop.
   Node* exit = head->loopexit()->proj_out(0);
+  // Sometimes the memory phi of the head is used as the outgoing
+  // state of the loop.  It's safe in this case to replace it with the
+  // result_mem.
+  _igvn.replace_node(store->in(MemNode::Memory), result_mem);
   _igvn.replace_node(exit, result_ctrl);
   _igvn.replace_node(store, result_mem);
   // Any uses the increment outside of the loop become the loop limit.