1127 // Note that I cannot call 'replace_node' here, because |
1127 // Note that I cannot call 'replace_node' here, because |
1128 // that will yank the edge from old_phi to the Region and |
1128 // that will yank the edge from old_phi to the Region and |
1129 // I'm mid-iteration over the Region's uses. |
1129 // I'm mid-iteration over the Region's uses. |
1130 for (DUIterator_Last imin, i = old_phi->last_outs(imin); i >= imin; ) { |
1130 for (DUIterator_Last imin, i = old_phi->last_outs(imin); i >= imin; ) { |
1131 Node* use = old_phi->last_out(i); |
1131 Node* use = old_phi->last_out(i); |
1132 igvn.hash_delete(use); |
1132 igvn.rehash_node_delayed(use); |
1133 igvn._worklist.push(use); |
|
1134 uint uses_found = 0; |
1133 uint uses_found = 0; |
1135 for (uint j = 0; j < use->len(); j++) { |
1134 for (uint j = 0; j < use->len(); j++) { |
1136 if (use->in(j) == old_phi) { |
1135 if (use->in(j) == old_phi) { |
1137 if (j < use->req()) use->set_req (j, id_old_phi); |
1136 if (j < use->req()) use->set_req (j, id_old_phi); |
1138 else use->set_prec(j, id_old_phi); |
1137 else use->set_prec(j, id_old_phi); |
1184 Node *phi = PhiNode::make_blank(outer, old_phi); |
1183 Node *phi = PhiNode::make_blank(outer, old_phi); |
1185 phi->init_req(LoopNode::EntryControl, old_phi->in(LoopNode::EntryControl)); |
1184 phi->init_req(LoopNode::EntryControl, old_phi->in(LoopNode::EntryControl)); |
1186 phi->init_req(LoopNode::LoopBackControl, old_phi->in(outer_idx)); |
1185 phi->init_req(LoopNode::LoopBackControl, old_phi->in(outer_idx)); |
1187 phi = igvn.register_new_node_with_optimizer(phi, old_phi); |
1186 phi = igvn.register_new_node_with_optimizer(phi, old_phi); |
1188 // Make old Phi point to new Phi on the fall-in path |
1187 // Make old Phi point to new Phi on the fall-in path |
1189 igvn.hash_delete(old_phi); |
1188 igvn.replace_input_of(old_phi, LoopNode::EntryControl, phi); |
1190 old_phi->set_req(LoopNode::EntryControl, phi); |
|
1191 old_phi->del_req(outer_idx); |
1189 old_phi->del_req(outer_idx); |
1192 igvn._worklist.push(old_phi); |
|
1193 } |
1190 } |
1194 } |
1191 } |
1195 |
1192 |
1196 // Use the new loop head instead of the old shared one |
1193 // Use the new loop head instead of the old shared one |
1197 _head = outer; |
1194 _head = outer; |
1990 // As a side effect, Dominators removed any unreachable CFG paths |
1987 // As a side effect, Dominators removed any unreachable CFG paths |
1991 // into RegionNodes. It doesn't do this test against Root, so |
1988 // into RegionNodes. It doesn't do this test against Root, so |
1992 // we do it here. |
1989 // we do it here. |
1993 for( uint i = 1; i < C->root()->req(); i++ ) { |
1990 for( uint i = 1; i < C->root()->req(); i++ ) { |
1994 if( !_nodes[C->root()->in(i)->_idx] ) { // Dead path into Root? |
1991 if( !_nodes[C->root()->in(i)->_idx] ) { // Dead path into Root? |
1995 _igvn.hash_delete(C->root()); |
1992 _igvn.delete_input_of(C->root(), i); |
1996 C->root()->del_req(i); |
|
1997 _igvn._worklist.push(C->root()); |
|
1998 i--; // Rerun same iteration on compressed edges |
1993 i--; // Rerun same iteration on compressed edges |
1999 } |
1994 } |
2000 } |
1995 } |
2001 |
1996 |
2002 // Given dominators, try to find inner loops with calls that must |
1997 // Given dominators, try to find inner loops with calls that must |