--- a/hotspot/src/share/vm/opto/loopTransform.cpp Thu Sep 16 16:48:40 2010 -0700
+++ b/hotspot/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.