comparison src/share/vm/opto/compile.cpp @ 2445:08eb13460b3a

7004535: Clone loop predicate during loop unswitch Summary: Clone loop predicate for clonned loops Reviewed-by: never
author kvn
date Sat, 02 Apr 2011 10:54:15 -0700
parents 7e88bdae86ec
children 5d046bf49ce7
comparison
equal deleted inserted replaced
2444:07acc51c1d2a 2445:08eb13460b3a
1630 Node * n = predicate_opaque1_node(i-1); 1630 Node * n = predicate_opaque1_node(i-1);
1631 assert(n->Opcode() == Op_Opaque1, "must be"); 1631 assert(n->Opcode() == Op_Opaque1, "must be");
1632 igvn.replace_node(n, n->in(1)); 1632 igvn.replace_node(n, n->in(1));
1633 } 1633 }
1634 assert(predicate_count()==0, "should be clean!"); 1634 assert(predicate_count()==0, "should be clean!");
1635 igvn.optimize();
1636 } 1635 }
1637 1636
1638 //------------------------------Optimize--------------------------------------- 1637 //------------------------------Optimize---------------------------------------
1639 // Given a graph, optimize it. 1638 // Given a graph, optimize it.
1640 void Compile::Optimize() { 1639 void Compile::Optimize() {
1687 // Set loop opts counter 1686 // Set loop opts counter
1688 loop_opts_cnt = num_loop_opts(); 1687 loop_opts_cnt = num_loop_opts();
1689 if((loop_opts_cnt > 0) && (has_loops() || has_split_ifs())) { 1688 if((loop_opts_cnt > 0) && (has_loops() || has_split_ifs())) {
1690 { 1689 {
1691 TracePhase t2("idealLoop", &_t_idealLoop, true); 1690 TracePhase t2("idealLoop", &_t_idealLoop, true);
1692 PhaseIdealLoop ideal_loop( igvn, true, UseLoopPredicate); 1691 PhaseIdealLoop ideal_loop( igvn, true );
1693 loop_opts_cnt--; 1692 loop_opts_cnt--;
1694 if (major_progress()) print_method("PhaseIdealLoop 1", 2); 1693 if (major_progress()) print_method("PhaseIdealLoop 1", 2);
1695 if (failing()) return; 1694 if (failing()) return;
1696 } 1695 }
1697 // Loop opts pass if partial peeling occurred in previous pass 1696 // Loop opts pass if partial peeling occurred in previous pass
1698 if(PartialPeelLoop && major_progress() && (loop_opts_cnt > 0)) { 1697 if(PartialPeelLoop && major_progress() && (loop_opts_cnt > 0)) {
1699 TracePhase t3("idealLoop", &_t_idealLoop, true); 1698 TracePhase t3("idealLoop", &_t_idealLoop, true);
1700 PhaseIdealLoop ideal_loop( igvn, false, UseLoopPredicate); 1699 PhaseIdealLoop ideal_loop( igvn, false );
1701 loop_opts_cnt--; 1700 loop_opts_cnt--;
1702 if (major_progress()) print_method("PhaseIdealLoop 2", 2); 1701 if (major_progress()) print_method("PhaseIdealLoop 2", 2);
1703 if (failing()) return; 1702 if (failing()) return;
1704 } 1703 }
1705 // Loop opts pass for loop-unrolling before CCP 1704 // Loop opts pass for loop-unrolling before CCP
1706 if(major_progress() && (loop_opts_cnt > 0)) { 1705 if(major_progress() && (loop_opts_cnt > 0)) {
1707 TracePhase t4("idealLoop", &_t_idealLoop, true); 1706 TracePhase t4("idealLoop", &_t_idealLoop, true);
1708 PhaseIdealLoop ideal_loop( igvn, false, UseLoopPredicate); 1707 PhaseIdealLoop ideal_loop( igvn, false );
1709 loop_opts_cnt--; 1708 loop_opts_cnt--;
1710 if (major_progress()) print_method("PhaseIdealLoop 3", 2); 1709 if (major_progress()) print_method("PhaseIdealLoop 3", 2);
1711 } 1710 }
1712 if (!failing()) { 1711 if (!failing()) {
1713 // Verify that last round of loop opts produced a valid graph 1712 // Verify that last round of loop opts produced a valid graph
1741 1740
1742 // Loop transforms on the ideal graph. Range Check Elimination, 1741 // Loop transforms on the ideal graph. Range Check Elimination,
1743 // peeling, unrolling, etc. 1742 // peeling, unrolling, etc.
1744 if(loop_opts_cnt > 0) { 1743 if(loop_opts_cnt > 0) {
1745 debug_only( int cnt = 0; ); 1744 debug_only( int cnt = 0; );
1746 bool loop_predication = UseLoopPredicate;
1747 while(major_progress() && (loop_opts_cnt > 0)) { 1745 while(major_progress() && (loop_opts_cnt > 0)) {
1748 TracePhase t2("idealLoop", &_t_idealLoop, true); 1746 TracePhase t2("idealLoop", &_t_idealLoop, true);
1749 assert( cnt++ < 40, "infinite cycle in loop optimization" ); 1747 assert( cnt++ < 40, "infinite cycle in loop optimization" );
1750 PhaseIdealLoop ideal_loop( igvn, true, loop_predication); 1748 PhaseIdealLoop ideal_loop( igvn, true);
1751 loop_opts_cnt--; 1749 loop_opts_cnt--;
1752 if (major_progress()) print_method("PhaseIdealLoop iterations", 2); 1750 if (major_progress()) print_method("PhaseIdealLoop iterations", 2);
1753 if (failing()) return; 1751 if (failing()) return;
1754 // Perform loop predication optimization during first iteration after CCP.
1755 // After that switch it off and cleanup unused loop predicates.
1756 if (loop_predication) {
1757 loop_predication = false;
1758 cleanup_loop_predicates(igvn);
1759 if (failing()) return;
1760 }
1761 } 1752 }
1762 } 1753 }
1763 1754
1764 { 1755 {
1765 // Verify that all previous optimizations produced a valid graph 1756 // Verify that all previous optimizations produced a valid graph