\f
/* Initialize loop optimizer. This is used by the tree and RTL loop
- optimizers. */
+ optimizers. FLAGS specify what properties to compute and/or ensure for
+ loops. */
struct loops *
-loop_optimizer_init (FILE *dumpfile)
+loop_optimizer_init (unsigned flags)
{
struct loops *loops = XCNEW (struct loops);
edge e;
loops->cfg.dfs_order = NULL;
/* Create pre-headers. */
- create_preheaders (loops, CP_SIMPLE_PREHEADERS);
+ if (flags & LOOPS_HAVE_PREHEADERS)
+ create_preheaders (loops, CP_SIMPLE_PREHEADERS);
/* Force all latches to have only single successor. */
- force_single_succ_latches (loops);
+ if (flags & LOOPS_HAVE_SIMPLE_LATCHES)
+ force_single_succ_latches (loops);
/* Mark irreducible loops. */
- mark_irreducible_loops (loops);
+ if (flags & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
+ mark_irreducible_loops (loops);
+
+ if (flags & LOOPS_HAVE_MARKED_SINGLE_EXITS)
+ mark_single_exit_loops (loops);
/* Dump loops. */
- flow_loops_dump (loops, dumpfile, NULL, 1);
+ flow_loops_dump (loops, dump_file, NULL, 1);
#ifdef ENABLE_CHECKING
verify_dominators (CDI_DOMINATORS);
/* Finalize loop optimizer. */
void
-loop_optimizer_finalize (struct loops *loops, FILE *dumpfile)
+loop_optimizer_finalize (struct loops *loops)
{
unsigned i;
if (loops->parray[i])
free_simple_loop_desc (loops->parray[i]);
- /* Another dump. */
- flow_loops_dump (loops, dumpfile, NULL, 1);
-
/* Clean up. */
flow_loops_free (loops);
free (loops);
static bool
gate_handle_loop2 (void)
{
- return (optimize > 0 && flag_loop_optimize2
+ return (optimize > 0
&& (flag_move_loop_invariants
|| flag_unswitch_loops
|| flag_peel_loops
|| flag_unroll_loops
- || flag_branch_on_count_reg));
+#ifdef HAVE_doloop_end
+ || (flag_branch_on_count_reg && HAVE_doloop_end)
+#endif
+ ));
}
struct tree_opt_pass pass_loop2 =
\f
/* Initialization of the RTL loop passes. */
-static void
+static unsigned int
rtl_loop_init (void)
{
if (dump_file)
- dump_flow_info (dump_file);
+ dump_flow_info (dump_file, dump_flags);
/* Initialize structures for layout changes. */
cfg_layout_initialize (0);
- current_loops = loop_optimizer_init (dump_file);
+ current_loops = loop_optimizer_init (LOOPS_NORMAL);
+ return 0;
}
struct tree_opt_pass pass_rtl_loop_init =
\f
/* Finalization of the RTL loop passes. */
-static void
+static unsigned int
rtl_loop_done (void)
{
basic_block bb;
if (current_loops)
- loop_optimizer_finalize (current_loops, dump_file);
+ loop_optimizer_finalize (current_loops);
free_dominance_info (CDI_DOMINATORS);
delete_trivially_dead_insns (get_insns (), max_reg_num ());
reg_scan (get_insns (), max_reg_num ());
if (dump_file)
- dump_flow_info (dump_file);
+ dump_flow_info (dump_file, dump_flags);
current_loops = NULL;
+ return 0;
}
struct tree_opt_pass pass_rtl_loop_done =
return flag_move_loop_invariants;
}
-static void
+static unsigned int
rtl_move_loop_invariants (void)
{
if (current_loops)
move_loop_invariants (current_loops);
+ return 0;
}
struct tree_opt_pass pass_rtl_move_loop_invariants =
return flag_unswitch_loops;
}
-static void
+static unsigned int
rtl_unswitch (void)
{
if (current_loops)
unswitch_loops (current_loops);
+ return 0;
}
struct tree_opt_pass pass_rtl_unswitch =
return (flag_peel_loops || flag_unroll_loops || flag_unroll_all_loops);
}
-static void
+static unsigned int
rtl_unroll_and_peel_loops (void)
{
if (current_loops)
unroll_and_peel_loops (current_loops, flags);
}
+ return 0;
}
struct tree_opt_pass pass_rtl_unroll_and_peel_loops =
#endif
}
-static void
+static unsigned int
rtl_doloop (void)
{
#ifdef HAVE_doloop_end
if (current_loops)
doloop_optimize_loops (current_loops);
#endif
+ return 0;
}
struct tree_opt_pass pass_rtl_doloop =