hotspot/src/share/vm/opto/ifg.cpp
changeset 22838 82c7497fbad4
parent 20704 b689a120e974
child 22234 da823d78ad65
equal deleted inserted replaced
22837:feba5d4126b8 22838:82c7497fbad4
   317     // (and removes it from the live-ness set) that value is certainly live.
   317     // (and removes it from the live-ness set) that value is certainly live.
   318     // The defined value interferes with everything currently live.  The
   318     // The defined value interferes with everything currently live.  The
   319     // value is then removed from the live-ness set and it's inputs are
   319     // value is then removed from the live-ness set and it's inputs are
   320     // added to the live-ness set.
   320     // added to the live-ness set.
   321     for (uint j = block->end_idx() + 1; j > 1; j--) {
   321     for (uint j = block->end_idx() + 1; j > 1; j--) {
   322       Node* n = block->_nodes[j - 1];
   322       Node* n = block->get_node(j - 1);
   323 
   323 
   324       // Get value being defined
   324       // Get value being defined
   325       uint r = _lrg_map.live_range_id(n);
   325       uint r = _lrg_map.live_range_id(n);
   326 
   326 
   327       // Some special values do not allocate
   327       // Some special values do not allocate
   454     IndexSet liveout(_live->live(block));
   454     IndexSet liveout(_live->live(block));
   455     uint last_inst = block->end_idx();
   455     uint last_inst = block->end_idx();
   456     // Compute first nonphi node index
   456     // Compute first nonphi node index
   457     uint first_inst;
   457     uint first_inst;
   458     for (first_inst = 1; first_inst < last_inst; first_inst++) {
   458     for (first_inst = 1; first_inst < last_inst; first_inst++) {
   459       if (!block->_nodes[first_inst]->is_Phi()) {
   459       if (!block->get_node(first_inst)->is_Phi()) {
   460         break;
   460         break;
   461       }
   461       }
   462     }
   462     }
   463 
   463 
   464     // Spills could be inserted before CreateEx node which should be
   464     // Spills could be inserted before CreateEx node which should be
   465     // first instruction in block after Phis. Move CreateEx up.
   465     // first instruction in block after Phis. Move CreateEx up.
   466     for (uint insidx = first_inst; insidx < last_inst; insidx++) {
   466     for (uint insidx = first_inst; insidx < last_inst; insidx++) {
   467       Node *ex = block->_nodes[insidx];
   467       Node *ex = block->get_node(insidx);
   468       if (ex->is_SpillCopy()) {
   468       if (ex->is_SpillCopy()) {
   469         continue;
   469         continue;
   470       }
   470       }
   471       if (insidx > first_inst && ex->is_Mach() && ex->as_Mach()->ideal_Opcode() == Op_CreateEx) {
   471       if (insidx > first_inst && ex->is_Mach() && ex->as_Mach()->ideal_Opcode() == Op_CreateEx) {
   472         // If the CreateEx isn't above all the MachSpillCopies
   472         // If the CreateEx isn't above all the MachSpillCopies
   473         // then move it to the top.
   473         // then move it to the top.
   474         block->_nodes.remove(insidx);
   474         block->remove_node(insidx);
   475         block->_nodes.insert(first_inst, ex);
   475         block->insert_node(ex, first_inst);
   476       }
   476       }
   477       // Stop once a CreateEx or any other node is found
   477       // Stop once a CreateEx or any other node is found
   478       break;
   478       break;
   479     }
   479     }
   480 
   480 
   521     // The defined value interferes with everything currently live.  The
   521     // The defined value interferes with everything currently live.  The
   522     // value is then removed from the live-ness set and it's inputs are added
   522     // value is then removed from the live-ness set and it's inputs are added
   523     // to the live-ness set.
   523     // to the live-ness set.
   524     uint j;
   524     uint j;
   525     for (j = last_inst + 1; j > 1; j--) {
   525     for (j = last_inst + 1; j > 1; j--) {
   526       Node* n = block->_nodes[j - 1];
   526       Node* n = block->get_node(j - 1);
   527 
   527 
   528       // Get value being defined
   528       // Get value being defined
   529       uint r = _lrg_map.live_range_id(n);
   529       uint r = _lrg_map.live_range_id(n);
   530 
   530 
   531       // Some special values do not allocate
   531       // Some special values do not allocate
   539         if( !liveout.member(r) && n->Opcode() != Op_SafePoint ) {
   539         if( !liveout.member(r) && n->Opcode() != Op_SafePoint ) {
   540           Node *def = n->in(0);
   540           Node *def = n->in(0);
   541           if( !n->is_Proj() ||
   541           if( !n->is_Proj() ||
   542               // Could also be a flags-projection of a dead ADD or such.
   542               // Could also be a flags-projection of a dead ADD or such.
   543               (_lrg_map.live_range_id(def) && !liveout.member(_lrg_map.live_range_id(def)))) {
   543               (_lrg_map.live_range_id(def) && !liveout.member(_lrg_map.live_range_id(def)))) {
   544             block->_nodes.remove(j - 1);
   544             block->remove_node(j - 1);
   545             if (lrgs(r)._def == n) {
   545             if (lrgs(r)._def == n) {
   546               lrgs(r)._def = 0;
   546               lrgs(r)._def = 0;
   547             }
   547             }
   548             n->disconnect_inputs(NULL, C);
   548             n->disconnect_inputs(NULL, C);
   549             _cfg.unmap_node_from_block(n);
   549             _cfg.unmap_node_from_block(n);
   603 
   603 
   604             // Find first non SpillCopy 'm' that follows the current instruction
   604             // Find first non SpillCopy 'm' that follows the current instruction
   605             // (j - 1) is index for current instruction 'n'
   605             // (j - 1) is index for current instruction 'n'
   606             Node *m = n;
   606             Node *m = n;
   607             for (uint i = j; i <= last_inst && m->is_SpillCopy(); ++i) {
   607             for (uint i = j; i <= last_inst && m->is_SpillCopy(); ++i) {
   608               m = block->_nodes[i];
   608               m = block->get_node(i);
   609             }
   609             }
   610             if (m == single_use) {
   610             if (m == single_use) {
   611               lrgs(r)._area = 0.0;
   611               lrgs(r)._area = 0.0;
   612             }
   612             }
   613           }
   613           }
   675               lrg.SUBTRACT( rmask );
   675               lrg.SUBTRACT( rmask );
   676               lrg.compute_set_mask_size();
   676               lrg.compute_set_mask_size();
   677             } else {            // Common case: size 1 bound removal
   677             } else {            // Common case: size 1 bound removal
   678               if( lrg.mask().Member(r_reg) ) {
   678               if( lrg.mask().Member(r_reg) ) {
   679                 lrg.Remove(r_reg);
   679                 lrg.Remove(r_reg);
   680                 lrg.set_mask_size(lrg.mask().is_AllStack() ? 65535:old_size-1);
   680                 lrg.set_mask_size(lrg.mask().is_AllStack() ? LRG::AllStack_size : old_size - 1);
   681               }
   681               }
   682             }
   682             }
   683             // If 'l' goes completely dry, it must spill.
   683             // If 'l' goes completely dry, it must spill.
   684             if( lrg.not_free() ) {
   684             if( lrg.not_free() ) {
   685               // Give 'l' some kind of reasonable mask, so he picks up
   685               // Give 'l' some kind of reasonable mask, so he picks up
   770       }
   770       }
   771     }
   771     }
   772 
   772 
   773     // Compute high pressure indice; avoid landing in the middle of projnodes
   773     // Compute high pressure indice; avoid landing in the middle of projnodes
   774     j = hrp_index[0];
   774     j = hrp_index[0];
   775     if (j < block->_nodes.size() && j < block->end_idx() + 1) {
   775     if (j < block->number_of_nodes() && j < block->end_idx() + 1) {
   776       Node* cur = block->_nodes[j];
   776       Node* cur = block->get_node(j);
   777       while (cur->is_Proj() || (cur->is_MachNullCheck()) || cur->is_Catch()) {
   777       while (cur->is_Proj() || (cur->is_MachNullCheck()) || cur->is_Catch()) {
   778         j--;
   778         j--;
   779         cur = block->_nodes[j];
   779         cur = block->get_node(j);
   780       }
   780       }
   781     }
   781     }
   782     block->_ihrp_index = j;
   782     block->_ihrp_index = j;
   783     j = hrp_index[1];
   783     j = hrp_index[1];
   784     if (j < block->_nodes.size() && j < block->end_idx() + 1) {
   784     if (j < block->number_of_nodes() && j < block->end_idx() + 1) {
   785       Node* cur = block->_nodes[j];
   785       Node* cur = block->get_node(j);
   786       while (cur->is_Proj() || (cur->is_MachNullCheck()) || cur->is_Catch()) {
   786       while (cur->is_Proj() || (cur->is_MachNullCheck()) || cur->is_Catch()) {
   787         j--;
   787         j--;
   788         cur = block->_nodes[j];
   788         cur = block->get_node(j);
   789       }
   789       }
   790     }
   790     }
   791     block->_fhrp_index = j;
   791     block->_fhrp_index = j;
   792 
   792 
   793 #ifndef PRODUCT
   793 #ifndef PRODUCT