Mercurial > hg > truffle
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 } |