aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Pop <sebastian.pop@amd.com>2010-03-31 18:37:13 +0000
committerSebastian Pop <spop@gcc.gnu.org>2010-03-31 18:37:13 +0000
commitc80a540338e5809cdf058b13e23e30585219a0fa (patch)
tree031cf7376f126a24b28052c5fb0f4f308cc6b474
parentcaaf41d0e86fc020b5a8f0a1a8b6a89d23a07522 (diff)
downloadgcc-c80a540338e5809cdf058b13e23e30585219a0fa.zip
gcc-c80a540338e5809cdf058b13e23e30585219a0fa.tar.gz
gcc-c80a540338e5809cdf058b13e23e30585219a0fa.tar.bz2
canonicalize_loop_ivs should add the IV bump in loop->header.
2010-03-16 Sebastian Pop <sebastian.pop@amd.com> * graphite-sese-to-poly.c (graphite_loop_normal_form): Add the IV bump in loop->header. * tree-flow.h (canonicalize_loop_ivs): Updated declaration. * tree-parloops.c (gen_parallel_loop): Add the IV bump in loop->latch. * tree-ssa-loop-manip.c (canonicalize_loop_ivs): Add a new parameter to switch between adding the IV bump in loop->latch or in loop->header. From-SVN: r157885
-rw-r--r--gcc/ChangeLog.graphite9
-rw-r--r--gcc/graphite-sese-to-poly.c4
-rw-r--r--gcc/tree-flow.h2
-rw-r--r--gcc/tree-parloops.c2
-rw-r--r--gcc/tree-ssa-loop-manip.c12
5 files changed, 20 insertions, 9 deletions
diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index 26801bc..785ded3 100644
--- a/gcc/ChangeLog.graphite
+++ b/gcc/ChangeLog.graphite
@@ -1,5 +1,14 @@
2010-03-16 Sebastian Pop <sebastian.pop@amd.com>
+ * graphite-sese-to-poly.c (graphite_loop_normal_form): Add the IV bump
+ in loop->header.
+ * tree-flow.h (canonicalize_loop_ivs): Updated declaration.
+ * tree-parloops.c (gen_parallel_loop): Add the IV bump in loop->latch.
+ * tree-ssa-loop-manip.c (canonicalize_loop_ivs): Add a new parameter
+ to switch between adding the IV bump in loop->latch or in loop->header.
+
+2010-03-16 Sebastian Pop <sebastian.pop@amd.com>
+
* passes.c (init_optimization_passes): Add pass_copy_prop
after Graphite.
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index 83eff2a..d358137 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -2887,7 +2887,7 @@ graphite_loop_normal_form (loop_p loop)
bool known_niter = number_of_iterations_exit (loop, exit, &niter, false);
- /* At this point we should know the number of iterations, */
+ /* At this point we should know the number of iterations. */
gcc_assert (known_niter);
nit = force_gimple_operand (unshare_expr (niter.niter), &stmts, true,
@@ -2895,7 +2895,7 @@ graphite_loop_normal_form (loop_p loop)
if (stmts)
gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
- loop->single_iv = canonicalize_loop_ivs (loop, &nit);
+ loop->single_iv = canonicalize_loop_ivs (loop, &nit, false);
}
/* Rewrite all the loops of SCOP in normal form: one induction
diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h
index e39658a..032ecaa 100644
--- a/gcc/tree-flow.h
+++ b/gcc/tree-flow.h
@@ -694,7 +694,7 @@ unsigned int tree_unroll_loops_completely (bool, bool);
unsigned int tree_ssa_prefetch_arrays (void);
void tree_ssa_iv_optimize (void);
unsigned tree_predictive_commoning (void);
-tree canonicalize_loop_ivs (struct loop *, tree *);
+tree canonicalize_loop_ivs (struct loop *, tree *, bool);
bool parallelize_loops (void);
bool loop_only_exit_p (const struct loop *, const_edge);
diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c
index 885a713..3563831 100644
--- a/gcc/tree-parloops.c
+++ b/gcc/tree-parloops.c
@@ -1626,7 +1626,7 @@ gen_parallel_loop (struct loop *loop, htab_t reduction_list,
free_original_copy_tables ();
/* Base all the induction variables in LOOP on a single control one. */
- canonicalize_loop_ivs (loop, &nit);
+ canonicalize_loop_ivs (loop, &nit, true);
/* Ensure that the exit condition is the first statement in the loop. */
transform_to_exit_first_loop (loop, reduction_list, nit);
diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c
index 7c54c87..7818f5b 100644
--- a/gcc/tree-ssa-loop-manip.c
+++ b/gcc/tree-ssa-loop-manip.c
@@ -1181,11 +1181,13 @@ rewrite_all_phi_nodes_with_iv (loop_p loop, tree main_iv)
compared with *NIT. When the IV type precision has to be larger
than *NIT type precision, *NIT is converted to the larger type, the
conversion code is inserted before the loop, and *NIT is updated to
- the new definition. The induction variable is incremented in the
- loop latch. Return the induction variable that was created. */
+ the new definition. When BUMP_IN_LATCH is true, the induction
+ variable is incremented in the loop latch, otherwise it is
+ incremented in the loop header. Return the induction variable that
+ was created. */
tree
-canonicalize_loop_ivs (struct loop *loop, tree *nit)
+canonicalize_loop_ivs (struct loop *loop, tree *nit, bool bump_in_latch)
{
unsigned precision = TYPE_PRECISION (TREE_TYPE (*nit));
unsigned original_precision = precision;
@@ -1215,9 +1217,9 @@ canonicalize_loop_ivs (struct loop *loop, tree *nit)
gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
}
- gsi = gsi_last_bb (loop->latch);
+ gsi = gsi_last_bb (bump_in_latch ? loop->latch : loop->header);
create_iv (build_int_cst_type (type, 0), build_int_cst (type, 1), NULL_TREE,
- loop, &gsi, true, &var_before, NULL);
+ loop, &gsi, bump_in_latch, &var_before, NULL);
rewrite_all_phi_nodes_with_iv (loop, var_before);