Wed, 08 Jan 2014 12:05:19 +0100
8029446: assert(_cfg.get_block_for_node(proj) == borig) failed: incorrect block for kill projections
Summary: Added loadConP0 projection node to block in case of re-materialization of the loadConP0. x86_64 only.
Reviewed-by: kvn
src/share/vm/opto/chaitin.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/opto/chaitin.cpp Wed Jan 08 09:49:31 2014 +0100 1.2 +++ b/src/share/vm/opto/chaitin.cpp Wed Jan 08 12:05:19 2014 +0100 1.3 @@ -1682,9 +1682,21 @@ 1.4 // (where top() node is placed). 1.5 base->init_req(0, _cfg.get_root_node()); 1.6 Block *startb = _cfg.get_block_for_node(C->top()); 1.7 - startb->insert_node(base, startb->find_node(C->top())); 1.8 + uint node_pos = startb->find_node(C->top()); 1.9 + startb->insert_node(base, node_pos); 1.10 _cfg.map_node_to_block(base, startb); 1.11 assert(_lrg_map.live_range_id(base) == 0, "should not have LRG yet"); 1.12 + 1.13 + // The loadConP0 might have projection nodes depending on architecture 1.14 + // Add the projection nodes to the CFG 1.15 + for (DUIterator_Fast imax, i = base->fast_outs(imax); i < imax; i++) { 1.16 + Node* use = base->fast_out(i); 1.17 + if (use->is_MachProj()) { 1.18 + startb->insert_node(use, ++node_pos); 1.19 + _cfg.map_node_to_block(use, startb); 1.20 + new_lrg(use, maxlrg++); 1.21 + } 1.22 + } 1.23 } 1.24 if (_lrg_map.live_range_id(base) == 0) { 1.25 new_lrg(base, maxlrg++);