summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ChangeLog.graphite5
-rw-r--r--gcc/graphite-sese-to-poly.c54
3 files changed, 15 insertions, 49 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 96370069f4e..3e634e76a61 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2010-08-02 Sebastian Pop <sebastian.pop@amd.com>
+ * graphite-sese-to-poly.c (rewrite_phi_out_of_ssa): Always insert out
+ of SSA copies on edges except for loop->latch.
+
+2010-08-02 Sebastian Pop <sebastian.pop@amd.com>
+
* graphite-sese-to-poly.c (rewrite_cross_bb_scalar_deps_out_of_ssa):
Split out of rewrite_reductions_out_of_ssa.
* graphite-sese-to-poly.h (rewrite_cross_bb_scalar_deps_out_of_ssa):
diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index 0d64cc312ac..47cf9244d32 100644
--- a/gcc/ChangeLog.graphite
+++ b/gcc/ChangeLog.graphite
@@ -1,5 +1,10 @@
2010-06-23 Sebastian Pop <sebastian.pop@amd.com>
+ * graphite-sese-to-poly.c (rewrite_phi_out_of_ssa): Always insert out
+ of SSA copies on edges except for loop->latch.
+
+2010-06-23 Sebastian Pop <sebastian.pop@amd.com>
+
* graphite-sese-to-poly.c (rewrite_cross_bb_scalar_deps_out_of_ssa):
Split out of rewrite_reductions_out_of_ssa.
* graphite-sese-to-poly.h (rewrite_cross_bb_scalar_deps_out_of_ssa):
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index 8bcd6848465..75879ed7e0c 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -2246,58 +2246,14 @@ rewrite_phi_out_of_ssa (gimple_stmt_iterator *psi)
for (i = 0; i < gimple_phi_num_args (phi); i++)
{
tree arg = gimple_phi_arg_def (phi, i);
+ edge e = gimple_phi_arg_edge (phi, i);
- /* Try to avoid the insertion on edges as much as possible: this
- would avoid the insertion of code on loop latch edges, making
- the pattern matching of the vectorizer happy, or it would
- avoid the insertion of useless basic blocks. Note that it is
- incorrect to insert out of SSA copies close by their
- definition when they are more than two loop levels apart:
- for example, starting from a double nested loop
-
- | a = ...
- | loop_1
- | loop_2
- | b = phi (a, c)
- | c = ...
- | end_2
- | end_1
-
- the following transform is incorrect
-
- | a = ...
- | Red[0] = a
- | loop_1
- | loop_2
- | b = Red[0]
- | c = ...
- | Red[0] = c
- | end_2
- | end_1
-
- whereas inserting the copy on the incoming edge is correct
-
- | a = ...
- | loop_1
- | Red[0] = a
- | loop_2
- | b = Red[0]
- | c = ...
- | Red[0] = c
- | end_2
- | end_1
- */
- if (TREE_CODE (arg) == SSA_NAME
- && is_gimple_reg (arg)
- && gimple_bb (SSA_NAME_DEF_STMT (arg))
- && (flow_bb_inside_loop_p (bb->loop_father,
- gimple_bb (SSA_NAME_DEF_STMT (arg)))
- || flow_bb_inside_loop_p (loop_outer (bb->loop_father),
- gimple_bb (SSA_NAME_DEF_STMT (arg)))))
+ /* Avoid the insertion of code in the loop latch to please the
+ pattern matching of the vectorizer. */
+ if (e->src == bb->loop_father->latch)
insert_out_of_ssa_copy (zero_dim_array, arg, SSA_NAME_DEF_STMT (arg));
else
- insert_out_of_ssa_copy_on_edge (gimple_phi_arg_edge (phi, i),
- zero_dim_array, arg);
+ insert_out_of_ssa_copy_on_edge (e, zero_dim_array, arg);
}
var = force_gimple_operand (zero_dim_array, &stmts, true, NULL_TREE);