This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[vta, graphite, PR41888, PR41886] get graphite to work with VTA
- From: Alexandre Oliva <aoliva at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 08 Nov 2009 06:22:15 -0200
- Subject: [vta, graphite, PR41888, PR41886] get graphite to work with VTA
This patch adds VTA support to the graphite code.
Besides the expected need for skipping or ignoring debug stmts here and
there, this required debug uses outside rearranged loops to be detected
and reset if there aren't non-debug uses that would have introduced PHI
nodes at join points that would enable them to work.
This patch passed bootstrap-compare on x86_64-linux-gnu along with the
two patches I've just posted, with an additional patch that enabled
flag_graphite at -O2. Building libraries mostly worked; the exceptions
were a couple of libjava object files that took way too long to compile.
Is this a known issue with graphite, or some interaction with VTA that I
should look into?
Is this ok to install?
I realize there's a simplified testcase in PR41888, but the patch for
propagating degenerate PHI nodes was enough to fix that one, but not the
larger testcases in both PRs. I don't have small testcases fixed
specifically by this patch, but much of it was required by a bootstrap
with graphite enabled, rather than by the PRs.
for gcc/ChangeLog
from Alexandre Oliva <aoliva@redhat.com>
PR debug/41888
PR debug/41886
* graphite-scop-detection.c (stmt_simple_for_scop_p): Debug stmts
are ok.
* graphite-sese-to-poly.c (graphite_stmt_p): Likewise.
(try_generate_gimple_bb): Skip debug stmts when finding data refs.
* sese.c (sese_build_liveouts_bb): Skip debug stmts.
(sese_bad_liveouts_use): New.
(sese_reset_debug_liveouts_bb): New.
(sese_build_liveouts): Use it.
(rename_variables_in_stmt): Reset debug stmts rather than creating
new vars for them.
(expand_scalar_variable_stmt): Likewise.
Index: gcc/graphite-scop-detection.c
===================================================================
--- gcc/graphite-scop-detection.c.orig 2009-11-08 05:09:34.000000000 -0200
+++ gcc/graphite-scop-detection.c 2009-11-08 05:09:58.000000000 -0200
@@ -372,6 +372,9 @@ stmt_simple_for_scop_p (basic_block scop
|| (gimple_code (stmt) == GIMPLE_ASM))
return false;
+ if (is_gimple_debug (stmt))
+ return true;
+
if (!stmt_has_simple_data_refs_p (outermost_loop, stmt))
return false;
Index: gcc/graphite-sese-to-poly.c
===================================================================
--- gcc/graphite-sese-to-poly.c.orig 2009-11-08 05:09:34.000000000 -0200
+++ gcc/graphite-sese-to-poly.c 2009-11-08 05:09:58.000000000 -0200
@@ -232,6 +232,7 @@ graphite_stmt_p (sese region, basic_bloc
switch (gimple_code (stmt))
{
+ case GIMPLE_DEBUG:
/* Control flow expressions can be ignored, as they are
represented in the iteration domains and will be
regenerated by graphite. */
@@ -338,7 +339,11 @@ try_generate_gimple_bb (scop_p scop, bas
gimple_stmt_iterator gsi;
for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
- graphite_find_data_references_in_stmt (nest, gsi_stmt (gsi), &drs);
+ {
+ gimple stmt = gsi_stmt (gsi);
+ if (!is_gimple_debug (stmt))
+ graphite_find_data_references_in_stmt (nest, stmt, &drs);
+ }
if (!graphite_stmt_p (SCOP_REGION (scop), bb, drs))
free_data_refs (drs);
Index: gcc/sese.c
===================================================================
--- gcc/sese.c.orig 2009-11-08 05:09:34.000000000 -0200
+++ gcc/sese.c 2009-11-08 06:11:52.000000000 -0200
@@ -235,8 +235,73 @@ sese_build_liveouts_bb (sese region, bit
PHI_ARG_DEF_FROM_EDGE (gsi_stmt (bsi), e));
for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
- FOR_EACH_SSA_USE_OPERAND (use_p, gsi_stmt (bsi), iter, SSA_OP_ALL_USES)
- sese_build_liveouts_use (region, liveouts, bb, USE_FROM_PTR (use_p));
+ {
+ gimple stmt = gsi_stmt (bsi);
+
+ if (is_gimple_debug (stmt))
+ continue;
+
+ FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
+ sese_build_liveouts_use (region, liveouts, bb, USE_FROM_PTR (use_p));
+ }
+}
+
+/* For a USE in BB, return true if BB is outside REGION and it's not
+ in the LIVEOUTS set. */
+
+static bool
+sese_bad_liveouts_use (sese region, bitmap liveouts, basic_block bb,
+ tree use)
+{
+ unsigned ver;
+ basic_block def_bb;
+
+ if (TREE_CODE (use) != SSA_NAME)
+ return false;
+
+ ver = SSA_NAME_VERSION (use);
+
+ /* If it's in liveouts, the variable will get a new PHI node, and
+ the debug use will be properly adjusted. */
+ if (bitmap_bit_p (liveouts, ver))
+ return false;
+
+ def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
+
+ if (!def_bb
+ || !bb_in_sese_p (def_bb, region)
+ || bb_in_sese_p (bb, region))
+ return false;
+
+ return true;
+}
+
+/* Reset debug stmts that reference SSA_NAMES defined in REGION that
+ are not marked as liveouts. */
+
+static void
+sese_reset_debug_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
+{
+ gimple_stmt_iterator bsi;
+ ssa_op_iter iter;
+ use_operand_p use_p;
+
+ for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
+ {
+ gimple stmt = gsi_stmt (bsi);
+
+ if (!is_gimple_debug (stmt))
+ continue;
+
+ FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
+ if (sese_bad_liveouts_use (region, liveouts, bb,
+ USE_FROM_PTR (use_p)))
+ {
+ gimple_debug_bind_reset_value (stmt);
+ update_stmt (stmt);
+ break;
+ }
+ }
}
/* Build the LIVEOUTS of REGION: the set of variables defined inside
@@ -249,6 +314,9 @@ sese_build_liveouts (sese region, bitmap
FOR_EACH_BB (bb)
sese_build_liveouts_bb (region, liveouts, bb);
+ if (MAY_HAVE_DEBUG_INSNS)
+ FOR_EACH_BB (bb)
+ sese_reset_debug_liveouts_bb (region, liveouts, bb);
}
/* Builds a new SESE region from edges ENTRY and EXIT. */
@@ -534,7 +602,19 @@ rename_variables_in_stmt (gimple stmt, h
|| (TREE_CODE (expr) != SSA_NAME
&& is_gimple_reg (use)))
{
- tree var = create_tmp_var (type_use, "var");
+ tree var;
+
+ if (is_gimple_debug (stmt))
+ {
+ if (gimple_debug_bind_p (stmt))
+ gimple_debug_bind_reset_value (stmt);
+ else
+ gcc_unreachable ();
+
+ break;
+ }
+
+ var = create_tmp_var (type_use, "var");
if (type_use != type_expr)
expr = fold_convert (type_use, expr);
@@ -827,6 +907,16 @@ expand_scalar_variables_stmt (gimple stm
if (use_expr == use)
continue;
+ if (is_gimple_debug (stmt))
+ {
+ if (gimple_debug_bind_p (stmt))
+ gimple_debug_bind_reset_value (stmt);
+ else
+ gcc_unreachable ();
+
+ break;
+ }
+
if (TREE_CODE (use_expr) != SSA_NAME)
{
tree var = create_tmp_var (type, "var");
--
Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/ FSF Latin America board member
Free Software Evangelist Red Hat Brazil Compiler Engineer