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]

[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

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