OSDN Git Service

2008-03-04 Rafael Espindola <espindola@google.com>
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-loop.c
index 895c9c2..3361834 100644 (file)
@@ -5,7 +5,7 @@ This file is part of GCC.
    
 GCC is free software; you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
+Free Software Foundation; either version 3, or (at your option) any
 later version.
    
 GCC is distributed in the hope that it will be useful, but WITHOUT
@@ -14,9 +14,8 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
    
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
 #include "system.h"
@@ -45,9 +44,6 @@ tree_loop_optimizer_init (void)
 {
   loop_optimizer_init (LOOPS_NORMAL
                       | LOOPS_HAVE_RECORDED_EXITS);
-  if (!current_loops)
-    return;
-
   rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
 }
 
@@ -82,7 +78,7 @@ static unsigned int
 tree_ssa_loop_init (void)
 {
   tree_loop_optimizer_init ();
-  if (!current_loops)
+  if (number_of_loops () <= 1)
     return 0;
 
   scev_initialize ();
@@ -111,7 +107,7 @@ struct tree_opt_pass pass_tree_loop_init =
 static unsigned int
 tree_ssa_loop_im (void)
 {
-  if (!current_loops)
+  if (number_of_loops () <= 1)
     return 0;
 
   tree_ssa_lim ();
@@ -146,7 +142,7 @@ struct tree_opt_pass pass_lim =
 static unsigned int
 tree_ssa_loop_unswitch (void)
 {
-  if (!current_loops)
+  if (number_of_loops () <= 1)
     return 0;
 
   return tree_ssa_unswitch_loops ();
@@ -223,7 +219,7 @@ tree_vectorize (void)
 static bool
 gate_tree_vectorize (void)
 {
-  return flag_tree_vectorize && current_loops;
+  return flag_tree_vectorize && number_of_loops () > 1;
 }
 
 struct tree_opt_pass pass_vectorize =
@@ -249,7 +245,7 @@ struct tree_opt_pass pass_vectorize =
 static unsigned int
 tree_linear_transform (void)
 {
-  if (!current_loops)
+  if (number_of_loops () <= 1)
     return 0;
 
   linear_transform_loops ();
@@ -276,6 +272,7 @@ struct tree_opt_pass pass_linear_transform =
   0,                                   /* properties_destroyed */
   0,                                   /* todo_flags_start */
   TODO_dump_func | TODO_verify_loops
+    | TODO_update_ssa_only_virtuals
     | TODO_ggc_collect,                        /* todo_flags_finish */
   0                                    /* letter */    
 };
@@ -285,7 +282,7 @@ struct tree_opt_pass pass_linear_transform =
 static unsigned int
 check_data_deps (void)
 {
-  if (!current_loops)
+  if (number_of_loops () <= 1)
     return 0;
 
   tree_check_data_deps ();
@@ -320,7 +317,7 @@ struct tree_opt_pass pass_check_data_deps =
 static unsigned int
 tree_ssa_loop_ivcanon (void)
 {
-  if (!current_loops)
+  if (number_of_loops () <= 1)
     return 0;
 
   return canonicalize_induction_variables ();
@@ -381,7 +378,7 @@ struct tree_opt_pass pass_scev_cprop =
 static unsigned int
 tree_ssa_empty_loop (void)
 {
-  if (!current_loops)
+  if (number_of_loops () <= 1)
     return 0;
 
   return remove_empty_loops ();
@@ -410,7 +407,7 @@ struct tree_opt_pass pass_empty_loop =
 static unsigned int
 tree_ssa_loop_bounds (void)
 {
-  if (!current_loops)
+  if (number_of_loops () <= 1)
     return 0;
 
   estimate_numbers_of_iterations ();
@@ -440,7 +437,7 @@ struct tree_opt_pass pass_record_bounds =
 static unsigned int
 tree_complete_unroll (void)
 {
-  if (!current_loops)
+  if (number_of_loops () <= 1)
     return 0;
 
   return tree_unroll_loops_completely (flag_unroll_loops
@@ -472,12 +469,48 @@ struct tree_opt_pass pass_complete_unroll =
   0                                    /* letter */
 };
 
+/* Parallelization.  */
+
+static bool
+gate_tree_parallelize_loops (void)
+{
+  return flag_tree_parallelize_loops > 1;
+}
+
+static unsigned
+tree_parallelize_loops (void)
+{
+  if (number_of_loops () <= 1)
+    return 0;
+
+  if (parallelize_loops ())
+    return TODO_cleanup_cfg | TODO_rebuild_alias;
+  return 0;
+}
+
+struct tree_opt_pass pass_parallelize_loops =
+{
+  "parloops",                          /* name */
+  gate_tree_parallelize_loops,         /* gate */
+  tree_parallelize_loops,                      /* execute */
+  NULL,                                        /* sub */
+  NULL,                                        /* next */
+  0,                                   /* static_pass_number */
+  TV_TREE_PARALLELIZE_LOOPS,           /* tv_id */
+  PROP_cfg | PROP_ssa,                 /* properties_required */
+  0,                                   /* properties_provided */
+  0,                                   /* properties_destroyed */
+  0,                                   /* todo_flags_start */
+  TODO_dump_func | TODO_verify_loops,  /* todo_flags_finish */
+  0                                    /* letter */    
+};
+
 /* Prefetching.  */
 
 static unsigned int
 tree_ssa_loop_prefetch (void)
 {
-  if (!current_loops)
+  if (number_of_loops () <= 1)
     return 0;
 
   return tree_ssa_prefetch_arrays ();
@@ -511,7 +544,7 @@ struct tree_opt_pass pass_loop_prefetch =
 static unsigned int
 tree_ssa_loop_ivopts (void)
 {
-  if (!current_loops)
+  if (number_of_loops () <= 1)
     return 0;
 
   tree_ssa_iv_optimize ();
@@ -547,9 +580,6 @@ struct tree_opt_pass pass_iv_optimize =
 static unsigned int
 tree_ssa_loop_done (void)
 {
-  if (!current_loops)
-    return 0;
-
   free_numbers_of_iterations_estimates ();
   scev_finalize ();
   loop_optimizer_finalize ();