52 tty->print("B%d ", _phc._cfg.get_block_for_node(b->pred(j))->_pre_order); |
52 tty->print("B%d ", _phc._cfg.get_block_for_node(b->pred(j))->_pre_order); |
53 tty->print("-> "); |
53 tty->print("-> "); |
54 for( j=0; j<b->_num_succs; j++ ) |
54 for( j=0; j<b->_num_succs; j++ ) |
55 tty->print("B%d ",b->_succs[j]->_pre_order); |
55 tty->print("B%d ",b->_succs[j]->_pre_order); |
56 tty->print(" IDom: B%d/#%d\n", b->_idom ? b->_idom->_pre_order : 0, b->_dom_depth); |
56 tty->print(" IDom: B%d/#%d\n", b->_idom ? b->_idom->_pre_order : 0, b->_dom_depth); |
57 uint cnt = b->_nodes.size(); |
57 uint cnt = b->number_of_nodes(); |
58 for( j=0; j<cnt; j++ ) { |
58 for( j=0; j<cnt; j++ ) { |
59 Node *n = b->_nodes[j]; |
59 Node *n = b->get_node(j); |
60 dump( n ); |
60 dump( n ); |
61 tty->print("\t%s\t",n->Name()); |
61 tty->print("\t%s\t",n->Name()); |
62 |
62 |
63 // Dump the inputs |
63 // Dump the inputs |
64 uint k; // Exit value of loop |
64 uint k; // Exit value of loop |
150 // Scan backwards for the locations of the last use of the dst_name. |
150 // Scan backwards for the locations of the last use of the dst_name. |
151 // I am about to clobber the dst_name, so the copy must be inserted |
151 // I am about to clobber the dst_name, so the copy must be inserted |
152 // after the last use. Last use is really first-use on a backwards scan. |
152 // after the last use. Last use is really first-use on a backwards scan. |
153 uint i = b->end_idx()-1; |
153 uint i = b->end_idx()-1; |
154 while(1) { |
154 while(1) { |
155 Node *n = b->_nodes[i]; |
155 Node *n = b->get_node(i); |
156 // Check for end of virtual copies; this is also the end of the |
156 // Check for end of virtual copies; this is also the end of the |
157 // parallel renaming effort. |
157 // parallel renaming effort. |
158 if (n->_idx < _unique) { |
158 if (n->_idx < _unique) { |
159 break; |
159 break; |
160 } |
160 } |
172 uint kill_src_idx = b->end_idx(); |
172 uint kill_src_idx = b->end_idx(); |
173 // There can be only 1 kill that exits any block and that is |
173 // There can be only 1 kill that exits any block and that is |
174 // the last kill. Thus it is the first kill on a backwards scan. |
174 // the last kill. Thus it is the first kill on a backwards scan. |
175 i = b->end_idx()-1; |
175 i = b->end_idx()-1; |
176 while (1) { |
176 while (1) { |
177 Node *n = b->_nodes[i]; |
177 Node *n = b->get_node(i); |
178 // Check for end of virtual copies; this is also the end of the |
178 // Check for end of virtual copies; this is also the end of the |
179 // parallel renaming effort. |
179 // parallel renaming effort. |
180 if (n->_idx < _unique) { |
180 if (n->_idx < _unique) { |
181 break; |
181 break; |
182 } |
182 } |
198 |
198 |
199 // Insert new temp between copy and source |
199 // Insert new temp between copy and source |
200 tmp ->set_req(idx,copy->in(idx)); |
200 tmp ->set_req(idx,copy->in(idx)); |
201 copy->set_req(idx,tmp); |
201 copy->set_req(idx,tmp); |
202 // Save source in temp early, before source is killed |
202 // Save source in temp early, before source is killed |
203 b->_nodes.insert(kill_src_idx,tmp); |
203 b->insert_node(tmp, kill_src_idx); |
204 _phc._cfg.map_node_to_block(tmp, b); |
204 _phc._cfg.map_node_to_block(tmp, b); |
205 last_use_idx++; |
205 last_use_idx++; |
206 } |
206 } |
207 |
207 |
208 // Insert just after last use |
208 // Insert just after last use |
209 b->_nodes.insert(last_use_idx+1,copy); |
209 b->insert_node(copy, last_use_idx + 1); |
210 } |
210 } |
211 |
211 |
212 void PhaseAggressiveCoalesce::insert_copies( Matcher &matcher ) { |
212 void PhaseAggressiveCoalesce::insert_copies( Matcher &matcher ) { |
213 // We do LRGs compressing and fix a liveout data only here since the other |
213 // We do LRGs compressing and fix a liveout data only here since the other |
214 // place in Split() is guarded by the assert which we never hit. |
214 // place in Split() is guarded by the assert which we never hit. |
235 C->check_node_count(NodeLimitFudgeFactor, "out of nodes in coalesce"); |
235 C->check_node_count(NodeLimitFudgeFactor, "out of nodes in coalesce"); |
236 if (C->failing()) return; |
236 if (C->failing()) return; |
237 Block *b = _phc._cfg.get_block(i); |
237 Block *b = _phc._cfg.get_block(i); |
238 uint cnt = b->num_preds(); // Number of inputs to the Phi |
238 uint cnt = b->num_preds(); // Number of inputs to the Phi |
239 |
239 |
240 for( uint l = 1; l<b->_nodes.size(); l++ ) { |
240 for( uint l = 1; l<b->number_of_nodes(); l++ ) { |
241 Node *n = b->_nodes[l]; |
241 Node *n = b->get_node(l); |
242 |
242 |
243 // Do not use removed-copies, use copied value instead |
243 // Do not use removed-copies, use copied value instead |
244 uint ncnt = n->req(); |
244 uint ncnt = n->req(); |
245 for( uint k = 1; k<ncnt; k++ ) { |
245 for( uint k = 1; k<ncnt; k++ ) { |
246 Node *copy = n->in(k); |
246 Node *copy = n->in(k); |
319 // Rematerialize only constants as we do for Phi above. |
319 // Rematerialize only constants as we do for Phi above. |
320 if(m->is_Mach() && m->as_Mach()->is_Con() && |
320 if(m->is_Mach() && m->as_Mach()->is_Con() && |
321 m->as_Mach()->rematerialize()) { |
321 m->as_Mach()->rematerialize()) { |
322 copy = m->clone(); |
322 copy = m->clone(); |
323 // Insert the copy in the basic block, just before us |
323 // Insert the copy in the basic block, just before us |
324 b->_nodes.insert(l++, copy); |
324 b->insert_node(copy, l++); |
325 l += _phc.clone_projs(b, l, m, copy, _phc._lrg_map); |
325 l += _phc.clone_projs(b, l, m, copy, _phc._lrg_map); |
326 } else { |
326 } else { |
327 const RegMask *rm = C->matcher()->idealreg2spillmask[m->ideal_reg()]; |
327 const RegMask *rm = C->matcher()->idealreg2spillmask[m->ideal_reg()]; |
328 copy = new (C) MachSpillCopyNode(m, *rm, *rm); |
328 copy = new (C) MachSpillCopyNode(m, *rm, *rm); |
329 // Insert the copy in the basic block, just before us |
329 // Insert the copy in the basic block, just before us |
330 b->_nodes.insert(l++, copy); |
330 b->insert_node(copy, l++); |
331 } |
331 } |
332 // Insert the copy in the use-def chain |
332 // Insert the copy in the use-def chain |
333 n->set_req(idx, copy); |
333 n->set_req(idx, copy); |
334 // Extend ("register allocate") the names array for the copy. |
334 // Extend ("register allocate") the names array for the copy. |
335 _phc._lrg_map.extend(copy->_idx, name); |
335 _phc._lrg_map.extend(copy->_idx, name); |
374 const RegMask *rm = C->matcher()->idealreg2spillmask[inp->ideal_reg()]; |
374 const RegMask *rm = C->matcher()->idealreg2spillmask[inp->ideal_reg()]; |
375 Node *copy = new (C) MachSpillCopyNode( inp, *rm, *rm ); |
375 Node *copy = new (C) MachSpillCopyNode( inp, *rm, *rm ); |
376 // Insert the copy in the use-def chain |
376 // Insert the copy in the use-def chain |
377 n->set_req(inpidx, copy ); |
377 n->set_req(inpidx, copy ); |
378 // Insert the copy in the basic block, just before us |
378 // Insert the copy in the basic block, just before us |
379 b->_nodes.insert( l++, copy ); |
379 b->insert_node(copy, l++); |
380 // Extend ("register allocate") the names array for the copy. |
380 // Extend ("register allocate") the names array for the copy. |
381 uint max_lrg_id = _phc._lrg_map.max_lrg_id(); |
381 uint max_lrg_id = _phc._lrg_map.max_lrg_id(); |
382 _phc.new_lrg(copy, max_lrg_id); |
382 _phc.new_lrg(copy, max_lrg_id); |
383 _phc._lrg_map.set_max_lrg_id(max_lrg_id + 1); |
383 _phc._lrg_map.set_max_lrg_id(max_lrg_id + 1); |
384 _phc._cfg.map_node_to_block(copy, b); |
384 _phc._cfg.map_node_to_block(copy, b); |
429 while (_phc._cfg.get_block_for_node(bs->pred(j)) != b) { |
429 while (_phc._cfg.get_block_for_node(bs->pred(j)) != b) { |
430 j++; |
430 j++; |
431 } |
431 } |
432 |
432 |
433 // Visit all the Phis in successor block |
433 // Visit all the Phis in successor block |
434 for( uint k = 1; k<bs->_nodes.size(); k++ ) { |
434 for( uint k = 1; k<bs->number_of_nodes(); k++ ) { |
435 Node *n = bs->_nodes[k]; |
435 Node *n = bs->get_node(k); |
436 if( !n->is_Phi() ) break; |
436 if( !n->is_Phi() ) break; |
437 combine_these_two( n, n->in(j) ); |
437 combine_these_two( n, n->in(j) ); |
438 } |
438 } |
439 } // End of for all successor blocks |
439 } // End of for all successor blocks |
440 |
440 |
441 |
441 |
442 // Check _this_ block for 2-address instructions and copies. |
442 // Check _this_ block for 2-address instructions and copies. |
443 uint cnt = b->end_idx(); |
443 uint cnt = b->end_idx(); |
444 for( i = 1; i<cnt; i++ ) { |
444 for( i = 1; i<cnt; i++ ) { |
445 Node *n = b->_nodes[i]; |
445 Node *n = b->get_node(i); |
446 uint idx; |
446 uint idx; |
447 // 2-address instructions have a virtual Copy matching their input |
447 // 2-address instructions have a virtual Copy matching their input |
448 // to their output |
448 // to their output |
449 if (n->is_Mach() && (idx = n->as_Mach()->two_adr())) { |
449 if (n->is_Mach() && (idx = n->as_Mach()->two_adr())) { |
450 MachNode *mach = n->as_Mach(); |
450 MachNode *mach = n->as_Mach(); |
488 // the dst_copy becomes useless. |
488 // the dst_copy becomes useless. |
489 int didx = dst_copy->is_Copy(); |
489 int didx = dst_copy->is_Copy(); |
490 dst_copy->set_req( didx, src_def ); |
490 dst_copy->set_req( didx, src_def ); |
491 // Add copy to free list |
491 // Add copy to free list |
492 // _phc.free_spillcopy(b->_nodes[bindex]); |
492 // _phc.free_spillcopy(b->_nodes[bindex]); |
493 assert( b->_nodes[bindex] == dst_copy, "" ); |
493 assert( b->get_node(bindex) == dst_copy, "" ); |
494 dst_copy->replace_by( dst_copy->in(didx) ); |
494 dst_copy->replace_by( dst_copy->in(didx) ); |
495 dst_copy->set_req( didx, NULL); |
495 dst_copy->set_req( didx, NULL); |
496 b->_nodes.remove(bindex); |
496 b->remove_node(bindex); |
497 if( bindex < b->_ihrp_index ) b->_ihrp_index--; |
497 if( bindex < b->_ihrp_index ) b->_ihrp_index--; |
498 if( bindex < b->_fhrp_index ) b->_fhrp_index--; |
498 if( bindex < b->_fhrp_index ) b->_fhrp_index--; |
499 |
499 |
500 // Stretched lr1; add it to liveness of intermediate blocks |
500 // Stretched lr1; add it to liveness of intermediate blocks |
501 Block *b2 = _phc._cfg.get_block_for_node(src_copy); |
501 Block *b2 = _phc._cfg.get_block_for_node(src_copy); |
521 assert( b2->num_preds() == 2, "cannot double coalesce across c-flow" ); |
521 assert( b2->num_preds() == 2, "cannot double coalesce across c-flow" ); |
522 b2 = _phc._cfg.get_block_for_node(b2->pred(1)); |
522 b2 = _phc._cfg.get_block_for_node(b2->pred(1)); |
523 bindex2 = b2->end_idx()-1; |
523 bindex2 = b2->end_idx()-1; |
524 } |
524 } |
525 // Get prior instruction |
525 // Get prior instruction |
526 assert(bindex2 < b2->_nodes.size(), "index out of bounds"); |
526 assert(bindex2 < b2->number_of_nodes(), "index out of bounds"); |
527 Node *x = b2->_nodes[bindex2]; |
527 Node *x = b2->get_node(bindex2); |
528 if( x == prev_copy ) { // Previous copy in copy chain? |
528 if( x == prev_copy ) { // Previous copy in copy chain? |
529 if( prev_copy == src_copy)// Found end of chain and all interferences |
529 if( prev_copy == src_copy)// Found end of chain and all interferences |
530 break; // So break out of loop |
530 break; // So break out of loop |
531 // Else work back one in copy chain |
531 // Else work back one in copy chain |
532 prev_copy = prev_copy->in(prev_copy->is_Copy()); |
532 prev_copy = prev_copy->in(prev_copy->is_Copy()); |
774 } |
774 } |
775 // Check this block for copies. |
775 // Check this block for copies. |
776 for( uint i = 1; i<b->end_idx(); i++ ) { |
776 for( uint i = 1; i<b->end_idx(); i++ ) { |
777 // Check for actual copies on inputs. Coalesce a copy into its |
777 // Check for actual copies on inputs. Coalesce a copy into its |
778 // input if use and copy's input are compatible. |
778 // input if use and copy's input are compatible. |
779 Node *copy1 = b->_nodes[i]; |
779 Node *copy1 = b->get_node(i); |
780 uint idx1 = copy1->is_Copy(); |
780 uint idx1 = copy1->is_Copy(); |
781 if( !idx1 ) continue; // Not a copy |
781 if( !idx1 ) continue; // Not a copy |
782 |
782 |
783 if( copy_copy(copy1,copy1,b,i) ) { |
783 if( copy_copy(copy1,copy1,b,i) ) { |
784 i--; // Retry, same location in block |
784 i--; // Retry, same location in block |