# HG changeset patch # User never # Date 1292308863 28800 # Node ID 361783318e7eb005747c32807da9bf8eda8ea83d # Parent 79d8657be9165906ee40437faec844f34e9ade3d 7004940: CTW: assert(!def_outside->member(r)) failed: Use of external LRG overlaps the same LRG Reviewed-by: kvn, twisti diff -r 79d8657be916 -r 361783318e7e src/share/vm/opto/chaitin.cpp --- a/src/share/vm/opto/chaitin.cpp Fri Dec 10 14:14:02 2010 -0800 +++ b/src/share/vm/opto/chaitin.cpp Mon Dec 13 22:41:03 2010 -0800 @@ -1782,7 +1782,7 @@ for(uint i2 = 1; i2 < _maxlrg; i2++ ) { tty->print("L%d: ",i2); if( i2 < _ifg->_maxlrg ) lrgs(i2).dump( ); - else tty->print("new LRG"); + else tty->print_cr("new LRG"); } tty->print_cr(""); @@ -1993,7 +1993,7 @@ } //------------------------------dump_lrg--------------------------------------- -void PhaseChaitin::dump_lrg( uint lidx ) const { +void PhaseChaitin::dump_lrg( uint lidx, bool defs_only ) const { tty->print_cr("---dump of L%d---",lidx); if( _ifg ) { @@ -2002,9 +2002,11 @@ return; } tty->print("L%d: ",lidx); - lrgs(lidx).dump( ); + if( lidx < _ifg->_maxlrg ) lrgs(lidx).dump( ); + else tty->print_cr("new LRG"); } - if( _ifg ) { tty->print("Neighbors: %d - ", _ifg->neighbor_cnt(lidx)); + if( _ifg && lidx < _ifg->_maxlrg) { + tty->print("Neighbors: %d - ", _ifg->neighbor_cnt(lidx)); _ifg->neighbors(lidx)->dump(); tty->cr(); } @@ -2024,16 +2026,18 @@ dump(n); continue; } - uint cnt = n->req(); - for( uint k = 1; k < cnt; k++ ) { - Node *m = n->in(k); - if (!m) continue; // be robust in the dumper - if( Find_const(m) == lidx ) { - if( !dump_once++ ) { - tty->cr(); - b->dump_head( &_cfg._bbs ); + if (!defs_only) { + uint cnt = n->req(); + for( uint k = 1; k < cnt; k++ ) { + Node *m = n->in(k); + if (!m) continue; // be robust in the dumper + if( Find_const(m) == lidx ) { + if( !dump_once++ ) { + tty->cr(); + b->dump_head( &_cfg._bbs ); + } + dump(n); } - dump(n); } } } diff -r 79d8657be916 -r 361783318e7e src/share/vm/opto/chaitin.hpp --- a/src/share/vm/opto/chaitin.hpp Fri Dec 10 14:14:02 2010 -0800 +++ b/src/share/vm/opto/chaitin.hpp Mon Dec 13 22:41:03 2010 -0800 @@ -512,7 +512,11 @@ void dump( const Block * b ) const; void dump_degree_lists() const; void dump_simplified() const; - void dump_lrg( uint lidx ) const; + void dump_lrg( uint lidx, bool defs_only) const; + void dump_lrg( uint lidx) const { + // dump defs and uses by default + dump_lrg(lidx, false); + } void dump_bb( uint pre_order ) const; // Verify that base pointers and derived pointers are still sane diff -r 79d8657be916 -r 361783318e7e src/share/vm/opto/reg_split.cpp --- a/src/share/vm/opto/reg_split.cpp Fri Dec 10 14:14:02 2010 -0800 +++ b/src/share/vm/opto/reg_split.cpp Mon Dec 13 22:41:03 2010 -0800 @@ -1239,6 +1239,7 @@ // Cycle through this block's predecessors, collecting Reaches // info for each spilled LRG and update edges. // Walk the phis list to patch inputs, split phis, and name phis + uint lrgs_before_phi_split = maxlrg; for( insidx = 0; insidx < phis->size(); insidx++ ) { Node *phi = phis->at(insidx); assert(phi->is_Phi(),"This list must only contain Phi Nodes"); @@ -1273,7 +1274,16 @@ assert( def, "must have reaching def" ); // If input up/down sense and reg-pressure DISagree if( def->rematerialize() ) { - def = split_Rematerialize( def, pred, pred->end_idx(), maxlrg, splits, slidx, lrg2reach, Reachblock, false ); + // Place the rematerialized node above any MSCs created during + // phi node splitting. end_idx points at the insertion point + // so look at the node before it. + int insert = pred->end_idx(); + while (insert >= 1 && + pred->_nodes[insert - 1]->is_SpillCopy() && + Find(pred->_nodes[insert - 1]) >= lrgs_before_phi_split) { + insert--; + } + def = split_Rematerialize( def, pred, insert, maxlrg, splits, slidx, lrg2reach, Reachblock, false ); if( !def ) return 0; // Bail out } // Update the Phi's input edge array