cfgloop.c (alloc_loop): Initialize loop->single_iv.
authorSebastian Pop <sebastian.pop@amd.com>
Wed, 25 Nov 2009 05:24:14 +0000 (05:24 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Wed, 25 Nov 2009 05:24:14 +0000 (05:24 +0000)
2009-10-22  Sebastian Pop  <sebastian.pop@amd.com>

* cfgloop.c (alloc_loop): Initialize loop->single_iv.
* cfgloop.h (struct loop): New field single_iv.

* graphite-clast-to-gimple.c (pbb_to_depth_to_oldiv): Do not use
loop->aux anymore: use loop->single_iv.
(graphite_loop_normal_form): Moved...
(build_graphite_loop_normal_form): Removed.
(gloog): Do not call build_graphite_loop_normal_form.
(free_aux_in_new_loops): Moved...
(mark_loops_parallel): Restructure.
* graphite-clast-to-gimple.h (free_aux_in_new_loops): Do not declare.
* graphite-sese-to-poly.c (graphite_loop_normal_form): ...here.
(scop_canonicalize_loops): New.
(build_poly_scop): Call scop_canonicalize_loops.
* graphite.c (free_aux_in_new_loops): ...here.

From-SVN: r154624

gcc/ChangeLog.graphite
gcc/cfgloop.c
gcc/cfgloop.h
gcc/graphite-clast-to-gimple.c
gcc/graphite-clast-to-gimple.h
gcc/graphite-sese-to-poly.c
gcc/graphite.c

index e26c717..a4f2ed0 100644 (file)
@@ -1,5 +1,23 @@
 2009-10-22  Sebastian Pop  <sebastian.pop@amd.com>
 
+       * cfgloop.c (alloc_loop): Initialize loop->single_iv.
+       * cfgloop.h (struct loop): New field single_iv.
+
+       * graphite-clast-to-gimple.c (pbb_to_depth_to_oldiv): Do not use
+       loop->aux anymore: use loop->single_iv.
+       (graphite_loop_normal_form): Moved...
+       (build_graphite_loop_normal_form): Removed.
+       (gloog): Do not call build_graphite_loop_normal_form.
+       (free_aux_in_new_loops): Moved...
+       (mark_loops_parallel): Restructure.
+       * graphite-clast-to-gimple.h (free_aux_in_new_loops): Do not declare.
+       * graphite-sese-to-poly.c (graphite_loop_normal_form): ...here.
+       (scop_canonicalize_loops): New.
+       (build_poly_scop): Call scop_canonicalize_loops.
+       * graphite.c (free_aux_in_new_loops): ...here.
+
+2009-10-22  Sebastian Pop  <sebastian.pop@amd.com>
+
        * g++.dg/graphite/graphite.exp: Add the same rules as in
        gcc.dg/graphite/graphite.exp.
 
index b9af098..0f6e797 100644 (file)
@@ -339,6 +339,7 @@ alloc_loop (void)
   loop->exits = GGC_CNEW (struct loop_exit);
   loop->exits->next = loop->exits->prev = loop->exits;
   loop->can_be_parallel = false;
+  loop->single_iv = NULL_TREE;
 
   return loop;
 }
index 4abdf8b..7645207 100644 (file)
@@ -160,6 +160,10 @@ struct GTY ((chain_next ("%h.next"))) loop {
 
   /* True if the loop can be parallel.  */
   bool can_be_parallel;
+
+  /* The single induction variable of the loop when the loop is in
+     normal form.  */
+  tree single_iv;
 };
 
 /* Flags for state of loop structure.  */
index 795bb6a..693e61c 100644 (file)
@@ -76,7 +76,7 @@ pbb_to_depth_to_oldiv (poly_bb_p pbb, int depth)
   sese region = SCOP_REGION (PBB_SCOP (pbb));
   loop_p loop = gbb_loop_at_index (gbb, region, depth);
 
-  return (tree) loop->aux;
+  return loop->single_iv;
 }
 
 /* For a given scattering dimension, return the new induction variable
@@ -1109,43 +1109,6 @@ debug_generated_program (scop_p scop)
   print_generated_program (stderr, scop);
 }
 
-/* A LOOP is in normal form for Graphite when it contains only one
-   scalar phi node that defines the main induction variable of the
-   loop, only one increment of the IV, and only one exit condition.  */
-
-static void
-graphite_loop_normal_form (loop_p loop)
-{
-  struct tree_niter_desc niter;
-  tree nit;
-  gimple_seq stmts;
-  edge exit = single_dom_exit (loop);
-
-  bool known_niter = number_of_iterations_exit (loop, exit, &niter, false);
-
-  /* At this point we should know the number of iterations,  */
-  gcc_assert (known_niter);
-
-  nit = force_gimple_operand (unshare_expr (niter.niter), &stmts, true,
-                             NULL_TREE);
-  if (stmts)
-    gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
-
-  loop->aux = canonicalize_loop_ivs (loop, &nit);
-}
-
-/* Converts REGION to loop normal form: one induction variable per loop.  */
-
-static void
-build_graphite_loop_normal_form (sese region)
-{
-  int i;
-  loop_p loop;
-
-  for (i = 0; VEC_iterate (loop_p, SESE_LOOP_NEST (region), i, loop); i++)
-    graphite_loop_normal_form (loop);
-}
-
 /* GIMPLE Loop Generator: generates loops from STMT in GIMPLE form for
    the given SCOP.  Return true if code generation succeeded.
    BB_PBB_MAPPING is a basic_block and it's related poly_bb_p mapping.
@@ -1173,7 +1136,6 @@ gloog (scop_p scop, htab_t bb_pbb_mapping)
       fprintf (dump_file, "\n");
     }
 
-  build_graphite_loop_normal_form (region);
   recompute_all_dominators ();
   graphite_verify ();
 
@@ -1234,23 +1196,6 @@ find_pbb_via_hash (htab_t bb_pbb_mapping, basic_block bb)
   return NULL;
 }
 
-/* Free loop->aux in newly created loops by translate_clast.  */
-
-void
-free_aux_in_new_loops (void)
-{
-  loop_p loop;
-  loop_iterator li;
-
-  FOR_EACH_LOOP (li, loop, 0)
-    {
-      if (!loop->aux)
-       continue;
-      free(loop->aux);
-      loop->aux = NULL;
-    }
-}
-
 /* Check data dependency in LOOP. BB_PBB_MAPPING is a basic_block and
    it's related poly_bb_p mapping.
 */
@@ -1302,22 +1247,16 @@ void mark_loops_parallel (htab_t bb_pbb_mapping)
   int num_no_dependency = 0;
 
   FOR_EACH_LOOP (li, loop, 0)
-    {
-      if (!loop->aux)
-       continue;
-
-      if (!dependency_in_loop_p (loop, bb_pbb_mapping))
-       {
-         loop->can_be_parallel = true;
-         num_no_dependency++;
-       }
-    }
+    if (loop->aux
+       && !dependency_in_loop_p (loop, bb_pbb_mapping))
+      {
+       loop->can_be_parallel = true;
+       num_no_dependency++;
+      }
 
   if (dump_file && (dump_flags & TDF_DETAILS))
-    {
-      fprintf (dump_file, "\n%d loops carried no dependency.\n",
-              num_no_dependency);
-    }
+    fprintf (dump_file, "\n%d loops carried no dependency.\n",
+            num_no_dependency);
 }
 
 #endif
index e0ae6ee..3f25872 100644 (file)
@@ -42,7 +42,6 @@ extern void debug_clast_stmt (struct clast_stmt *);
 extern void print_clast_stmt (FILE *, struct clast_stmt *);
 extern void debug_clast_name_indexes (htab_t);
 extern void mark_loops_parallel (htab_t);
-extern void free_aux_in_new_loops (void);
 
 /* Hash function for data base element BB_PBB.  */
 
index ac8c024..8adffce 100644 (file)
@@ -2822,6 +2822,45 @@ rewrite_commutative_reductions_out_of_ssa (sese region, sbitmap reductions)
 #endif
 }
 
+/* A LOOP is in normal form for Graphite when it contains only one
+   scalar phi node that defines the main induction variable of the
+   loop, only one increment of the IV, and only one exit condition.  */
+
+static void
+graphite_loop_normal_form (loop_p loop)
+{
+  struct tree_niter_desc niter;
+  tree nit;
+  gimple_seq stmts;
+  edge exit = single_dom_exit (loop);
+
+  bool known_niter = number_of_iterations_exit (loop, exit, &niter, false);
+
+  /* At this point we should know the number of iterations,  */
+  gcc_assert (known_niter);
+
+  nit = force_gimple_operand (unshare_expr (niter.niter), &stmts, true,
+                             NULL_TREE);
+  if (stmts)
+    gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
+
+  loop->single_iv = canonicalize_loop_ivs (loop, &nit);
+}
+
+/* Rewrite all the loops of SCOP in normal form: one induction
+   variable per loop.  */
+
+static void
+scop_canonicalize_loops (scop_p scop)
+{
+  loop_iterator li;
+  loop_p loop;
+
+  FOR_EACH_LOOP (li, loop, 0)
+    if (loop_in_sese_p (loop, SCOP_REGION (scop)))
+      graphite_loop_normal_form (loop);
+}
+
 /* Builds the polyhedral representation for a SESE region.  */
 
 bool
@@ -2843,6 +2882,7 @@ build_poly_scop (scop_p scop)
   if (nb_pbbs_in_loops (scop) == 0)
     return false;
 
+  scop_canonicalize_loops (scop);
   build_sese_loop_nests (region);
   build_sese_conditions (region);
   find_scop_parameters (scop);
index 8cb61d2..291a1fe 100644 (file)
@@ -220,6 +220,22 @@ graphite_initialize (void)
   return true;
 }
 
+/* Free loop->aux in newly created loops by translate_clast.  */
+
+static void
+free_aux_in_new_loops (void)
+{
+  loop_p loop;
+  loop_iterator li;
+
+  FOR_EACH_LOOP (li, loop, 0)
+    if (loop->aux)
+      {
+       free (loop->aux);
+       loop->aux = NULL;
+      }
+}
+
 /* Finalize graphite: perform CFG cleanup when NEED_CFG_CLEANUP_P is
    true.  */