[committed] Fix debug stmt handling in omp-simd-clone.c (PR tree-optimization/87898)

Jakub Jelinek jakub@redhat.com
Wed Nov 14 00:06:00 GMT 2018


Hi!

Gimple debug binds (both normal and source) need to have a decl as the first
operand.  The simd clone adjustment code would in some cases transform that
into an ARRAY_REF.  The following patch removes such debug stmts.
In the future we could have a VAR_DECL with DECL_ABSTRACT_ORIGIN pointing to
the PARM_DECL that isn't there and debug stmts for it at the start say
for the array[0], but before that is really worth doing we need to think
what we are going to do with debug info in vectorized loops.

So for now just this patch.  Bootstrapped/regtested on x86_64-linux and
i686-linux, committed to trunk.

2018-11-13  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/87898
	* omp-simd-clone.c (ipa_simd_modify_stmt_ops): Formatting fix.
	(ipa_simd_modify_function_body): Remove debug stmts where the first
	argument was changed into a non-decl.

	* gcc.dg/gomp/pr87898.c: New test.

--- gcc/omp-simd-clone.c.jj	2018-10-31 10:33:08.994660342 +0100
+++ gcc/omp-simd-clone.c	2018-11-13 16:47:35.249022270 +0100
@@ -834,11 +834,8 @@ ipa_simd_modify_stmt_ops (tree *tp, int
   struct ipa_parm_adjustment *cand = NULL;
   if (TREE_CODE (*tp) == PARM_DECL)
     cand = ipa_get_adjustment_candidate (&tp, NULL, info->adjustments, true);
-  else
-    {
-      if (TYPE_P (*tp))
-	*walk_subtrees = 0;
-    }
+  else if (TYPE_P (*tp))
+    *walk_subtrees = 0;
 
   tree repl = NULL_TREE;
   if (cand)
@@ -1014,6 +1011,21 @@ ipa_simd_modify_function_body (struct cg
 	  if (info.modified)
 	    {
 	      update_stmt (stmt);
+	      /* If the above changed the var of a debug bind into something
+		 different, remove the debug stmt.  We could also for all the
+		 replaced parameters add VAR_DECLs for debug info purposes,
+		 add debug stmts for those to be the simd array accesses and
+		 replace debug stmt var operand with that var.  Debugging of
+		 vectorized loops doesn't work too well, so don't bother for
+		 now.  */
+	      if ((gimple_debug_bind_p (stmt)
+		   && !DECL_P (gimple_debug_bind_get_var (stmt)))
+		  || (gimple_debug_source_bind_p (stmt)
+		      && !DECL_P (gimple_debug_source_bind_get_var (stmt))))
+		{
+		  gsi_remove (&gsi, true);
+		  continue;
+		}
 	      if (maybe_clean_eh_stmt (stmt))
 		gimple_purge_dead_eh_edges (gimple_bb (stmt));
 	    }
--- gcc/testsuite/gcc.dg/gomp/pr87898.c.jj	2018-11-13 16:49:13.621413907 +0100
+++ gcc/testsuite/gcc.dg/gomp/pr87898.c	2018-11-13 16:48:33.584068511 +0100
@@ -0,0 +1,10 @@
+/* PR tree-optimization/87898 */
+/* { dg-do compile { target fgraphite } } */
+/* { dg-options "-O1 -floop-parallelize-all -fopenmp -ftree-parallelize-loops=2 -g" } */
+
+#pragma omp declare simd
+void
+foo (int x)
+{
+  x = 0;
+}

	Jakub



More information about the Gcc-patches mailing list