This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Fix PR43984, PRE misses full redundancies


On Wed, May 5, 2010 at 11:23, Michael Matz <matz@suse.de> wrote:
> Hi,
>
> [Sebastian, you're CCEd because of a graphite bug exposed with parts of
> this patch]

Thanks for pointing this to me.

> To fix the testcase only the movement in execute_pre() is necessary.
> Doing just that will expose a bug in graphite in that it can't handle some
> invariant PHI nodes which aren't loop entry PHIs. ?The uses of
> loop_entry_phi_arg in remove_invariant_phi (via reduction_phi_p) seem
> confused in that they don't expect PHIs inside loops that happen to be
> loop invariant.
>

Fixed in the attached patch.  I will commit this to the graphite branch for
further testing.

Sebastian
From 8b7aa674ad6d8d873e6a1fe2ecdd05ca0ee17a7d Mon Sep 17 00:00:00 2001
From: Sebastian Pop <sebpop@gmail.com>
Date: Fri, 7 May 2010 13:00:54 -0500
Subject: [PATCH] Fix invariant phi node removal.

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

	* graphite-sese-to-poly.c (loop_entry_phi_arg): Renamed
	phi_arg_in_outermost_loop.
	(remove_simple_copy_phi): Call phi_arg_in_outermost_loop.
	(remove_invariant_phi): Same.
---
 gcc/ChangeLog.graphite      |    7 +++++++
 gcc/graphite-sese-to-poly.c |   20 +++++++++++---------
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index 1d3c91e..4bce20c 100644
--- a/gcc/ChangeLog.graphite
+++ b/gcc/ChangeLog.graphite
@@ -1,3 +1,10 @@
+2010-05-07  Sebastian Pop  <sebastian.pop@amd.com>
+
+	* graphite-sese-to-poly.c (loop_entry_phi_arg): Renamed
+	phi_arg_in_outermost_loop.
+	(remove_simple_copy_phi): Call phi_arg_in_outermost_loop.
+	(remove_invariant_phi): Same.
+
 2010-04-12  Andreas Simbuerger  <simbuerg@fim.uni-passau.de>
 
 	* graphite-blocking.c
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index e2d4192..6f3f8aa 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -73,21 +73,23 @@ var_used_in_not_loop_header_phi_node (tree var)
   return result;
 }
 
-/* Returns the index of the phi argument corresponding to the initial
-   value in the loop.  */
+/* Returns the index of the PHI argument defined in the outermost
+   loop.  */
 
 static size_t
-loop_entry_phi_arg (gimple phi)
+phi_arg_in_outermost_loop (gimple phi)
 {
   loop_p loop = gimple_bb (phi)->loop_father;
-  size_t i;
+  size_t i, res = 0;
 
   for (i = 0; i < gimple_phi_num_args (phi); i++)
     if (!flow_bb_inside_loop_p (loop, gimple_phi_arg_edge (phi, i)->src))
-      return i;
+      {
+	loop = gimple_phi_arg_edge (phi, i)->src->loop_father;
+	res = i;
+      }
 
-  gcc_unreachable ();
-  return 0;
+  return res;
 }
 
 /* Removes a simple copy phi node "RES = phi (INIT, RES)" at position
@@ -98,7 +100,7 @@ remove_simple_copy_phi (gimple_stmt_iterator *psi)
 {
   gimple phi = gsi_stmt (*psi);
   tree res = gimple_phi_result (phi);
-  size_t entry = loop_entry_phi_arg (phi);
+  size_t entry = phi_arg_in_outermost_loop (phi);
   tree init = gimple_phi_arg_def (phi, entry);
   gimple stmt = gimple_build_assign (res, init);
   edge e = gimple_phi_arg_edge (phi, entry);
@@ -118,7 +120,7 @@ remove_invariant_phi (sese region, gimple_stmt_iterator *psi)
   loop_p loop = loop_containing_stmt (phi);
   tree res = gimple_phi_result (phi);
   tree scev = scalar_evolution_in_region (region, loop, res);
-  size_t entry = loop_entry_phi_arg (phi);
+  size_t entry = phi_arg_in_outermost_loop (phi);
   edge e = gimple_phi_arg_edge (phi, entry);
   tree var;
   gimple stmt;
-- 
1.6.3.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]