comparison src/share/vm/opto/chaitin.cpp @ 14909:4ca6dc0799b6

Backout jdk9 merge
author Gilles Duboscq <duboscq@ssw.jku.at>
date Tue, 01 Apr 2014 13:57:07 +0200
parents 1077c8270209
children 042b5e9aeb76
comparison
equal deleted inserted replaced
14908:8db6e76cb658 14909:4ca6dc0799b6
208 , _trace_spilling(TraceSpilling || C->method_has_option("TraceSpilling")) 208 , _trace_spilling(TraceSpilling || C->method_has_option("TraceSpilling"))
209 #endif 209 #endif
210 { 210 {
211 NOT_PRODUCT( Compile::TracePhase t3("ctorChaitin", &_t_ctorChaitin, TimeCompiler); ) 211 NOT_PRODUCT( Compile::TracePhase t3("ctorChaitin", &_t_ctorChaitin, TimeCompiler); )
212 212
213 _high_frequency_lrg = MIN2(double(OPTO_LRG_HIGH_FREQ), _cfg.get_outer_loop_frequency()); 213 _high_frequency_lrg = MIN2(float(OPTO_LRG_HIGH_FREQ), _cfg.get_outer_loop_frequency());
214 214
215 // Build a list of basic blocks, sorted by frequency 215 // Build a list of basic blocks, sorted by frequency
216 _blks = NEW_RESOURCE_ARRAY(Block *, _cfg.number_of_blocks()); 216 _blks = NEW_RESOURCE_ARRAY(Block *, _cfg.number_of_blocks());
217 // Experiment with sorting strategies to speed compilation 217 // Experiment with sorting strategies to speed compilation
218 double cutoff = BLOCK_FREQUENCY(1.0); // Cutoff for high frequency bucket 218 double cutoff = BLOCK_FREQUENCY(1.0); // Cutoff for high frequency bucket
759 // Check for vector live range (only if vector register is used). 759 // Check for vector live range (only if vector register is used).
760 // On SPARC vector uses RegD which could be misaligned so it is not 760 // On SPARC vector uses RegD which could be misaligned so it is not
761 // processes as vector in RA. 761 // processes as vector in RA.
762 if (RegMask::is_vector(ireg)) 762 if (RegMask::is_vector(ireg))
763 lrg._is_vector = 1; 763 lrg._is_vector = 1;
764 assert(n_type->isa_vect() == NULL || lrg._is_vector || ireg == Op_RegD || ireg == Op_RegL, 764 assert(n_type->isa_vect() == NULL || lrg._is_vector || ireg == Op_RegD,
765 "vector must be in vector registers"); 765 "vector must be in vector registers");
766 766
767 // Check for bound register masks 767 // Check for bound register masks
768 const RegMask &lrgmask = lrg.mask(); 768 const RegMask &lrgmask = lrg.mask();
769 if (lrgmask.is_bound(ireg)) { 769 if (lrgmask.is_bound(ireg)) {
959 // Check for bound register masks 959 // Check for bound register masks
960 const RegMask &lrgmask = lrg.mask(); 960 const RegMask &lrgmask = lrg.mask();
961 int kreg = n->in(k)->ideal_reg(); 961 int kreg = n->in(k)->ideal_reg();
962 bool is_vect = RegMask::is_vector(kreg); 962 bool is_vect = RegMask::is_vector(kreg);
963 assert(n->in(k)->bottom_type()->isa_vect() == NULL || 963 assert(n->in(k)->bottom_type()->isa_vect() == NULL ||
964 is_vect || kreg == Op_RegD || kreg == Op_RegL, 964 is_vect || kreg == Op_RegD,
965 "vector must be in vector registers"); 965 "vector must be in vector registers");
966 if (lrgmask.is_bound(kreg)) 966 if (lrgmask.is_bound(kreg))
967 lrg._is_bound = 1; 967 lrg._is_bound = 1;
968 968
969 // If this use of a double forces a mis-aligned double, 969 // If this use of a double forces a mis-aligned double,
1680 // Initialize it once and make it shared: 1680 // Initialize it once and make it shared:
1681 // set control to _root and place it into Start block 1681 // set control to _root and place it into Start block
1682 // (where top() node is placed). 1682 // (where top() node is placed).
1683 base->init_req(0, _cfg.get_root_node()); 1683 base->init_req(0, _cfg.get_root_node());
1684 Block *startb = _cfg.get_block_for_node(C->top()); 1684 Block *startb = _cfg.get_block_for_node(C->top());
1685 uint node_pos = startb->find_node(C->top()); 1685 startb->insert_node(base, startb->find_node(C->top()));
1686 startb->insert_node(base, node_pos);
1687 _cfg.map_node_to_block(base, startb); 1686 _cfg.map_node_to_block(base, startb);
1688 assert(_lrg_map.live_range_id(base) == 0, "should not have LRG yet"); 1687 assert(_lrg_map.live_range_id(base) == 0, "should not have LRG yet");
1689
1690 // The loadConP0 might have projection nodes depending on architecture
1691 // Add the projection nodes to the CFG
1692 for (DUIterator_Fast imax, i = base->fast_outs(imax); i < imax; i++) {
1693 Node* use = base->fast_out(i);
1694 if (use->is_MachProj()) {
1695 startb->insert_node(use, ++node_pos);
1696 _cfg.map_node_to_block(use, startb);
1697 new_lrg(use, maxlrg++);
1698 }
1699 }
1700 } 1688 }
1701 if (_lrg_map.live_range_id(base) == 0) { 1689 if (_lrg_map.live_range_id(base) == 0) {
1702 new_lrg(base, maxlrg++); 1690 new_lrg(base, maxlrg++);
1703 } 1691 }
1704 assert(base->in(0) == _cfg.get_root_node() && _cfg.get_block_for_node(base) == _cfg.get_block_for_node(C->top()), "base NULL should be shared"); 1692 assert(base->in(0) == _cfg.get_root_node() && _cfg.get_block_for_node(base) == _cfg.get_block_for_node(C->top()), "base NULL should be shared");
1797 Node *phi = n->in(1); 1785 Node *phi = n->in(1);
1798 if( phi->is_Phi() && phi->as_Phi()->region()->is_Loop() ) { 1786 if( phi->is_Phi() && phi->as_Phi()->region()->is_Loop() ) {
1799 Block *phi_block = _cfg.get_block_for_node(phi); 1787 Block *phi_block = _cfg.get_block_for_node(phi);
1800 if (_cfg.get_block_for_node(phi_block->pred(2)) == block) { 1788 if (_cfg.get_block_for_node(phi_block->pred(2)) == block) {
1801 const RegMask *mask = C->matcher()->idealreg2spillmask[Op_RegI]; 1789 const RegMask *mask = C->matcher()->idealreg2spillmask[Op_RegI];
1802 Node *spill = new (C) MachSpillCopyNode(MachSpillCopyNode::LoopPhiInput, phi, *mask, *mask); 1790 Node *spill = new (C) MachSpillCopyNode( phi, *mask, *mask );
1803 insert_proj( phi_block, 1, spill, maxlrg++ ); 1791 insert_proj( phi_block, 1, spill, maxlrg++ );
1804 n->set_req(1,spill); 1792 n->set_req(1,spill);
1805 must_recompute_live = true; 1793 must_recompute_live = true;
1806 } 1794 }
1807 } 1795 }