OSDN Git Service

Always insert out of SSA copies on edges except for loop->latch.
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Aug 2010 20:25:11 +0000 (20:25 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Aug 2010 20:25:11 +0000 (20:25 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163123 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ChangeLog.graphite
gcc/graphite-sese-to-poly.c

index 9637006..3e634e7 100644 (file)
@@ -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):
index 0d64cc3..47cf924 100644 (file)
@@ -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):
index 8bcd684..75879ed 100644 (file)
@@ -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);