src/share/vm/opto/postaloc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/share/vm/opto

src/share/vm/opto/postaloc.cpp

Print this page




 411 
 412 int PhaseChaitin::possibly_merge_multidef(Node *n, uint k, Block *block, RegToDefUseMap& reg2defuse) {
 413   int blk_adjust = 0;
 414 
 415   uint lrg = _lrg_map.live_range_id(n->in(k));
 416   if (lrg > 0 && lrgs(lrg).is_multidef()) {
 417     OptoReg::Name reg = lrgs(lrg).reg();
 418 
 419     Node* def = reg2defuse.at(reg).def();
 420     if (def != NULL && lrg == _lrg_map.live_range_id(def) && def != n->in(k)) {
 421       // Same lrg but different node, we have to merge.
 422       MachMergeNode* merge;
 423       if (def->is_MachMerge()) { // is it already a merge?
 424         merge = def->as_MachMerge();
 425       } else {
 426         merge = new MachMergeNode(def);
 427 
 428         // Insert the merge node into the block before the first use.
 429         uint use_index = block->find_node(reg2defuse.at(reg).first_use());
 430         block->insert_node(merge, use_index++);

 431 
 432         // Let the allocator know about the new node, use the same lrg
 433         _lrg_map.extend(merge->_idx, lrg);
 434         blk_adjust++;
 435 
 436         // Fixup all the uses (there is at least one) that happened between the first
 437         // use and before the current one.
 438         for (; use_index < block->number_of_nodes(); use_index++) {
 439           Node* use = block->get_node(use_index);
 440           if (use == n) {
 441             break;
 442           }
 443           use->replace_edge(def, merge);
 444         }
 445       }
 446       if (merge->find_edge(n->in(k)) == -1) {
 447         merge->add_req(n->in(k));
 448       }
 449       n->set_req(k, merge);
 450     }




 411 
 412 int PhaseChaitin::possibly_merge_multidef(Node *n, uint k, Block *block, RegToDefUseMap& reg2defuse) {
 413   int blk_adjust = 0;
 414 
 415   uint lrg = _lrg_map.live_range_id(n->in(k));
 416   if (lrg > 0 && lrgs(lrg).is_multidef()) {
 417     OptoReg::Name reg = lrgs(lrg).reg();
 418 
 419     Node* def = reg2defuse.at(reg).def();
 420     if (def != NULL && lrg == _lrg_map.live_range_id(def) && def != n->in(k)) {
 421       // Same lrg but different node, we have to merge.
 422       MachMergeNode* merge;
 423       if (def->is_MachMerge()) { // is it already a merge?
 424         merge = def->as_MachMerge();
 425       } else {
 426         merge = new MachMergeNode(def);
 427 
 428         // Insert the merge node into the block before the first use.
 429         uint use_index = block->find_node(reg2defuse.at(reg).first_use());
 430         block->insert_node(merge, use_index++);
 431         _cfg.map_node_to_block(merge, block);
 432 
 433         // Let the allocator know about the new node, use the same lrg
 434         _lrg_map.extend(merge->_idx, lrg);
 435         blk_adjust++;
 436 
 437         // Fixup all the uses (there is at least one) that happened between the first
 438         // use and before the current one.
 439         for (; use_index < block->number_of_nodes(); use_index++) {
 440           Node* use = block->get_node(use_index);
 441           if (use == n) {
 442             break;
 443           }
 444           use->replace_edge(def, merge);
 445         }
 446       }
 447       if (merge->find_edge(n->in(k)) == -1) {
 448         merge->add_req(n->in(k));
 449       }
 450       n->set_req(k, merge);
 451     }


src/share/vm/opto/postaloc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File