diff mbox

[41/65] Special case non close-phi nodes with one argument in rewrite_close_phi_out_of_ssa.

Message ID 1280780438-17543-42-git-send-email-sebpop@gmail.com
State New
Headers show

Commit Message

Sebastian Pop Aug. 2, 2010, 8:20 p.m. UTC
From: spop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>

2010-07-15  Sebastian Pop  <sebastian.pop@amd.com>

	* graphite-sese-to-poly.c (rewrite_close_phi_out_of_ssa): Special
	case non close-phi nodes with one argument.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/graphite@162249 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog               |    5 +++++
 gcc/ChangeLog.graphite      |    5 +++++
 gcc/graphite-sese-to-poly.c |   28 ++++++++++++++++++++--------
 3 files changed, 30 insertions(+), 8 deletions(-)
diff mbox

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 524376d..07ee095 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_close_phi_out_of_ssa): Special
+	case non close-phi nodes with one argument.
+
+2010-08-02  Sebastian Pop  <sebastian.pop@amd.com>
+
 	* sese.h (scev_analyzable_p): Scevs could be expressions without
 	chrecs and still be scev_analyzable_p.
 
diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index a93e035..965ed25 100644
--- a/gcc/ChangeLog.graphite
+++ b/gcc/ChangeLog.graphite
@@ -1,5 +1,10 @@ 
 2010-07-15  Sebastian Pop  <sebastian.pop@amd.com>
 
+	* graphite-sese-to-poly.c (rewrite_close_phi_out_of_ssa): Special
+	case non close-phi nodes with one argument.
+
+2010-07-15  Sebastian Pop  <sebastian.pop@amd.com>
+
 	* sese.h (scev_analyzable_p): Scevs could be expressions without
 	chrecs and still be scev_analyzable_p.
 
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index 5a8db3d..bea9c9f 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -2203,22 +2203,34 @@  rewrite_close_phi_out_of_ssa (gimple_stmt_iterator *psi)
   gimple phi = gsi_stmt (*psi);
   tree res = gimple_phi_result (phi);
   tree var = SSA_NAME_VAR (res);
-  tree zero_dim_array = create_zero_dim_array (var, "Close_Phi");
-  gimple_stmt_iterator gsi = gsi_after_labels (gimple_bb (phi));
-  gimple stmt = gimple_build_assign (res, zero_dim_array);
+  basic_block bb = gimple_bb (phi);
+  gimple_stmt_iterator gsi = gsi_after_labels (bb);
   tree arg = gimple_phi_arg_def (phi, 0);
+  gimple stmt;
 
   /* Note that loop close phi nodes should have a single argument
      because we translated the representation into a canonical form
      before Graphite: see canonicalize_loop_closed_ssa_form.  */
   gcc_assert (gimple_phi_num_args (phi) == 1);
 
-  if (TREE_CODE (arg) == SSA_NAME
-      && !SSA_NAME_IS_DEFAULT_DEF (arg))
-    insert_out_of_ssa_copy (zero_dim_array, arg, SSA_NAME_DEF_STMT (arg));
+  /* The phi node can be a non close phi node, when its argument is
+     invariant, or when it is defined in the same loop as the phi node.  */
+  if (is_gimple_min_invariant (arg)
+      || gimple_bb (SSA_NAME_DEF_STMT (arg))->loop_father == bb->loop_father)
+    stmt = gimple_build_assign (res, arg);
   else
-    insert_out_of_ssa_copy_on_edge (single_pred_edge (gimple_bb (phi)),
-				    zero_dim_array, arg);
+    {
+      tree zero_dim_array = create_zero_dim_array (var, "Close_Phi");
+
+      stmt = gimple_build_assign (res, zero_dim_array);
+
+      if (TREE_CODE (arg) == SSA_NAME
+	  && !SSA_NAME_IS_DEFAULT_DEF (arg))
+	insert_out_of_ssa_copy (zero_dim_array, arg, SSA_NAME_DEF_STMT (arg));
+      else
+	insert_out_of_ssa_copy_on_edge (single_pred_edge (bb),
+					zero_dim_array, arg);
+    }
 
   remove_phi_node (psi, false);
   gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);