910 _verify_only(true) { |
910 _verify_only(true) { |
911 build_and_optimize(false, false); |
911 build_and_optimize(false, false); |
912 } |
912 } |
913 |
913 |
914 // build the loop tree and perform any requested optimizations |
914 // build the loop tree and perform any requested optimizations |
915 void build_and_optimize(bool do_split_if, bool skip_loop_opts); |
915 void build_and_optimize(bool do_split_if, bool skip_loop_opts, bool last_round = false); |
916 |
916 |
917 // Dominators for the sea of nodes |
917 // Dominators for the sea of nodes |
918 void Dominators(); |
918 void Dominators(); |
919 Node *dom_lca( Node *n1, Node *n2 ) const { |
919 Node *dom_lca( Node *n1, Node *n2 ) const { |
920 return find_non_split_ctrl(dom_lca_internal(n1, n2)); |
920 return find_non_split_ctrl(dom_lca_internal(n1, n2)); |
921 } |
921 } |
922 Node *dom_lca_internal( Node *n1, Node *n2 ) const; |
922 Node *dom_lca_internal( Node *n1, Node *n2 ) const; |
923 |
923 |
924 // Compute the Ideal Node to Loop mapping |
924 // Compute the Ideal Node to Loop mapping |
925 PhaseIdealLoop( PhaseIterGVN &igvn, bool do_split_ifs, bool skip_loop_opts = false) : |
925 PhaseIdealLoop( PhaseIterGVN &igvn, bool do_split_ifs, bool skip_loop_opts = false, bool last_round = false) : |
926 PhaseTransform(Ideal_Loop), |
926 PhaseTransform(Ideal_Loop), |
927 _igvn(igvn), |
927 _igvn(igvn), |
928 _dom_lca_tags(arena()), // Thread::resource_area |
928 _dom_lca_tags(arena()), // Thread::resource_area |
929 _verify_me(NULL), |
929 _verify_me(NULL), |
930 _verify_only(false) { |
930 _verify_only(false) { |
931 build_and_optimize(do_split_ifs, skip_loop_opts); |
931 build_and_optimize(do_split_ifs, skip_loop_opts, last_round); |
932 } |
932 } |
933 |
933 |
934 // Verify that verify_me made the same decisions as a fresh run. |
934 // Verify that verify_me made the same decisions as a fresh run. |
935 PhaseIdealLoop( PhaseIterGVN &igvn, const PhaseIdealLoop *verify_me) : |
935 PhaseIdealLoop( PhaseIterGVN &igvn, const PhaseIdealLoop *verify_me) : |
936 PhaseTransform(Ideal_Loop), |
936 PhaseTransform(Ideal_Loop), |
1225 // forcing an extra register move) |
1225 // forcing an extra register move) |
1226 void reorg_offsets( IdealLoopTree *loop ); |
1226 void reorg_offsets( IdealLoopTree *loop ); |
1227 |
1227 |
1228 // Check for aggressive application of 'split-if' optimization, |
1228 // Check for aggressive application of 'split-if' optimization, |
1229 // using basic block level info. |
1229 // using basic block level info. |
1230 void split_if_with_blocks ( VectorSet &visited, Node_Stack &nstack ); |
1230 void split_if_with_blocks ( VectorSet &visited, Node_Stack &nstack, bool last_round ); |
1231 Node *split_if_with_blocks_pre ( Node *n ); |
1231 Node *split_if_with_blocks_pre ( Node *n ); |
1232 void split_if_with_blocks_post( Node *n ); |
1232 void split_if_with_blocks_post( Node *n, bool last_round ); |
1233 Node *has_local_phi_input( Node *n ); |
1233 Node *has_local_phi_input( Node *n ); |
1234 // Mark an IfNode as being dominated by a prior test, |
1234 // Mark an IfNode as being dominated by a prior test, |
1235 // without actually altering the CFG (and hence IDOM info). |
1235 // without actually altering the CFG (and hence IDOM info). |
1236 void dominated_by( Node *prevdom, Node *iff, bool flip = false, bool exclude_loop_predicate = false ); |
1236 void dominated_by( Node *prevdom, Node *iff, bool flip = false, bool exclude_loop_predicate = false ); |
1237 |
1237 |