OSDN Git Service

* loop-init.c (rest_of_handle_loop2): Remove.
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Jul 2005 00:44:45 +0000 (00:44 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Jul 2005 00:44:45 +0000 (00:44 +0000)
(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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@102149 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/loop-init.c
gcc/passes.c
gcc/tree-pass.h
gcc/tree-ssa-loop.c

index 9cd5cff..f599f04 100644 (file)
@@ -1,3 +1,20 @@
+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>
 
        PR middle-end/22057
 2005-07-18  Ian Lance Taylor  <ian@airs.com>
 
        PR middle-end/22057
index 375b2bf..0e0b0cf 100644 (file)
@@ -1,4 +1,4 @@
-/* Loop optimizer initialization routines.
+/* Loop optimizer initialization routines and RTL loop optimization passes.
    Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
 This file is part of GCC.
    Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -32,7 +32,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 #include "timevar.h"
 #include "flags.h"
 
 #include "timevar.h"
 #include "flags.h"
 
-/* Initialize loop optimizer.  */
+\f
+/* Initialize loop optimizer.  This is used by the tree and RTL loop
+   optimizers.  */
 
 struct loops *
 loop_optimizer_init (FILE *dumpfile)
 
 struct loops *
 loop_optimizer_init (FILE *dumpfile)
@@ -119,7 +121,11 @@ loop_optimizer_finalize (struct loops *loops, FILE *dumpfile)
   verify_flow_info ();
 #endif
 }
   verify_flow_info ();
 #endif
 }
+
 \f
 \f
+/* Gate for the RTL loop superpass.  The actual passes are subpasses.
+   See passes.c for more on that.  */
+
 static bool
 gate_handle_loop2 (void)
 {
 static bool
 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
-   sooner, but we want the profile feedback to work more
-   efficiently.  */
-static void
-rest_of_handle_loop2 (void)
+struct tree_opt_pass pass_loop2 =
 {
 {
-  struct loops *loops;
-  basic_block bb;
+  "loop2",                              /* name */
+  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 */
+};
 
 
+\f
+/* Initialization of the RTL loop passes.  */
+static void
+rtl_loop_init (void)
+{
   if (dump_file)
     dump_flow_info (dump_file);
 
   /* Initialize structures for layout changes.  */
   cfg_layout_initialize (0);
 
   if (dump_file)
     dump_flow_info (dump_file);
 
   /* Initialize structures for layout changes.  */
   cfg_layout_initialize (0);
 
-  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);
+  current_loops = loop_optimizer_init (dump_file);
+}
 
 
-      if (flag_peel_loops || flag_unroll_loops)
-        unroll_and_peel_loops (loops,
-                               (flag_peel_loops ? UAP_PEEL : 0) |
-                               (flag_unroll_loops ? UAP_UNROLL : 0) |
-                               (flag_unroll_all_loops ? UAP_UNROLL_ALL : 0));
+struct tree_opt_pass pass_rtl_loop_init =
+{
+  "loopinit",                           /* name */
+  NULL,                                 /* gate */
+  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)
-        doloop_optimize_loops (loops);
-#endif /* HAVE_doloop_end */
+\f
+/* Finalization of the RTL loop passes.  */
+static void
+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)
   reg_scan (get_insns (), max_reg_num ());
   if (dump_file)
     dump_flow_info (dump_file);
   reg_scan (get_insns (), max_reg_num ());
   if (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 */
-  gate_handle_loop2,                   /* gate */
-  rest_of_handle_loop2,                /* execute */
+  "loopdone",                           /* name */
+  NULL,                                 /* gate */
+  rtl_loop_done,                        /* execute */
   NULL,                                 /* sub */
   NULL,                                 /* next */
   0,                                    /* static_pass_number */
   NULL,                                 /* sub */
   NULL,                                 /* next */
   0,                                    /* static_pass_number */
@@ -199,8 +226,126 @@ struct tree_opt_pass pass_loop2 =
   0,                                    /* properties_provided */
   0,                                    /* properties_destroyed */
   0,                                    /* todo_flags_start */
   0,                                    /* properties_provided */
   0,                                    /* properties_destroyed */
   0,                                    /* todo_flags_start */
-  TODO_dump_func |
-  TODO_ggc_collect,                     /* todo_flags_finish */
+  TODO_dump_func,                       /* todo_flags_finish */
+  'L'                                   /* letter */
+};
+
+\f
+/* 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 */
+};
+
+\f
+/* 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 */
+};
+
+\f
+/* 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 */
+};
+
+\f
+/* 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 */
 };
 
index edc75f1..efe3e5b 100644 (file)
@@ -525,7 +525,7 @@ init_optimization_passes (void)
   NEXT_PASS (pass_reassoc);
   NEXT_PASS (pass_pre);
   NEXT_PASS (pass_sink_code);
   NEXT_PASS (pass_reassoc);
   NEXT_PASS (pass_pre);
   NEXT_PASS (pass_sink_code);
-  NEXT_PASS (pass_loop);
+  NEXT_PASS (pass_tree_loop);
   NEXT_PASS (pass_dominator);
   NEXT_PASS (pass_copy_prop);
   NEXT_PASS (pass_cd_dce);
   NEXT_PASS (pass_dominator);
   NEXT_PASS (pass_copy_prop);
   NEXT_PASS (pass_cd_dce);
@@ -553,11 +553,11 @@ init_optimization_passes (void)
   NEXT_PASS (pass_cleanup_cfg_post_optimizing);
   *p = NULL;
 
   NEXT_PASS (pass_cleanup_cfg_post_optimizing);
   *p = NULL;
 
-  p = &pass_loop.sub;
-  NEXT_PASS (pass_loop_init);
+  p = &pass_tree_loop.sub;
+  NEXT_PASS (pass_tree_loop_init);
   NEXT_PASS (pass_copy_prop);
   NEXT_PASS (pass_lim);
   NEXT_PASS (pass_copy_prop);
   NEXT_PASS (pass_lim);
-  NEXT_PASS (pass_unswitch);
+  NEXT_PASS (pass_tree_unswitch);
   NEXT_PASS (pass_scev_cprop);
   NEXT_PASS (pass_empty_loop);
   NEXT_PASS (pass_record_bounds);
   NEXT_PASS (pass_scev_cprop);
   NEXT_PASS (pass_empty_loop);
   NEXT_PASS (pass_record_bounds);
@@ -571,9 +571,18 @@ init_optimization_passes (void)
   NEXT_PASS (pass_lower_vector_ssa);
   NEXT_PASS (pass_complete_unroll);
   NEXT_PASS (pass_iv_optimize);
   NEXT_PASS (pass_lower_vector_ssa);
   NEXT_PASS (pass_complete_unroll);
   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;
   NEXT_PASS (pass_remove_unnecessary_notes);
   NEXT_PASS (pass_init_function);
   p = &pass_rest_of_compilation.sub;
   NEXT_PASS (pass_remove_unnecessary_notes);
   NEXT_PASS (pass_init_function);
@@ -592,6 +601,9 @@ init_optimization_passes (void)
   NEXT_PASS (pass_profiling);
   NEXT_PASS (pass_rtl_ifcvt);
   NEXT_PASS (pass_tracer);
   NEXT_PASS (pass_profiling);
   NEXT_PASS (pass_rtl_ifcvt);
   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_web);
   NEXT_PASS (pass_cse2);
   NEXT_PASS (pass_loop2);
   NEXT_PASS (pass_web);
   NEXT_PASS (pass_cse2);
index 7db3751..e505637 100644 (file)
@@ -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_tail_recursion;
 extern struct tree_opt_pass pass_tail_calls;
 extern struct tree_opt_pass pass_sra;
 extern struct tree_opt_pass pass_tail_recursion;
 extern struct tree_opt_pass pass_tail_calls;
-extern struct tree_opt_pass pass_loop;
-extern struct tree_opt_pass pass_loop_init;
+extern struct tree_opt_pass pass_tree_loop;
+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_scev_cprop;
 extern struct tree_opt_pass pass_empty_loop;
 extern struct tree_opt_pass pass_iv_canon;
 extern struct tree_opt_pass pass_scev_cprop;
 extern struct tree_opt_pass pass_empty_loop;
@@ -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_complete_unroll;
 extern struct tree_opt_pass pass_iv_optimize;
 extern struct tree_opt_pass pass_vectorize;
 extern struct tree_opt_pass pass_complete_unroll;
 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_ccp;
 extern struct tree_opt_pass pass_build_ssa;
 extern struct tree_opt_pass pass_ch;
 extern struct tree_opt_pass pass_ccp;
 extern struct tree_opt_pass pass_build_ssa;
@@ -316,7 +316,15 @@ extern struct tree_opt_pass pass_cfg;
 extern struct tree_opt_pass pass_profiling;
 extern struct tree_opt_pass pass_rtl_ifcvt;
 extern struct tree_opt_pass pass_tracer;
 extern struct tree_opt_pass pass_profiling;
 extern struct tree_opt_pass pass_rtl_ifcvt;
 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_cse2;
 extern struct tree_opt_pass pass_life;
 extern struct tree_opt_pass pass_web;
 extern struct tree_opt_pass pass_cse2;
 extern struct tree_opt_pass pass_life;
index 1e7d73b..abfcf15 100644 (file)
@@ -61,15 +61,15 @@ tree_loop_optimizer_init (FILE *dump)
 /* The loop superpass.  */
 
 static bool
 /* The loop superpass.  */
 
 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,                                        /* sub */
   NULL,                                        /* next */
   NULL,                                        /* execute */
   NULL,                                        /* sub */
   NULL,                                        /* next */
@@ -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 */
   NULL,                                        /* gate */
 {
   "loopinit",                          /* name */
   NULL,                                        /* gate */
@@ -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 */
   gate_tree_ssa_loop_unswitch,         /* gate */
 {
   "unswitch",                          /* name */
   gate_tree_ssa_loop_unswitch,         /* gate */
@@ -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 */
   NULL,                                        /* gate */
 {
   "loopdone",                          /* name */
   NULL,                                        /* gate */