comparison src/share/vm/opto/postaloc.cpp @ 12023:d1034bd8cefc

8022284: Hide internal data structure in PhaseCFG Summary: Hide private node to block mapping using public interface Reviewed-by: kvn, roland
author adlertz
date Wed, 07 Aug 2013 17:56:19 +0200
parents 8373c19be854
children adb9a7d94cb5
comparison
equal deleted inserted replaced
12004:71526a36ebb4 12023:d1034bd8cefc
76 76
77 //------------------------------yank----------------------------------- 77 //------------------------------yank-----------------------------------
78 // Helper function for yank_if_dead 78 // Helper function for yank_if_dead
79 int PhaseChaitin::yank( Node *old, Block *current_block, Node_List *value, Node_List *regnd ) { 79 int PhaseChaitin::yank( Node *old, Block *current_block, Node_List *value, Node_List *regnd ) {
80 int blk_adjust=0; 80 int blk_adjust=0;
81 Block *oldb = _cfg._bbs[old->_idx]; 81 Block *oldb = _cfg.get_block_for_node(old);
82 oldb->find_remove(old); 82 oldb->find_remove(old);
83 // Count 1 if deleting an instruction from the current block 83 // Count 1 if deleting an instruction from the current block
84 if( oldb == current_block ) blk_adjust++; 84 if (oldb == current_block) {
85 _cfg._bbs.map(old->_idx,NULL); 85 blk_adjust++;
86 }
87 _cfg.unmap_node_from_block(old);
86 OptoReg::Name old_reg = lrgs(_lrg_map.live_range_id(old)).reg(); 88 OptoReg::Name old_reg = lrgs(_lrg_map.live_range_id(old)).reg();
87 if( regnd && (*regnd)[old_reg]==old ) { // Instruction is currently available? 89 if( regnd && (*regnd)[old_reg]==old ) { // Instruction is currently available?
88 value->map(old_reg,NULL); // Yank from value/regnd maps 90 value->map(old_reg,NULL); // Yank from value/regnd maps
89 regnd->map(old_reg,NULL); // This register's value is now unknown 91 regnd->map(old_reg,NULL); // This register's value is now unknown
90 } 92 }
431 // of registers at the start. Check for this, while updating copies 433 // of registers at the start. Check for this, while updating copies
432 // along Phi input edges 434 // along Phi input edges
433 bool missing_some_inputs = false; 435 bool missing_some_inputs = false;
434 Block *freed = NULL; 436 Block *freed = NULL;
435 for( j = 1; j < b->num_preds(); j++ ) { 437 for( j = 1; j < b->num_preds(); j++ ) {
436 Block *pb = _cfg._bbs[b->pred(j)->_idx]; 438 Block *pb = _cfg.get_block_for_node(b->pred(j));
437 // Remove copies along phi edges 439 // Remove copies along phi edges
438 for( uint k=1; k<phi_dex; k++ ) 440 for( uint k=1; k<phi_dex; k++ )
439 elide_copy( b->_nodes[k], j, b, *blk2value[pb->_pre_order], *blk2regnd[pb->_pre_order], false ); 441 elide_copy( b->_nodes[k], j, b, *blk2value[pb->_pre_order], *blk2regnd[pb->_pre_order], false );
440 if( blk2value[pb->_pre_order] ) { // Have a mapping on this edge? 442 if( blk2value[pb->_pre_order] ) { // Have a mapping on this edge?
441 // See if this predecessor's mappings have been used by everybody 443 // See if this predecessor's mappings have been used by everybody
476 regnd.map(k,NULL); 478 regnd.map(k,NULL);
477 } 479 }
478 } else { 480 } else {
479 if( !freed ) { // Didn't get a freebie prior block 481 if( !freed ) { // Didn't get a freebie prior block
480 // Must clone some data 482 // Must clone some data
481 freed = _cfg._bbs[b->pred(1)->_idx]; 483 freed = _cfg.get_block_for_node(b->pred(1));
482 Node_List &f_value = *blk2value[freed->_pre_order]; 484 Node_List &f_value = *blk2value[freed->_pre_order];
483 Node_List &f_regnd = *blk2regnd[freed->_pre_order]; 485 Node_List &f_regnd = *blk2regnd[freed->_pre_order];
484 for( uint k = 0; k < (uint)_max_reg; k++ ) { 486 for( uint k = 0; k < (uint)_max_reg; k++ ) {
485 value.map(k,f_value[k]); 487 value.map(k,f_value[k]);
486 regnd.map(k,f_regnd[k]); 488 regnd.map(k,f_regnd[k]);
487 } 489 }
488 } 490 }
489 // Merge all inputs together, setting to NULL any conflicts. 491 // Merge all inputs together, setting to NULL any conflicts.
490 for( j = 1; j < b->num_preds(); j++ ) { 492 for( j = 1; j < b->num_preds(); j++ ) {
491 Block *pb = _cfg._bbs[b->pred(j)->_idx]; 493 Block *pb = _cfg.get_block_for_node(b->pred(j));
492 if( pb == freed ) continue; // Did self already via freelist 494 if( pb == freed ) continue; // Did self already via freelist
493 Node_List &p_regnd = *blk2regnd[pb->_pre_order]; 495 Node_List &p_regnd = *blk2regnd[pb->_pre_order];
494 for( uint k = 0; k < (uint)_max_reg; k++ ) { 496 for( uint k = 0; k < (uint)_max_reg; k++ ) {
495 if( regnd[k] != p_regnd[k] ) { // Conflict on reaching defs? 497 if( regnd[k] != p_regnd[k] ) { // Conflict on reaching defs?
496 value.map(k,NULL); // Then no value handy 498 value.map(k,NULL); // Then no value handy
513 Node *x = phi->in(k); 515 Node *x = phi->in(k);
514 if( phi != x && u != x ) // Found a different input 516 if( phi != x && u != x ) // Found a different input
515 u = u ? NodeSentinel : x; // Capture unique input, or NodeSentinel for 2nd input 517 u = u ? NodeSentinel : x; // Capture unique input, or NodeSentinel for 2nd input
516 } 518 }
517 if( u != NodeSentinel ) { // Junk Phi. Remove 519 if( u != NodeSentinel ) { // Junk Phi. Remove
518 b->_nodes.remove(j--); phi_dex--; 520 b->_nodes.remove(j--);
519 _cfg._bbs.map(phi->_idx,NULL); 521 phi_dex--;
522 _cfg.unmap_node_from_block(phi);
520 phi->replace_by(u); 523 phi->replace_by(u);
521 phi->disconnect_inputs(NULL, C); 524 phi->disconnect_inputs(NULL, C);
522 continue; 525 continue;
523 } 526 }
524 // Note that if value[pidx] exists, then we merged no new values here 527 // Note that if value[pidx] exists, then we merged no new values here