comparison src/share/vm/opto/loopnode.cpp @ 17914:3636afd5ec1a

8039298: assert(base == NULL || t_adr->isa_rawptr() || !phase->type(base)->higher_equal(TypePtr::NULL_PTR)) Summary: Convert the assert into the runtime check to skip IGVN optimizations for problematic memory nodes. Eliminate dead nodes more aggressively. Reviewed-by: twisti, iveresov
author kvn
date Fri, 02 May 2014 16:44:54 -0700
parents cd3c534f8f4a
children 78bbf4d43a14
comparison
equal deleted inserted replaced
17913:1eba0601f0dd 17914:3636afd5ec1a
264 bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) { 264 bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
265 PhaseGVN *gvn = &_igvn; 265 PhaseGVN *gvn = &_igvn;
266 266
267 // Counted loop head must be a good RegionNode with only 3 not NULL 267 // Counted loop head must be a good RegionNode with only 3 not NULL
268 // control input edges: Self, Entry, LoopBack. 268 // control input edges: Self, Entry, LoopBack.
269 if (x->in(LoopNode::Self) == NULL || x->req() != 3) 269 if (x->in(LoopNode::Self) == NULL || x->req() != 3 || loop->_irreducible) {
270 return false; 270 return false;
271 271 }
272 Node *init_control = x->in(LoopNode::EntryControl); 272 Node *init_control = x->in(LoopNode::EntryControl);
273 Node *back_control = x->in(LoopNode::LoopBackControl); 273 Node *back_control = x->in(LoopNode::LoopBackControl);
274 if (init_control == NULL || back_control == NULL) // Partially dead 274 if (init_control == NULL || back_control == NULL) // Partially dead
275 return false; 275 return false;
276 // Must also check for TOP when looking for a dead loop 276 // Must also check for TOP when looking for a dead loop
1520 result = true; 1520 result = true;
1521 } 1521 }
1522 1522
1523 // If I have one hot backedge, peel off myself loop. 1523 // If I have one hot backedge, peel off myself loop.
1524 // I better be the outermost loop. 1524 // I better be the outermost loop.
1525 if( _head->req() > 3 ) { 1525 if (_head->req() > 3 && !_irreducible) {
1526 split_outer_loop( phase ); 1526 split_outer_loop( phase );
1527 result = true; 1527 result = true;
1528 1528
1529 } else if( !_head->is_Loop() && !_irreducible ) { 1529 } else if (!_head->is_Loop() && !_irreducible) {
1530 // Make a new LoopNode to replace the old loop head 1530 // Make a new LoopNode to replace the old loop head
1531 Node *l = new (phase->C) LoopNode( _head->in(1), _head->in(2) ); 1531 Node *l = new (phase->C) LoopNode( _head->in(1), _head->in(2) );
1532 l = igvn.register_new_node_with_optimizer(l, _head); 1532 l = igvn.register_new_node_with_optimizer(l, _head);
1533 phase->set_created_loop_node(); 1533 phase->set_created_loop_node();
1534 // Go ahead and replace _head 1534 // Go ahead and replace _head
2936 if (l == NULL) { 2936 if (l == NULL) {
2937 C->record_method_not_compilable("unhandled CFG detected during loop optimization"); 2937 C->record_method_not_compilable("unhandled CFG detected during loop optimization");
2938 return pre_order; 2938 return pre_order;
2939 } 2939 }
2940 } 2940 }
2941 C->set_has_irreducible_loop(_has_irreducible_loops);
2941 } 2942 }
2942 2943
2943 // This Node might be a decision point for loops. It is only if 2944 // This Node might be a decision point for loops. It is only if
2944 // it's children belong to several different loops. The sort call 2945 // it's children belong to several different loops. The sort call
2945 // does a trivial amount of work if there is only 1 child or all 2946 // does a trivial amount of work if there is only 1 child or all