comparison src/share/vm/opto/loopopts.cpp @ 251:020a0b730379

6700047: C2 failed in idom_no_update Summary: partial peeling shouldn't place clones into loop Reviewed-by: kvn
author never
date Fri, 25 Jul 2008 15:54:23 -0700
parents 9c2ecc2ffb12
children b0fe4deeb9fb
comparison
equal deleted inserted replaced
250:6ca61c728c2d 251:020a0b730379
1889 // clone "n" and insert it between the inputs of "n" and the use outside the loop 1889 // clone "n" and insert it between the inputs of "n" and the use outside the loop
1890 Node* n_clone = n->clone(); 1890 Node* n_clone = n->clone();
1891 _igvn.hash_delete(use); 1891 _igvn.hash_delete(use);
1892 use->set_req(j, n_clone); 1892 use->set_req(j, n_clone);
1893 _igvn._worklist.push(use); 1893 _igvn._worklist.push(use);
1894 Node* use_c;
1894 if (!use->is_Phi()) { 1895 if (!use->is_Phi()) {
1895 Node* use_c = has_ctrl(use) ? get_ctrl(use) : use->in(0); 1896 use_c = has_ctrl(use) ? get_ctrl(use) : use->in(0);
1896 set_ctrl(n_clone, use_c);
1897 assert(!loop->is_member(get_loop(use_c)), "should be outside loop");
1898 get_loop(use_c)->_body.push(n_clone);
1899 } else { 1897 } else {
1900 // Use in a phi is considered a use in the associated predecessor block 1898 // Use in a phi is considered a use in the associated predecessor block
1901 Node *prevbb = use->in(0)->in(j); 1899 use_c = use->in(0)->in(j);
1902 set_ctrl(n_clone, prevbb); 1900 }
1903 assert(!loop->is_member(get_loop(prevbb)), "should be outside loop"); 1901 if (use_c->is_CountedLoop()) {
1904 get_loop(prevbb)->_body.push(n_clone); 1902 use_c = use_c->in(LoopNode::EntryControl);
1905 } 1903 }
1904 set_ctrl(n_clone, use_c);
1905 assert(!loop->is_member(get_loop(use_c)), "should be outside loop");
1906 get_loop(use_c)->_body.push(n_clone);
1906 _igvn.register_new_node_with_optimizer(n_clone); 1907 _igvn.register_new_node_with_optimizer(n_clone);
1907 #if !defined(PRODUCT) 1908 #if !defined(PRODUCT)
1908 if (TracePartialPeeling) { 1909 if (TracePartialPeeling) {
1909 tty->print_cr("loop exit cloning old: %d new: %d newbb: %d", n->_idx, n_clone->_idx, get_ctrl(n_clone)->_idx); 1910 tty->print_cr("loop exit cloning old: %d new: %d newbb: %d", n->_idx, n_clone->_idx, get_ctrl(n_clone)->_idx);
1910 } 1911 }