OSDN Git Service

2006-04-27 Eric Christopher <echristo@apple.com>
[pf3gnuchains/gcc-fork.git] / gcc / loop-init.c
index d44575b..d2c6340 100644 (file)
@@ -34,10 +34,11 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 
 \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;
@@ -77,16 +78,22 @@ loop_optimizer_init (FILE *dumpfile)
   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);
@@ -98,7 +105,7 @@ loop_optimizer_init (FILE *dumpfile)
 
 /* Finalize loop optimizer.  */
 void
-loop_optimizer_finalize (struct loops *loops, FILE *dumpfile)
+loop_optimizer_finalize (struct loops *loops)
 {
   unsigned i;
 
@@ -109,9 +116,6 @@ loop_optimizer_finalize (struct loops *loops, FILE *dumpfile)
     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);
@@ -129,12 +133,15 @@ loop_optimizer_finalize (struct loops *loops, FILE *dumpfile)
 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 =
@@ -157,16 +164,17 @@ 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 =
@@ -188,13 +196,13 @@ 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);
 
@@ -208,9 +216,10 @@ rtl_loop_done (void)
   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 =
@@ -238,11 +247,12 @@ gate_rtl_move_loop_invariants (void)
   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 =
@@ -270,11 +280,12 @@ gate_rtl_unswitch (void)
   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 =
@@ -302,7 +313,7 @@ gate_rtl_unroll_and_peel_loops (void)
   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)
@@ -318,6 +329,7 @@ rtl_unroll_and_peel_loops (void)
 
       unroll_and_peel_loops (current_loops, flags);
     }
+  return 0;
 }
 
 struct tree_opt_pass pass_rtl_unroll_and_peel_loops =
@@ -349,13 +361,14 @@ gate_rtl_doloop (void)
 #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 =