Mercurial > hg > truffle
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 |