src/share/vm/opto/postaloc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File JDK-8022284 Cdiff src/share/vm/opto/postaloc.cpp

src/share/vm/opto/postaloc.cpp

Print this page

        

*** 76,90 **** //------------------------------yank----------------------------------- // Helper function for yank_if_dead int PhaseChaitin::yank( Node *old, Block *current_block, Node_List *value, Node_List *regnd ) { int blk_adjust=0; ! Block *oldb = _cfg._bbs[old->_idx]; oldb->find_remove(old); // Count 1 if deleting an instruction from the current block ! if( oldb == current_block ) blk_adjust++; ! _cfg._bbs.map(old->_idx,NULL); OptoReg::Name old_reg = lrgs(_lrg_map.live_range_id(old)).reg(); if( regnd && (*regnd)[old_reg]==old ) { // Instruction is currently available? value->map(old_reg,NULL); // Yank from value/regnd maps regnd->map(old_reg,NULL); // This register's value is now unknown } --- 76,92 ---- //------------------------------yank----------------------------------- // Helper function for yank_if_dead int PhaseChaitin::yank( Node *old, Block *current_block, Node_List *value, Node_List *regnd ) { int blk_adjust=0; ! Block *oldb = _cfg.get_block_for_node(old); oldb->find_remove(old); // Count 1 if deleting an instruction from the current block ! if (oldb == current_block) { ! blk_adjust++; ! } ! _cfg.unmap_node_from_block(old); OptoReg::Name old_reg = lrgs(_lrg_map.live_range_id(old)).reg(); if( regnd && (*regnd)[old_reg]==old ) { // Instruction is currently available? value->map(old_reg,NULL); // Yank from value/regnd maps regnd->map(old_reg,NULL); // This register's value is now unknown }
*** 431,441 **** // of registers at the start. Check for this, while updating copies // along Phi input edges bool missing_some_inputs = false; Block *freed = NULL; for( j = 1; j < b->num_preds(); j++ ) { ! Block *pb = _cfg._bbs[b->pred(j)->_idx]; // Remove copies along phi edges for( uint k=1; k<phi_dex; k++ ) elide_copy( b->_nodes[k], j, b, *blk2value[pb->_pre_order], *blk2regnd[pb->_pre_order], false ); if( blk2value[pb->_pre_order] ) { // Have a mapping on this edge? // See if this predecessor's mappings have been used by everybody --- 433,443 ---- // of registers at the start. Check for this, while updating copies // along Phi input edges bool missing_some_inputs = false; Block *freed = NULL; for( j = 1; j < b->num_preds(); j++ ) { ! Block *pb = _cfg.get_block_for_node(b->pred(j)); // Remove copies along phi edges for( uint k=1; k<phi_dex; k++ ) elide_copy( b->_nodes[k], j, b, *blk2value[pb->_pre_order], *blk2regnd[pb->_pre_order], false ); if( blk2value[pb->_pre_order] ) { // Have a mapping on this edge? // See if this predecessor's mappings have been used by everybody
*** 476,496 **** regnd.map(k,NULL); } } else { if( !freed ) { // Didn't get a freebie prior block // Must clone some data ! freed = _cfg._bbs[b->pred(1)->_idx]; Node_List &f_value = *blk2value[freed->_pre_order]; Node_List &f_regnd = *blk2regnd[freed->_pre_order]; for( uint k = 0; k < (uint)_max_reg; k++ ) { value.map(k,f_value[k]); regnd.map(k,f_regnd[k]); } } // Merge all inputs together, setting to NULL any conflicts. for( j = 1; j < b->num_preds(); j++ ) { ! Block *pb = _cfg._bbs[b->pred(j)->_idx]; if( pb == freed ) continue; // Did self already via freelist Node_List &p_regnd = *blk2regnd[pb->_pre_order]; for( uint k = 0; k < (uint)_max_reg; k++ ) { if( regnd[k] != p_regnd[k] ) { // Conflict on reaching defs? value.map(k,NULL); // Then no value handy --- 478,498 ---- regnd.map(k,NULL); } } else { if( !freed ) { // Didn't get a freebie prior block // Must clone some data ! freed = _cfg.get_block_for_node(b->pred(1)); Node_List &f_value = *blk2value[freed->_pre_order]; Node_List &f_regnd = *blk2regnd[freed->_pre_order]; for( uint k = 0; k < (uint)_max_reg; k++ ) { value.map(k,f_value[k]); regnd.map(k,f_regnd[k]); } } // Merge all inputs together, setting to NULL any conflicts. for( j = 1; j < b->num_preds(); j++ ) { ! Block *pb = _cfg.get_block_for_node(b->pred(j)); if( pb == freed ) continue; // Did self already via freelist Node_List &p_regnd = *blk2regnd[pb->_pre_order]; for( uint k = 0; k < (uint)_max_reg; k++ ) { if( regnd[k] != p_regnd[k] ) { // Conflict on reaching defs? value.map(k,NULL); // Then no value handy
*** 513,524 **** Node *x = phi->in(k); if( phi != x && u != x ) // Found a different input u = u ? NodeSentinel : x; // Capture unique input, or NodeSentinel for 2nd input } if( u != NodeSentinel ) { // Junk Phi. Remove ! b->_nodes.remove(j--); phi_dex--; ! _cfg._bbs.map(phi->_idx,NULL); phi->replace_by(u); phi->disconnect_inputs(NULL, C); continue; } // Note that if value[pidx] exists, then we merged no new values here --- 515,527 ---- Node *x = phi->in(k); if( phi != x && u != x ) // Found a different input u = u ? NodeSentinel : x; // Capture unique input, or NodeSentinel for 2nd input } if( u != NodeSentinel ) { // Junk Phi. Remove ! b->_nodes.remove(j--); ! phi_dex--; ! _cfg.unmap_node_from_block(phi); phi->replace_by(u); phi->disconnect_inputs(NULL, C); continue; } // Note that if value[pidx] exists, then we merged no new values here
src/share/vm/opto/postaloc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File