Commit 9fa26457 by Steven Bosscher Committed by Steven Bosscher

loop-init.c (rest_of_handle_loop2): Remove.

	* loop-init.c (rest_of_handle_loop2): Remove.
	(rtl_loop_init, rtl_loop_done, rtl_move_loop_invariants,
	rtl_unswitch, rtl_unroll_and_peel_loops, rtl_doloop): New functions.
	(pass_rtl_loop_init, pass_rtl_loop_done,
	pass_rtl_move_loop_invariants, pass_rtl_unswitch,
	pass_rtl_unroll_and_peel_loops, pass_rtl_doloop): New passes.
	* tree-ssa-loop.c (pass_loop, pass_loop_init, pass_loop_done,
	pass_unswitch): Rename to pass_tree_loop, pass_tree_loop_init,
	pass_tree_loop_done, and pass_tree_unswitch.
	(gate_loop): Rename to gate_tree_loop.
	* passes.c (init_optimization_passes): Update for renamed tree
	loop passes.  Add the new loop2 passes as subpasses of loop2.
	* tree-pass.h: Add extern declarations for the new loop2 subpasses.
	Update for the renamed tree loop passes.

From-SVN: r102149
parent 067b9122
2005-07-19 Steven Bosscher <stevenb@suse.de>
* loop-init.c (rest_of_handle_loop2): Remove.
(rtl_loop_init, rtl_loop_done, rtl_move_loop_invariants,
rtl_unswitch, rtl_unroll_and_peel_loops, rtl_doloop): New functions.
(pass_rtl_loop_init, pass_rtl_loop_done,
pass_rtl_move_loop_invariants, pass_rtl_unswitch,
pass_rtl_unroll_and_peel_loops, pass_rtl_doloop): New passes.
* tree-ssa-loop.c (pass_loop, pass_loop_init, pass_loop_done,
pass_unswitch): Rename to pass_tree_loop, pass_tree_loop_init,
pass_tree_loop_done, and pass_tree_unswitch.
(gate_loop): Rename to gate_tree_loop.
* passes.c (init_optimization_passes): Update for renamed tree
loop passes. Add the new loop2 passes as subpasses of loop2.
* tree-pass.h: Add extern declarations for the new loop2 subpasses.
Update for the renamed tree loop passes.
2005-07-18 Ian Lance Taylor <ian@airs.com> 2005-07-18 Ian Lance Taylor <ian@airs.com>
PR middle-end/22057 PR middle-end/22057
......
/* Loop optimizer initialization routines. /* Loop optimizer initialization routines and RTL loop optimization passes.
Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -32,7 +32,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA ...@@ -32,7 +32,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#include "timevar.h" #include "timevar.h"
#include "flags.h" #include "flags.h"
/* Initialize loop optimizer. */
/* Initialize loop optimizer. This is used by the tree and RTL loop
optimizers. */
struct loops * struct loops *
loop_optimizer_init (FILE *dumpfile) loop_optimizer_init (FILE *dumpfile)
...@@ -119,7 +121,11 @@ loop_optimizer_finalize (struct loops *loops, FILE *dumpfile) ...@@ -119,7 +121,11 @@ loop_optimizer_finalize (struct loops *loops, FILE *dumpfile)
verify_flow_info (); verify_flow_info ();
#endif #endif
} }
/* Gate for the RTL loop superpass. The actual passes are subpasses.
See passes.c for more on that. */
static bool static bool
gate_handle_loop2 (void) gate_handle_loop2 (void)
{ {
...@@ -131,45 +137,64 @@ gate_handle_loop2 (void) ...@@ -131,45 +137,64 @@ gate_handle_loop2 (void)
|| flag_branch_on_count_reg)); || flag_branch_on_count_reg));
} }
/* Perform loop optimizations. It might be better to do them a bit struct tree_opt_pass pass_loop2 =
sooner, but we want the profile feedback to work more
efficiently. */
static void
rest_of_handle_loop2 (void)
{ {
struct loops *loops; "loop2", /* name */
basic_block bb; gate_handle_loop2, /* gate */
NULL, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_LOOP, /* tv_id */
0, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func |
TODO_ggc_collect, /* todo_flags_finish */
'L' /* letter */
};
/* Initialization of the RTL loop passes. */
static void
rtl_loop_init (void)
{
if (dump_file) if (dump_file)
dump_flow_info (dump_file); dump_flow_info (dump_file);
/* Initialize structures for layout changes. */ /* Initialize structures for layout changes. */
cfg_layout_initialize (0); cfg_layout_initialize (0);
loops = loop_optimizer_init (dump_file); current_loops = loop_optimizer_init (dump_file);
}
if (loops)
{
/* The optimizations: */
if (flag_move_loop_invariants)
move_loop_invariants (loops);
if (flag_unswitch_loops)
unswitch_loops (loops);
if (flag_peel_loops || flag_unroll_loops) struct tree_opt_pass pass_rtl_loop_init =
unroll_and_peel_loops (loops, {
(flag_peel_loops ? UAP_PEEL : 0) | "loopinit", /* name */
(flag_unroll_loops ? UAP_UNROLL : 0) | NULL, /* gate */
(flag_unroll_all_loops ? UAP_UNROLL_ALL : 0)); rtl_loop_init, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_LOOP, /* tv_id */
0, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func, /* todo_flags_finish */
'L' /* letter */
};
#ifdef HAVE_doloop_end
if (flag_branch_on_count_reg && HAVE_doloop_end) /* Finalization of the RTL loop passes. */
doloop_optimize_loops (loops); static void
#endif /* HAVE_doloop_end */ rtl_loop_done (void)
{
basic_block bb;
loop_optimizer_finalize (loops, dump_file); if (current_loops)
} loop_optimizer_finalize (current_loops, dump_file);
free_dominance_info (CDI_DOMINATORS); free_dominance_info (CDI_DOMINATORS);
...@@ -184,13 +209,15 @@ rest_of_handle_loop2 (void) ...@@ -184,13 +209,15 @@ rest_of_handle_loop2 (void)
reg_scan (get_insns (), max_reg_num ()); reg_scan (get_insns (), max_reg_num ());
if (dump_file) if (dump_file)
dump_flow_info (dump_file); dump_flow_info (dump_file);
current_loops = NULL;
} }
struct tree_opt_pass pass_loop2 = struct tree_opt_pass pass_rtl_loop_done =
{ {
"loop2", /* name */ "loopdone", /* name */
gate_handle_loop2, /* gate */ NULL, /* gate */
rest_of_handle_loop2, /* execute */ rtl_loop_done, /* execute */
NULL, /* sub */ NULL, /* sub */
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
...@@ -199,8 +226,126 @@ struct tree_opt_pass pass_loop2 = ...@@ -199,8 +226,126 @@ struct tree_opt_pass pass_loop2 =
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
TODO_dump_func | TODO_dump_func, /* todo_flags_finish */
TODO_ggc_collect, /* todo_flags_finish */ 'L' /* letter */
};
/* Loop invariant code motion. */
static void
rtl_move_loop_invariants (void)
{
if (current_loops && flag_move_loop_invariants)
move_loop_invariants (current_loops);
}
struct tree_opt_pass pass_rtl_move_loop_invariants =
{
"loop_invariant", /* name */
NULL, /* gate */
rtl_move_loop_invariants, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_LOOP, /* tv_id */
0, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func, /* todo_flags_finish */
'L' /* letter */
};
/* Loop unswitching for RTL. */
static void
rtl_unswitch (void)
{
if (current_loops && flag_unswitch_loops)
unswitch_loops (current_loops);
}
struct tree_opt_pass pass_rtl_unswitch =
{
"loop_unswitch", /* name */
NULL, /* gate */
rtl_unswitch, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_LOOP, /* tv_id */
0, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func, /* todo_flags_finish */
'L' /* letter */
};
/* Loop unswitching for RTL. */
static void
rtl_unroll_and_peel_loops (void)
{
if (current_loops
&& (flag_peel_loops || flag_unroll_loops || flag_unroll_all_loops))
{
int flags = 0;
if (flag_peel_loops)
flags |= UAP_PEEL;
if (flag_unroll_loops)
flags |= UAP_UNROLL;
if (flag_unroll_all_loops)
flags |= UAP_UNROLL_ALL;
unroll_and_peel_loops (current_loops, flags);
}
}
struct tree_opt_pass pass_rtl_unroll_and_peel_loops =
{
"loop_unroll", /* name */
NULL, /* gate */
rtl_unroll_and_peel_loops, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_LOOP, /* tv_id */
0, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func, /* todo_flags_finish */
'L' /* letter */
};
/* The doloop optimization. */
static void
rtl_doloop (void)
{
#ifdef HAVE_doloop_end
if (current_loops
&& (flag_branch_on_count_reg && HAVE_doloop_end))
doloop_optimize_loops (current_loops);
#endif
}
struct tree_opt_pass pass_rtl_doloop =
{
"loop_doloop", /* name */
NULL, /* gate */
rtl_doloop, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_LOOP, /* tv_id */
0, /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func, /* todo_flags_finish */
'L' /* letter */ 'L' /* letter */
}; };
...@@ -525,7 +525,7 @@ init_optimization_passes (void) ...@@ -525,7 +525,7 @@ init_optimization_passes (void)
NEXT_PASS (pass_reassoc); NEXT_PASS (pass_reassoc);
NEXT_PASS (pass_pre); NEXT_PASS (pass_pre);
NEXT_PASS (pass_sink_code); NEXT_PASS (pass_sink_code);
NEXT_PASS (pass_loop); NEXT_PASS (pass_tree_loop);
NEXT_PASS (pass_dominator); NEXT_PASS (pass_dominator);
NEXT_PASS (pass_copy_prop); NEXT_PASS (pass_copy_prop);
NEXT_PASS (pass_cd_dce); NEXT_PASS (pass_cd_dce);
...@@ -553,11 +553,11 @@ init_optimization_passes (void) ...@@ -553,11 +553,11 @@ init_optimization_passes (void)
NEXT_PASS (pass_cleanup_cfg_post_optimizing); NEXT_PASS (pass_cleanup_cfg_post_optimizing);
*p = NULL; *p = NULL;
p = &pass_loop.sub; p = &pass_tree_loop.sub;
NEXT_PASS (pass_loop_init); NEXT_PASS (pass_tree_loop_init);
NEXT_PASS (pass_copy_prop); NEXT_PASS (pass_copy_prop);
NEXT_PASS (pass_lim); NEXT_PASS (pass_lim);
NEXT_PASS (pass_unswitch); NEXT_PASS (pass_tree_unswitch);
NEXT_PASS (pass_scev_cprop); NEXT_PASS (pass_scev_cprop);
NEXT_PASS (pass_empty_loop); NEXT_PASS (pass_empty_loop);
NEXT_PASS (pass_record_bounds); NEXT_PASS (pass_record_bounds);
...@@ -571,9 +571,18 @@ init_optimization_passes (void) ...@@ -571,9 +571,18 @@ init_optimization_passes (void)
NEXT_PASS (pass_lower_vector_ssa); NEXT_PASS (pass_lower_vector_ssa);
NEXT_PASS (pass_complete_unroll); NEXT_PASS (pass_complete_unroll);
NEXT_PASS (pass_iv_optimize); NEXT_PASS (pass_iv_optimize);
NEXT_PASS (pass_loop_done); NEXT_PASS (pass_tree_loop_done);
*p = NULL; *p = NULL;
p = &pass_loop2.sub;
NEXT_PASS (pass_rtl_loop_init);
NEXT_PASS (pass_rtl_move_loop_invariants);
NEXT_PASS (pass_rtl_unswitch);
NEXT_PASS (pass_rtl_unroll_and_peel_loops);
NEXT_PASS (pass_rtl_doloop);
NEXT_PASS (pass_rtl_loop_done);
*p = NULL;
p = &pass_rest_of_compilation.sub; p = &pass_rest_of_compilation.sub;
NEXT_PASS (pass_remove_unnecessary_notes); NEXT_PASS (pass_remove_unnecessary_notes);
NEXT_PASS (pass_init_function); NEXT_PASS (pass_init_function);
...@@ -592,6 +601,9 @@ init_optimization_passes (void) ...@@ -592,6 +601,9 @@ init_optimization_passes (void)
NEXT_PASS (pass_profiling); NEXT_PASS (pass_profiling);
NEXT_PASS (pass_rtl_ifcvt); NEXT_PASS (pass_rtl_ifcvt);
NEXT_PASS (pass_tracer); NEXT_PASS (pass_tracer);
/* Perform loop optimizations. It might be better to do them a bit
sooner, but we want the profile feedback to work more
efficiently. */
NEXT_PASS (pass_loop2); NEXT_PASS (pass_loop2);
NEXT_PASS (pass_web); NEXT_PASS (pass_web);
NEXT_PASS (pass_cse2); NEXT_PASS (pass_cse2);
......
...@@ -222,10 +222,10 @@ extern struct tree_opt_pass pass_referenced_vars; ...@@ -222,10 +222,10 @@ extern struct tree_opt_pass pass_referenced_vars;
extern struct tree_opt_pass pass_sra; extern struct tree_opt_pass pass_sra;
extern struct tree_opt_pass pass_tail_recursion; extern struct tree_opt_pass pass_tail_recursion;
extern struct tree_opt_pass pass_tail_calls; extern struct tree_opt_pass pass_tail_calls;
extern struct tree_opt_pass pass_loop; extern struct tree_opt_pass pass_tree_loop;
extern struct tree_opt_pass pass_loop_init; extern struct tree_opt_pass pass_tree_loop_init;
extern struct tree_opt_pass pass_lim; extern struct tree_opt_pass pass_lim;
extern struct tree_opt_pass pass_unswitch; extern struct tree_opt_pass pass_tree_unswitch;
extern struct tree_opt_pass pass_iv_canon; extern struct tree_opt_pass pass_iv_canon;
extern struct tree_opt_pass pass_scev_cprop; extern struct tree_opt_pass pass_scev_cprop;
extern struct tree_opt_pass pass_empty_loop; extern struct tree_opt_pass pass_empty_loop;
...@@ -234,7 +234,7 @@ extern struct tree_opt_pass pass_if_conversion; ...@@ -234,7 +234,7 @@ extern struct tree_opt_pass pass_if_conversion;
extern struct tree_opt_pass pass_vectorize; extern struct tree_opt_pass pass_vectorize;
extern struct tree_opt_pass pass_complete_unroll; extern struct tree_opt_pass pass_complete_unroll;
extern struct tree_opt_pass pass_iv_optimize; extern struct tree_opt_pass pass_iv_optimize;
extern struct tree_opt_pass pass_loop_done; extern struct tree_opt_pass pass_tree_loop_done;
extern struct tree_opt_pass pass_ch; extern struct tree_opt_pass pass_ch;
extern struct tree_opt_pass pass_ccp; extern struct tree_opt_pass pass_ccp;
extern struct tree_opt_pass pass_build_ssa; extern struct tree_opt_pass pass_build_ssa;
...@@ -316,7 +316,15 @@ extern struct tree_opt_pass pass_cfg; ...@@ -316,7 +316,15 @@ extern struct tree_opt_pass pass_cfg;
extern struct tree_opt_pass pass_profiling; extern struct tree_opt_pass pass_profiling;
extern struct tree_opt_pass pass_rtl_ifcvt; extern struct tree_opt_pass pass_rtl_ifcvt;
extern struct tree_opt_pass pass_tracer; extern struct tree_opt_pass pass_tracer;
extern struct tree_opt_pass pass_loop2; extern struct tree_opt_pass pass_loop2;
extern struct tree_opt_pass pass_rtl_loop_init;
extern struct tree_opt_pass pass_rtl_move_loop_invariants;
extern struct tree_opt_pass pass_rtl_unswitch;
extern struct tree_opt_pass pass_rtl_unroll_and_peel_loops;
extern struct tree_opt_pass pass_rtl_doloop;
extern struct tree_opt_pass pass_rtl_loop_done;
extern struct tree_opt_pass pass_web; extern struct tree_opt_pass pass_web;
extern struct tree_opt_pass pass_cse2; extern struct tree_opt_pass pass_cse2;
extern struct tree_opt_pass pass_life; extern struct tree_opt_pass pass_life;
......
...@@ -61,15 +61,15 @@ tree_loop_optimizer_init (FILE *dump) ...@@ -61,15 +61,15 @@ tree_loop_optimizer_init (FILE *dump)
/* The loop superpass. */ /* The loop superpass. */
static bool static bool
gate_loop (void) gate_tree_loop (void)
{ {
return flag_tree_loop_optimize != 0; return flag_tree_loop_optimize != 0;
} }
struct tree_opt_pass pass_loop = struct tree_opt_pass pass_tree_loop =
{ {
"loop", /* name */ "loop", /* name */
gate_loop, /* gate */ gate_tree_loop, /* gate */
NULL, /* execute */ NULL, /* execute */
NULL, /* sub */ NULL, /* sub */
NULL, /* next */ NULL, /* next */
...@@ -98,7 +98,7 @@ tree_ssa_loop_init (void) ...@@ -98,7 +98,7 @@ tree_ssa_loop_init (void)
scev_initialize (current_loops); scev_initialize (current_loops);
} }
struct tree_opt_pass pass_loop_init = struct tree_opt_pass pass_tree_loop_init =
{ {
"loopinit", /* name */ "loopinit", /* name */
NULL, /* gate */ NULL, /* gate */
...@@ -166,7 +166,7 @@ gate_tree_ssa_loop_unswitch (void) ...@@ -166,7 +166,7 @@ gate_tree_ssa_loop_unswitch (void)
return flag_unswitch_loops != 0; return flag_unswitch_loops != 0;
} }
struct tree_opt_pass pass_unswitch = struct tree_opt_pass pass_tree_unswitch =
{ {
"unswitch", /* name */ "unswitch", /* name */
gate_tree_ssa_loop_unswitch, /* gate */ gate_tree_ssa_loop_unswitch, /* gate */
...@@ -454,7 +454,7 @@ tree_ssa_loop_done (void) ...@@ -454,7 +454,7 @@ tree_ssa_loop_done (void)
current_loops = NULL; current_loops = NULL;
} }
struct tree_opt_pass pass_loop_done = struct tree_opt_pass pass_tree_loop_done =
{ {
"loopdone", /* name */ "loopdone", /* name */
NULL, /* gate */ NULL, /* gate */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment