# HG changeset patch # User never # Date 1284607537 25200 # Node ID c77e8f9829010bce41177c6d2a9cb860e36d4567 # Parent 18c3785135759b9af8339c1314c586cce0b2b7c0 6984979: OptimizeFill misses some cases with an odd memory graph Reviewed-by: kvn diff -r 18c378513575 -r c77e8f982901 src/share/vm/opto/loopTransform.cpp --- a/src/share/vm/opto/loopTransform.cpp Thu Sep 16 16:48:40 2010 -0700 +++ 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.