Mercurial > hg > truffle
comparison src/share/vm/opto/reg_split.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 | b274ac1dbe11 |
children | adb9a7d94cb5 |
comparison
equal
deleted
inserted
replaced
12004:71526a36ebb4 | 12023:d1034bd8cefc |
---|---|
130 b = b->_succs[sidx]; // Switch to successor block | 130 b = b->_succs[sidx]; // Switch to successor block |
131 i = 1; // Right at start of block | 131 i = 1; // Right at start of block |
132 } | 132 } |
133 | 133 |
134 b->_nodes.insert(i,spill); // Insert node in block | 134 b->_nodes.insert(i,spill); // Insert node in block |
135 _cfg._bbs.map(spill->_idx,b); // Update node->block mapping to reflect | 135 _cfg.map_node_to_block(spill, b); // Update node->block mapping to reflect |
136 // Adjust the point where we go hi-pressure | 136 // Adjust the point where we go hi-pressure |
137 if( i <= b->_ihrp_index ) b->_ihrp_index++; | 137 if( i <= b->_ihrp_index ) b->_ihrp_index++; |
138 if( i <= b->_fhrp_index ) b->_fhrp_index++; | 138 if( i <= b->_fhrp_index ) b->_fhrp_index++; |
139 | 139 |
140 // Assign a new Live Range Number to the SpillCopy and grow | 140 // Assign a new Live Range Number to the SpillCopy and grow |
217 if( def_down ) { | 217 if( def_down ) { |
218 // DEF is DOWN, so connect USE directly to the DEF | 218 // DEF is DOWN, so connect USE directly to the DEF |
219 use->set_req(useidx, def); | 219 use->set_req(useidx, def); |
220 } else { | 220 } else { |
221 // Block and index where the use occurs. | 221 // Block and index where the use occurs. |
222 Block *b = _cfg._bbs[use->_idx]; | 222 Block *b = _cfg.get_block_for_node(use); |
223 // Put the clone just prior to use | 223 // Put the clone just prior to use |
224 int bindex = b->find_node(use); | 224 int bindex = b->find_node(use); |
225 // DEF is UP, so must copy it DOWN and hook in USE | 225 // DEF is UP, so must copy it DOWN and hook in USE |
226 // Insert SpillCopy before the USE, which uses DEF as its input, | 226 // Insert SpillCopy before the USE, which uses DEF as its input, |
227 // and defs a new live range, which is used by this node. | 227 // and defs a new live range, which is used by this node. |
268 | 268 |
269 // Block and index where the use occurs. | 269 // Block and index where the use occurs. |
270 int bindex; | 270 int bindex; |
271 // Phi input spill-copys belong at the end of the prior block | 271 // Phi input spill-copys belong at the end of the prior block |
272 if( use->is_Phi() ) { | 272 if( use->is_Phi() ) { |
273 b = _cfg._bbs[b->pred(useidx)->_idx]; | 273 b = _cfg.get_block_for_node(b->pred(useidx)); |
274 bindex = b->end_idx(); | 274 bindex = b->end_idx(); |
275 } else { | 275 } else { |
276 // Put the clone just prior to use | 276 // Put the clone just prior to use |
277 bindex = b->find_node(use); | 277 bindex = b->find_node(use); |
278 } | 278 } |
333 } | 333 } |
334 if (lrgs(lidx).is_singledef()) { | 334 if (lrgs(lidx).is_singledef()) { |
335 continue; | 335 continue; |
336 } | 336 } |
337 | 337 |
338 Block *b_def = _cfg._bbs[def->_idx]; | 338 Block *b_def = _cfg.get_block_for_node(def); |
339 int idx_def = b_def->find_node(def); | 339 int idx_def = b_def->find_node(def); |
340 Node *in_spill = get_spillcopy_wide( in, def, i ); | 340 Node *in_spill = get_spillcopy_wide( in, def, i ); |
341 if( !in_spill ) return 0; // Bailed out | 341 if( !in_spill ) return 0; // Bailed out |
342 insert_proj(b_def,idx_def,in_spill,maxlrg++); | 342 insert_proj(b_def,idx_def,in_spill,maxlrg++); |
343 if( b_def == b ) | 343 if( b_def == b ) |
587 // reset the Reaches & UP entries | 587 // reset the Reaches & UP entries |
588 Reachblock[slidx] = lrgs(lidx)._def; | 588 Reachblock[slidx] = lrgs(lidx)._def; |
589 UPblock[slidx] = true; | 589 UPblock[slidx] = true; |
590 // Record following instruction in case 'n' rematerializes and | 590 // Record following instruction in case 'n' rematerializes and |
591 // kills flags | 591 // kills flags |
592 Block *pred1 = _cfg._bbs[b->pred(1)->_idx]; | 592 Block *pred1 = _cfg.get_block_for_node(b->pred(1)); |
593 continue; | 593 continue; |
594 } | 594 } |
595 | 595 |
596 // Initialize needs_phi and needs_split | 596 // Initialize needs_phi and needs_split |
597 bool needs_phi = false; | 597 bool needs_phi = false; |
599 bool has_phi = false; | 599 bool has_phi = false; |
600 // Walk the predecessor blocks to check inputs for that live range | 600 // Walk the predecessor blocks to check inputs for that live range |
601 // Grab predecessor block header | 601 // Grab predecessor block header |
602 n1 = b->pred(1); | 602 n1 = b->pred(1); |
603 // Grab the appropriate reaching def info for inpidx | 603 // Grab the appropriate reaching def info for inpidx |
604 pred = _cfg._bbs[n1->_idx]; | 604 pred = _cfg.get_block_for_node(n1); |
605 pidx = pred->_pre_order; | 605 pidx = pred->_pre_order; |
606 Node **Ltmp = Reaches[pidx]; | 606 Node **Ltmp = Reaches[pidx]; |
607 bool *Utmp = UP[pidx]; | 607 bool *Utmp = UP[pidx]; |
608 n1 = Ltmp[slidx]; | 608 n1 = Ltmp[slidx]; |
609 u1 = Utmp[slidx]; | 609 u1 = Utmp[slidx]; |
614 // Compare inputs to see if a Phi is needed | 614 // Compare inputs to see if a Phi is needed |
615 for( inpidx = 2; inpidx < b->num_preds(); inpidx++ ) { | 615 for( inpidx = 2; inpidx < b->num_preds(); inpidx++ ) { |
616 // Grab predecessor block headers | 616 // Grab predecessor block headers |
617 n2 = b->pred(inpidx); | 617 n2 = b->pred(inpidx); |
618 // Grab the appropriate reaching def info for inpidx | 618 // Grab the appropriate reaching def info for inpidx |
619 pred = _cfg._bbs[n2->_idx]; | 619 pred = _cfg.get_block_for_node(n2); |
620 pidx = pred->_pre_order; | 620 pidx = pred->_pre_order; |
621 Ltmp = Reaches[pidx]; | 621 Ltmp = Reaches[pidx]; |
622 Utmp = UP[pidx]; | 622 Utmp = UP[pidx]; |
623 n2 = Ltmp[slidx]; | 623 n2 = Ltmp[slidx]; |
624 u2 = Utmp[slidx]; | 624 u2 = Utmp[slidx]; |
699 // Do not need a phi, so grab the reaching DEF | 699 // Do not need a phi, so grab the reaching DEF |
700 else { | 700 else { |
701 // Grab predecessor block header | 701 // Grab predecessor block header |
702 n1 = b->pred(1); | 702 n1 = b->pred(1); |
703 // Grab the appropriate reaching def info for k | 703 // Grab the appropriate reaching def info for k |
704 pred = _cfg._bbs[n1->_idx]; | 704 pred = _cfg.get_block_for_node(n1); |
705 pidx = pred->_pre_order; | 705 pidx = pred->_pre_order; |
706 Node **Ltmp = Reaches[pidx]; | 706 Node **Ltmp = Reaches[pidx]; |
707 bool *Utmp = UP[pidx]; | 707 bool *Utmp = UP[pidx]; |
708 // reset the Reaches & UP entries | 708 // reset the Reaches & UP entries |
709 Reachblock[slidx] = Ltmp[slidx]; | 709 Reachblock[slidx] = Ltmp[slidx]; |
917 def = clone_node(def, b, C); | 917 def = clone_node(def, b, C); |
918 if (def == NULL || C->check_node_count(NodeLimitFudgeFactor, out_of_nodes)) { | 918 if (def == NULL || C->check_node_count(NodeLimitFudgeFactor, out_of_nodes)) { |
919 return 0; | 919 return 0; |
920 } | 920 } |
921 _lrg_map.extend(def->_idx, 0); | 921 _lrg_map.extend(def->_idx, 0); |
922 _cfg._bbs.map(def->_idx,b); | 922 _cfg.map_node_to_block(def, b); |
923 n->set_req(inpidx, def); | 923 n->set_req(inpidx, def); |
924 continue; | 924 continue; |
925 } | 925 } |
926 | 926 |
927 // Rematerializable? Then clone def at use site instead | 927 // Rematerializable? Then clone def at use site instead |
1289 // Walk the phis list to patch inputs, split phis, and name phis | 1289 // Walk the phis list to patch inputs, split phis, and name phis |
1290 uint lrgs_before_phi_split = maxlrg; | 1290 uint lrgs_before_phi_split = maxlrg; |
1291 for( insidx = 0; insidx < phis->size(); insidx++ ) { | 1291 for( insidx = 0; insidx < phis->size(); insidx++ ) { |
1292 Node *phi = phis->at(insidx); | 1292 Node *phi = phis->at(insidx); |
1293 assert(phi->is_Phi(),"This list must only contain Phi Nodes"); | 1293 assert(phi->is_Phi(),"This list must only contain Phi Nodes"); |
1294 Block *b = _cfg._bbs[phi->_idx]; | 1294 Block *b = _cfg.get_block_for_node(phi); |
1295 // Grab the live range number | 1295 // Grab the live range number |
1296 uint lidx = _lrg_map.find_id(phi); | 1296 uint lidx = _lrg_map.find_id(phi); |
1297 uint slidx = lrg2reach[lidx]; | 1297 uint slidx = lrg2reach[lidx]; |
1298 // Update node to lidx map | 1298 // Update node to lidx map |
1299 new_lrg(phi, maxlrg++); | 1299 new_lrg(phi, maxlrg++); |
1313 // Walk the predecessor blocks and assign the reaching def to the Phi. | 1313 // Walk the predecessor blocks and assign the reaching def to the Phi. |
1314 // Split Phi nodes by placing USE side splits wherever the reaching | 1314 // Split Phi nodes by placing USE side splits wherever the reaching |
1315 // DEF has the wrong UP/DOWN value. | 1315 // DEF has the wrong UP/DOWN value. |
1316 for( uint i = 1; i < b->num_preds(); i++ ) { | 1316 for( uint i = 1; i < b->num_preds(); i++ ) { |
1317 // Get predecessor block pre-order number | 1317 // Get predecessor block pre-order number |
1318 Block *pred = _cfg._bbs[b->pred(i)->_idx]; | 1318 Block *pred = _cfg.get_block_for_node(b->pred(i)); |
1319 pidx = pred->_pre_order; | 1319 pidx = pred->_pre_order; |
1320 // Grab reaching def | 1320 // Grab reaching def |
1321 Node *def = Reaches[pidx][slidx]; | 1321 Node *def = Reaches[pidx][slidx]; |
1322 assert( def, "must have reaching def" ); | 1322 assert( def, "must have reaching def" ); |
1323 // If input up/down sense and reg-pressure DISagree | 1323 // If input up/down sense and reg-pressure DISagree |