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 |