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 }
|