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]

[PATCH] Fix nonoverlapping_memrefs_p ICE (PR target/77834)


Hi!

Some automatic VAR_DECLs don't get DECL_RTL set - e.g. if its SSA_NAMEs
expand to multiple rtls, then there is not a single one that can be used.
Using DECL_RTL on such VAR_DECLs ICEs.

I've tried to just return 0 in nonoverlapping_memrefs_p if either
DECL_RTL_SET_P (expr{x,y}) wasn't true, but that triggered way too often
during bootstrap/regtest (3800+ times).  So the following patch narrows it
down more and triggers only on the testcase below.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2016-10-31  Jakub Jelinek  <jakub@redhat.com>

	PR target/77834
	* alias.c (nonoverlapping_memrefs_p): Return 0 if exprx or expry
	doesn't have rtl set and it can't be safely created.

	* gcc.dg/pr77834.c: New test.

--- gcc/alias.c.jj	2016-10-21 17:06:27.000000000 +0200
+++ gcc/alias.c	2016-10-31 11:38:29.448031590 +0100
@@ -2755,6 +2755,27 @@ nonoverlapping_memrefs_p (const_rtx x, c
       || TREE_CODE (expry) == CONST_DECL)
     return 1;
 
+  /* Don't try to create RTL for decls that intentionally don't have
+     DECL_RTL set (e.g. marked as living in multiple places).  */
+  if (!DECL_RTL_SET_P (exprx))
+    {
+      if (TREE_CODE (exprx) == PARM_DECL
+	  || TREE_CODE (exprx) == RESULT_DECL
+	  || (VAR_P (exprx)
+	      && !TREE_STATIC (exprx)
+	      && !DECL_EXTERNAL (exprx)))
+	return 0;
+    }
+  if (!DECL_RTL_SET_P (expry))
+    {
+      if (TREE_CODE (expry) == PARM_DECL
+	  || TREE_CODE (expry) == RESULT_DECL
+	  || (VAR_P (expry)
+	      && !TREE_STATIC (expry)
+	      && !DECL_EXTERNAL (expry)))
+	return 0;
+    }
+
   rtlx = DECL_RTL (exprx);
   rtly = DECL_RTL (expry);
 
--- gcc/testsuite/gcc.dg/pr77834.c.jj	2016-10-31 11:41:46.290521464 +0100
+++ gcc/testsuite/gcc.dg/pr77834.c	2016-10-31 11:41:24.000000000 +0100
@@ -0,0 +1,18 @@
+/* PR target/77834 */
+/* { dg-do compile } */
+/* { dg-options "-O -ftree-pre -Wno-psabi" } */
+/* { dg-additional-options "-mstringop-strategy=libcall" { target i?86-*-* x86_64-*-* } } */
+
+typedef int V __attribute__ ((vector_size (64)));
+
+V
+foo (V u, V v, int w)
+{
+  do
+    {
+      if (u[0]) v ^= u[w];
+    }
+  while ((V) { 0, u[w] }[1]);
+  u = (V) { v[v[0]], u[u[0]] };
+  return v + u;
+}

	Jakub


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