2445 if (msg == NULL && !store->in(MemNode::Address)->is_AddP()) { |
2445 if (msg == NULL && !store->in(MemNode::Address)->is_AddP()) { |
2446 msg = "can't handle store address"; |
2446 msg = "can't handle store address"; |
2447 msg_node = store->in(MemNode::Address); |
2447 msg_node = store->in(MemNode::Address); |
2448 } |
2448 } |
2449 |
2449 |
|
2450 if (msg == NULL && |
|
2451 (!store->in(MemNode::Memory)->is_Phi() || |
|
2452 store->in(MemNode::Memory)->in(LoopNode::LoopBackControl) != store)) { |
|
2453 msg = "store memory isn't proper phi"; |
|
2454 msg_node = store->in(MemNode::Memory); |
|
2455 } |
|
2456 |
2450 // Make sure there is an appropriate fill routine |
2457 // Make sure there is an appropriate fill routine |
2451 BasicType t = store->as_Mem()->memory_type(); |
2458 BasicType t = store->as_Mem()->memory_type(); |
2452 const char* fill_name; |
2459 const char* fill_name; |
2453 if (msg == NULL && |
2460 if (msg == NULL && |
2454 StubRoutines::select_fill_function(t, false, fill_name) == NULL) { |
2461 StubRoutines::select_fill_function(t, false, fill_name) == NULL) { |
2568 // Make sure no unexpected values are used outside the loop |
2575 // Make sure no unexpected values are used outside the loop |
2569 for (uint i = 0; msg == NULL && i < lpt->_body.size(); i++) { |
2576 for (uint i = 0; msg == NULL && i < lpt->_body.size(); i++) { |
2570 Node* n = lpt->_body.at(i); |
2577 Node* n = lpt->_body.at(i); |
2571 // These values can be replaced with other nodes if they are used |
2578 // These values can be replaced with other nodes if they are used |
2572 // outside the loop. |
2579 // outside the loop. |
2573 if (n == store || n == head->loopexit() || n == head->incr()) continue; |
2580 if (n == store || n == head->loopexit() || n == head->incr() || n == store->in(MemNode::Memory)) continue; |
2574 for (SimpleDUIterator iter(n); iter.has_next(); iter.next()) { |
2581 for (SimpleDUIterator iter(n); iter.has_next(); iter.next()) { |
2575 Node* use = iter.get(); |
2582 Node* use = iter.get(); |
2576 if (!lpt->_body.contains(use)) { |
2583 if (!lpt->_body.contains(use)) { |
2577 msg = "node is used outside loop"; |
2584 msg = "node is used outside loop"; |
2578 // lpt->_body.dump(); |
2585 // lpt->_body.dump(); |
2713 } |
2720 } |
2714 } |
2721 } |
2715 |
2722 |
2716 // Redirect the old control and memory edges that are outside the loop. |
2723 // Redirect the old control and memory edges that are outside the loop. |
2717 Node* exit = head->loopexit()->proj_out(0); |
2724 Node* exit = head->loopexit()->proj_out(0); |
|
2725 // Sometimes the memory phi of the head is used as the outgoing |
|
2726 // state of the loop. It's safe in this case to replace it with the |
|
2727 // result_mem. |
|
2728 _igvn.replace_node(store->in(MemNode::Memory), result_mem); |
2718 _igvn.replace_node(exit, result_ctrl); |
2729 _igvn.replace_node(exit, result_ctrl); |
2719 _igvn.replace_node(store, result_mem); |
2730 _igvn.replace_node(store, result_mem); |
2720 // Any uses the increment outside of the loop become the loop limit. |
2731 // Any uses the increment outside of the loop become the loop limit. |
2721 _igvn.replace_node(head->incr(), head->limit()); |
2732 _igvn.replace_node(head->incr(), head->limit()); |
2722 |
2733 |