Mercurial > hg > graal-jvmci-8
comparison src/share/vm/opto/compile.cpp @ 1172:b2b6a9bf6238
6894779: Loop Predication for Loop Optimizer in C2
Summary: Loop predication implementation
Reviewed-by: never, kvn
author | cfang |
---|---|
date | Tue, 12 Jan 2010 14:37:35 -0800 |
parents | f96a1a986f7b |
children | b4b440360f1e |
comparison
equal
deleted
inserted
replaced
1160:f24201449cac | 1172:b2b6a9bf6238 |
---|---|
930 // A NULL adr_type hits in the cache right away. Preload the right answer. | 930 // A NULL adr_type hits in the cache right away. Preload the right answer. |
931 probe_alias_cache(NULL)->_index = AliasIdxTop; | 931 probe_alias_cache(NULL)->_index = AliasIdxTop; |
932 | 932 |
933 _intrinsics = NULL; | 933 _intrinsics = NULL; |
934 _macro_nodes = new GrowableArray<Node*>(comp_arena(), 8, 0, NULL); | 934 _macro_nodes = new GrowableArray<Node*>(comp_arena(), 8, 0, NULL); |
935 _predicate_opaqs = new GrowableArray<Node*>(comp_arena(), 8, 0, NULL); | |
935 register_library_intrinsics(); | 936 register_library_intrinsics(); |
936 } | 937 } |
937 | 938 |
938 //---------------------------init_start---------------------------------------- | 939 //---------------------------init_start---------------------------------------- |
939 // Install the StartNode on this compile object. | 940 // Install the StartNode on this compile object. |
1551 while ((call = pop_warm_call()) != NULL) { | 1552 while ((call = pop_warm_call()) != NULL) { |
1552 call->make_cold(); | 1553 call->make_cold(); |
1553 } | 1554 } |
1554 } | 1555 } |
1555 | 1556 |
1557 //---------------------cleanup_loop_predicates----------------------- | |
1558 // Remove the opaque nodes that protect the predicates so that all unused | |
1559 // checks and uncommon_traps will be eliminated from the ideal graph | |
1560 void Compile::cleanup_loop_predicates(PhaseIterGVN &igvn) { | |
1561 if (predicate_count()==0) return; | |
1562 for (int i = predicate_count(); i > 0; i--) { | |
1563 Node * n = predicate_opaque1_node(i-1); | |
1564 assert(n->Opcode() == Op_Opaque1, "must be"); | |
1565 igvn.replace_node(n, n->in(1)); | |
1566 } | |
1567 assert(predicate_count()==0, "should be clean!"); | |
1568 igvn.optimize(); | |
1569 } | |
1556 | 1570 |
1557 //------------------------------Optimize--------------------------------------- | 1571 //------------------------------Optimize--------------------------------------- |
1558 // Given a graph, optimize it. | 1572 // Given a graph, optimize it. |
1559 void Compile::Optimize() { | 1573 void Compile::Optimize() { |
1560 TracePhase t1("optimizer", &_t_optimizer, true); | 1574 TracePhase t1("optimizer", &_t_optimizer, true); |
1592 // Set loop opts counter | 1606 // Set loop opts counter |
1593 loop_opts_cnt = num_loop_opts(); | 1607 loop_opts_cnt = num_loop_opts(); |
1594 if((loop_opts_cnt > 0) && (has_loops() || has_split_ifs())) { | 1608 if((loop_opts_cnt > 0) && (has_loops() || has_split_ifs())) { |
1595 { | 1609 { |
1596 TracePhase t2("idealLoop", &_t_idealLoop, true); | 1610 TracePhase t2("idealLoop", &_t_idealLoop, true); |
1597 PhaseIdealLoop ideal_loop( igvn, true ); | 1611 PhaseIdealLoop ideal_loop( igvn, true, UseLoopPredicate); |
1598 loop_opts_cnt--; | 1612 loop_opts_cnt--; |
1599 if (major_progress()) print_method("PhaseIdealLoop 1", 2); | 1613 if (major_progress()) print_method("PhaseIdealLoop 1", 2); |
1600 if (failing()) return; | 1614 if (failing()) return; |
1601 } | 1615 } |
1602 // Loop opts pass if partial peeling occurred in previous pass | 1616 // Loop opts pass if partial peeling occurred in previous pass |
1603 if(PartialPeelLoop && major_progress() && (loop_opts_cnt > 0)) { | 1617 if(PartialPeelLoop && major_progress() && (loop_opts_cnt > 0)) { |
1604 TracePhase t3("idealLoop", &_t_idealLoop, true); | 1618 TracePhase t3("idealLoop", &_t_idealLoop, true); |
1605 PhaseIdealLoop ideal_loop( igvn, false ); | 1619 PhaseIdealLoop ideal_loop( igvn, false, UseLoopPredicate); |
1606 loop_opts_cnt--; | 1620 loop_opts_cnt--; |
1607 if (major_progress()) print_method("PhaseIdealLoop 2", 2); | 1621 if (major_progress()) print_method("PhaseIdealLoop 2", 2); |
1608 if (failing()) return; | 1622 if (failing()) return; |
1609 } | 1623 } |
1610 // Loop opts pass for loop-unrolling before CCP | 1624 // Loop opts pass for loop-unrolling before CCP |
1611 if(major_progress() && (loop_opts_cnt > 0)) { | 1625 if(major_progress() && (loop_opts_cnt > 0)) { |
1612 TracePhase t4("idealLoop", &_t_idealLoop, true); | 1626 TracePhase t4("idealLoop", &_t_idealLoop, true); |
1613 PhaseIdealLoop ideal_loop( igvn, false ); | 1627 PhaseIdealLoop ideal_loop( igvn, false, UseLoopPredicate); |
1614 loop_opts_cnt--; | 1628 loop_opts_cnt--; |
1615 if (major_progress()) print_method("PhaseIdealLoop 3", 2); | 1629 if (major_progress()) print_method("PhaseIdealLoop 3", 2); |
1616 } | 1630 } |
1617 if (!failing()) { | 1631 if (!failing()) { |
1618 // Verify that last round of loop opts produced a valid graph | 1632 // Verify that last round of loop opts produced a valid graph |
1646 | 1660 |
1647 // Loop transforms on the ideal graph. Range Check Elimination, | 1661 // Loop transforms on the ideal graph. Range Check Elimination, |
1648 // peeling, unrolling, etc. | 1662 // peeling, unrolling, etc. |
1649 if(loop_opts_cnt > 0) { | 1663 if(loop_opts_cnt > 0) { |
1650 debug_only( int cnt = 0; ); | 1664 debug_only( int cnt = 0; ); |
1665 bool loop_predication = UseLoopPredicate; | |
1651 while(major_progress() && (loop_opts_cnt > 0)) { | 1666 while(major_progress() && (loop_opts_cnt > 0)) { |
1652 TracePhase t2("idealLoop", &_t_idealLoop, true); | 1667 TracePhase t2("idealLoop", &_t_idealLoop, true); |
1653 assert( cnt++ < 40, "infinite cycle in loop optimization" ); | 1668 assert( cnt++ < 40, "infinite cycle in loop optimization" ); |
1654 PhaseIdealLoop ideal_loop( igvn, true ); | 1669 PhaseIdealLoop ideal_loop( igvn, true, loop_predication); |
1655 loop_opts_cnt--; | 1670 loop_opts_cnt--; |
1656 if (major_progress()) print_method("PhaseIdealLoop iterations", 2); | 1671 if (major_progress()) print_method("PhaseIdealLoop iterations", 2); |
1657 if (failing()) return; | 1672 if (failing()) return; |
1673 // Perform loop predication optimization during first iteration after CCP. | |
1674 // After that switch it off and cleanup unused loop predicates. | |
1675 if (loop_predication) { | |
1676 loop_predication = false; | |
1677 cleanup_loop_predicates(igvn); | |
1678 if (failing()) return; | |
1679 } | |
1658 } | 1680 } |
1659 } | 1681 } |
1660 | 1682 |
1661 { | 1683 { |
1662 // Verify that all previous optimizations produced a valid graph | 1684 // Verify that all previous optimizations produced a valid graph |