603 uint new_pressure = current_pressure() + fatproj_mask.Size();
604 if (new_pressure > final_pressure()) {
605 _final_pressure = new_pressure;
606 }
607
608 // if we were at a low pressure and now and the fat proj is at high pressure, record the fat proj location
609 // as coming from a low to high (to low again)
610 if (current_pressure() <= high_pressure_limit() && new_pressure > high_pressure_limit()) {
611 _high_pressure_index = fatproj_location;
612 }
613 }
614
615 Pressure(uint high_pressure_index, uint high_pressure_limit)
616 : _current_pressure(0)
617 , _high_pressure_index(high_pressure_index)
618 , _final_pressure(0)
619 , _high_pressure_limit(high_pressure_limit)
620 , _start_pressure(0) {}
621 };
622
623 void check_for_high_pressure_transition_at_fatproj(uint& block_reg_pressure, uint location, LRG& lrg, Pressure& pressure, const int op_regtype);
624 void add_input_to_liveout(Block* b, Node* n, IndexSet* liveout, double cost, Pressure& int_pressure, Pressure& float_pressure);
625 void compute_initial_block_pressure(Block* b, IndexSet* liveout, Pressure& int_pressure, Pressure& float_pressure, double cost);
626 bool remove_node_if_not_used(Block* b, uint location, Node* n, uint lid, IndexSet* liveout);
627 void assign_high_score_to_immediate_copies(Block* b, Node* n, LRG& lrg, uint next_inst, uint last_inst);
628 void remove_interference_from_copy(Block* b, uint location, uint lid_copy, IndexSet* liveout, double cost, Pressure& int_pressure, Pressure& float_pressure);
629 void remove_bound_register_from_interfering_live_ranges(LRG& lrg, IndexSet* liveout, uint& must_spill);
630 void check_for_high_pressure_block(Pressure& pressure);
631 void adjust_high_pressure_index(Block* b, uint& hrp_index, Pressure& pressure);
632
633 // Build the interference graph using physical registers when available.
634 // That is, if 2 live ranges are simultaneously alive but in their
635 // acceptable register sets do not overlap, then they do not interfere.
636 uint build_ifg_physical( ResourceArea *a );
637
638 public:
639 // Gather LiveRanGe information, including register masks and base pointer/
640 // derived pointer relationships.
641 void gather_lrg_masks( bool mod_cisc_masks );
642
643 // user visible pressure variables for scheduling
|
603 uint new_pressure = current_pressure() + fatproj_mask.Size();
604 if (new_pressure > final_pressure()) {
605 _final_pressure = new_pressure;
606 }
607
608 // if we were at a low pressure and now and the fat proj is at high pressure, record the fat proj location
609 // as coming from a low to high (to low again)
610 if (current_pressure() <= high_pressure_limit() && new_pressure > high_pressure_limit()) {
611 _high_pressure_index = fatproj_location;
612 }
613 }
614
615 Pressure(uint high_pressure_index, uint high_pressure_limit)
616 : _current_pressure(0)
617 , _high_pressure_index(high_pressure_index)
618 , _final_pressure(0)
619 , _high_pressure_limit(high_pressure_limit)
620 , _start_pressure(0) {}
621 };
622
623 void check_for_high_pressure_transition_at_fatproj(uint& block_reg_pressure, uint location, LRG& lrg, Pressure& pressure, const Opcodes op_regtype);
624 void add_input_to_liveout(Block* b, Node* n, IndexSet* liveout, double cost, Pressure& int_pressure, Pressure& float_pressure);
625 void compute_initial_block_pressure(Block* b, IndexSet* liveout, Pressure& int_pressure, Pressure& float_pressure, double cost);
626 bool remove_node_if_not_used(Block* b, uint location, Node* n, uint lid, IndexSet* liveout);
627 void assign_high_score_to_immediate_copies(Block* b, Node* n, LRG& lrg, uint next_inst, uint last_inst);
628 void remove_interference_from_copy(Block* b, uint location, uint lid_copy, IndexSet* liveout, double cost, Pressure& int_pressure, Pressure& float_pressure);
629 void remove_bound_register_from_interfering_live_ranges(LRG& lrg, IndexSet* liveout, uint& must_spill);
630 void check_for_high_pressure_block(Pressure& pressure);
631 void adjust_high_pressure_index(Block* b, uint& hrp_index, Pressure& pressure);
632
633 // Build the interference graph using physical registers when available.
634 // That is, if 2 live ranges are simultaneously alive but in their
635 // acceptable register sets do not overlap, then they do not interfere.
636 uint build_ifg_physical( ResourceArea *a );
637
638 public:
639 // Gather LiveRanGe information, including register masks and base pointer/
640 // derived pointer relationships.
641 void gather_lrg_masks( bool mod_cisc_masks );
642
643 // user visible pressure variables for scheduling
|