664 return yank_if_dead(old, current_block, &value, ®nd); 665 } 666 667 int yank_if_dead( Node *old, Block *current_block, Node_List *value, Node_List *regnd ) { 668 return yank_if_dead_recurse(old, old, current_block, value, regnd); 669 } 670 int yank_if_dead_recurse(Node *old, Node *orig_old, Block *current_block, 671 Node_List *value, Node_List *regnd); 672 int yank( Node *old, Block *current_block, Node_List *value, Node_List *regnd ); 673 int elide_copy( Node *n, int k, Block *current_block, Node_List &value, Node_List ®nd, bool can_change_regs ); 674 int use_prior_register( Node *copy, uint idx, Node *def, Block *current_block, Node_List &value, Node_List ®nd ); 675 bool may_be_copy_of_callee( Node *def ) const; 676 677 // If nreg already contains the same constant as val then eliminate it 678 bool eliminate_copy_of_constant(Node* val, Node* n, 679 Block *current_block, Node_List& value, Node_List ®nd, 680 OptoReg::Name nreg, OptoReg::Name nreg2); 681 // Extend the node to LRG mapping 682 void add_reference( const Node *node, const Node *old_node); 683 684 private: 685 686 static int _final_loads, _final_stores, _final_copies, _final_memoves; 687 static double _final_load_cost, _final_store_cost, _final_copy_cost, _final_memove_cost; 688 static int _conserv_coalesce, _conserv_coalesce_pair; 689 static int _conserv_coalesce_trie, _conserv_coalesce_quad; 690 static int _post_alloc; 691 static int _lost_opp_pp_coalesce, _lost_opp_cflow_coalesce; 692 static int _used_cisc_instructions, _unused_cisc_instructions; 693 static int _allocator_attempts, _allocator_successes; 694 695 #ifndef PRODUCT 696 static uint _high_pressure, _low_pressure; 697 698 void dump() const; 699 void dump( const Node *n ) const; 700 void dump( const Block * b ) const; 701 void dump_degree_lists() const; 702 void dump_simplified() const; 703 void dump_lrg( uint lidx, bool defs_only) const; | 664 return yank_if_dead(old, current_block, &value, ®nd); 665 } 666 667 int yank_if_dead( Node *old, Block *current_block, Node_List *value, Node_List *regnd ) { 668 return yank_if_dead_recurse(old, old, current_block, value, regnd); 669 } 670 int yank_if_dead_recurse(Node *old, Node *orig_old, Block *current_block, 671 Node_List *value, Node_List *regnd); 672 int yank( Node *old, Block *current_block, Node_List *value, Node_List *regnd ); 673 int elide_copy( Node *n, int k, Block *current_block, Node_List &value, Node_List ®nd, bool can_change_regs ); 674 int use_prior_register( Node *copy, uint idx, Node *def, Block *current_block, Node_List &value, Node_List ®nd ); 675 bool may_be_copy_of_callee( Node *def ) const; 676 677 // If nreg already contains the same constant as val then eliminate it 678 bool eliminate_copy_of_constant(Node* val, Node* n, 679 Block *current_block, Node_List& value, Node_List ®nd, 680 OptoReg::Name nreg, OptoReg::Name nreg2); 681 // Extend the node to LRG mapping 682 void add_reference( const Node *node, const Node *old_node); 683 684 // Record the first use of a def in the block for a register. 685 class RegDefUse { 686 Node* _def; 687 Node* _first_use; 688 public: 689 RegDefUse() : _def(NULL), _first_use(NULL) { } 690 Node* def() const { return _def; } 691 Node* first_use() const { return _first_use; } 692 693 void update(Node* def, Node* use) { 694 if (_def != def) { 695 _def = def; 696 _first_use = use; 697 } 698 } 699 void clear() { 700 _def = NULL; 701 _first_use = NULL; 702 } 703 }; 704 typedef GrowableArray<RegDefUse> RegToDefUseMap; 705 int possibly_merge_multidef(Node *n, uint k, Block *block, RegToDefUseMap& reg2defuse); 706 707 // Merge nodes that are a part of a multidef lrg and produce the same value within a block. 708 void merge_multidefs(); 709 710 private: 711 712 static int _final_loads, _final_stores, _final_copies, _final_memoves; 713 static double _final_load_cost, _final_store_cost, _final_copy_cost, _final_memove_cost; 714 static int _conserv_coalesce, _conserv_coalesce_pair; 715 static int _conserv_coalesce_trie, _conserv_coalesce_quad; 716 static int _post_alloc; 717 static int _lost_opp_pp_coalesce, _lost_opp_cflow_coalesce; 718 static int _used_cisc_instructions, _unused_cisc_instructions; 719 static int _allocator_attempts, _allocator_successes; 720 721 #ifndef PRODUCT 722 static uint _high_pressure, _low_pressure; 723 724 void dump() const; 725 void dump( const Node *n ) const; 726 void dump( const Block * b ) const; 727 void dump_degree_lists() const; 728 void dump_simplified() const; 729 void dump_lrg( uint lidx, bool defs_only) const; |