This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR50183
- From: "William J. Schmidt" <wschmidt at linux dot vnet dot ibm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: bergner at vnet dot ibm dot com
- Date: Tue, 13 Sep 2011 17:55:54 -0500
- Subject: [PATCH] Fix PR50183
Greetings,
The code to build scops (static control parts) for graphite first
rewrites loops into canonical loop-closed SSA form. PR50183 identifies
a scenario where the results do not fulfill all required invariants of
this form. In particular, a value defined inside a loop and used
outside that loop must reach exactly one definition, which must be a
single-argument PHI node called a close-phi. When nested loops exist,
it is possible that, following the rewrite, a definition may reach two
close-phis. This patch corrects that problem.
The problem arises because loops are processed from outside in. While
processing a loop, duplicate close-phis are eliminated. However,
eliminating duplicate close-phis for an inner loop can sometimes create
duplicate close-phis for an already-processed outer loop. This patch
detects when this may have occurred and repeats the removal of duplicate
close-phis as necessary.
The problem was noted on ibm/4_6-branch and 4_6-branch; it is apparently
latent on trunk. The same patch can be applied to all three branches.
Bootstrapped and regression-tested on powerpc64-linux. OK to commit to
these three branches?
Thanks,
Bill
2011-09-13 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* graphite-scop-detection.c (make_close_phi_nodes_unique): New
forward declaration.
(remove_duplicate_close_phi): Detect and repair creation of
duplicate close-phis for a containing loop.
Index: gcc/graphite-scop-detection.c
===================================================================
--- gcc/graphite-scop-detection.c (revision 178829)
+++ gcc/graphite-scop-detection.c (working copy)
@@ -30,6 +30,9 @@ along with GCC; see the file COPYING3. If not see
#include "tree-pass.h"
#include "sese.h"
+/* Forward declarations. */
+static void make_close_phi_nodes_unique (basic_block);
+
#ifdef HAVE_cloog
#include "ppl_c.h"
#include "graphite-ppl.h"
@@ -1231,6 +1234,13 @@ remove_duplicate_close_phi (gimple phi, gimple_stm
SET_USE (use_p, res);
update_stmt (use_stmt);
+
+ /* It is possible that we just created a duplicate close-phi
+ for an already-processed containing loop. Check for this
+ case and clean it up. */
+ if (gimple_code (use_stmt) == GIMPLE_PHI
+ && gimple_phi_num_args (use_stmt) == 1)
+ make_close_phi_nodes_unique (gimple_bb (use_stmt));
}
remove_phi_node (gsi, true);