hotspot/src/share/vm/opto/coalesce.cpp
changeset 19717 7819ffdaf0ff
parent 19334 3aa9ca404965
child 19721 8ecbb2cdc965
equal deleted inserted replaced
19711:95cc0162a92d 19717:7819ffdaf0ff
    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);
   258       if( cidx ) {
   258       if( cidx ) {
   259         Node *def = n->in(cidx);
   259         Node *def = n->in(cidx);
   260         if (_phc._lrg_map.find(n) == _phc._lrg_map.find(def)) {
   260         if (_phc._lrg_map.find(n) == _phc._lrg_map.find(def)) {
   261           n->replace_by(def);
   261           n->replace_by(def);
   262           n->set_req(cidx,NULL);
   262           n->set_req(cidx,NULL);
   263           b->_nodes.remove(l);
   263           b->remove_node(l);
   264           l--;
   264           l--;
   265           continue;
   265           continue;
   266         }
   266         }
   267       }
   267       }
   268 
   268 
   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