Mercurial > hg > truffle
diff 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 |
line wrap: on
line diff
--- a/src/share/vm/opto/loopopts.cpp Fri Jul 25 11:32:56 2008 -0700 +++ b/src/share/vm/opto/loopopts.cpp Fri Jul 25 15:54:23 2008 -0700 @@ -1891,18 +1891,19 @@ _igvn.hash_delete(use); use->set_req(j, n_clone); _igvn._worklist.push(use); + Node* use_c; if (!use->is_Phi()) { - Node* use_c = has_ctrl(use) ? get_ctrl(use) : use->in(0); - set_ctrl(n_clone, use_c); - assert(!loop->is_member(get_loop(use_c)), "should be outside loop"); - get_loop(use_c)->_body.push(n_clone); + use_c = has_ctrl(use) ? get_ctrl(use) : use->in(0); } else { // Use in a phi is considered a use in the associated predecessor block - Node *prevbb = use->in(0)->in(j); - set_ctrl(n_clone, prevbb); - assert(!loop->is_member(get_loop(prevbb)), "should be outside loop"); - get_loop(prevbb)->_body.push(n_clone); + use_c = use->in(0)->in(j); } + if (use_c->is_CountedLoop()) { + use_c = use_c->in(LoopNode::EntryControl); + } + set_ctrl(n_clone, use_c); + assert(!loop->is_member(get_loop(use_c)), "should be outside loop"); + get_loop(use_c)->_body.push(n_clone); _igvn.register_new_node_with_optimizer(n_clone); #if !defined(PRODUCT) if (TracePartialPeeling) {