aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog.graphite18
-rw-r--r--gcc/cfgloop.c1
-rw-r--r--gcc/cfgloop.h4
-rw-r--r--gcc/graphite-clast-to-gimple.c79
-rw-r--r--gcc/graphite-clast-to-gimple.h1
-rw-r--r--gcc/graphite-sese-to-poly.c40
-rw-r--r--gcc/graphite.c16
7 files changed, 88 insertions, 71 deletions
diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index e26c717..a4f2ed0 100644
--- a/gcc/ChangeLog.graphite
+++ b/gcc/ChangeLog.graphite
@@ -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.
diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c
index b9af098..0f6e797 100644
--- a/gcc/cfgloop.c
+++ b/gcc/cfgloop.c
@@ -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;
}
diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h
index 4abdf8b..7645207 100644
--- a/gcc/cfgloop.h
+++ b/gcc/cfgloop.h
@@ -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. */
diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c
index 795bb6a..693e61c 100644
--- a/gcc/graphite-clast-to-gimple.c
+++ b/gcc/graphite-clast-to-gimple.c
@@ -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
diff --git a/gcc/graphite-clast-to-gimple.h b/gcc/graphite-clast-to-gimple.h
index e0ae6ee..3f25872 100644
--- a/gcc/graphite-clast-to-gimple.h
+++ b/gcc/graphite-clast-to-gimple.h
@@ -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. */
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index ac8c024..8adffce 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -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);
diff --git a/gcc/graphite.c b/gcc/graphite.c
index 8cb61d2..291a1fe 100644
--- a/gcc/graphite.c
+++ b/gcc/graphite.c
@@ -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. */