This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix nonoverlapping_memrefs_p ICE (PR target/77834)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Richard Biener <rguenther at suse dot de>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 31 Oct 2016 22:52:44 +0100
- Subject: [PATCH] Fix nonoverlapping_memrefs_p ICE (PR target/77834)
- Authentication-results: sourceware.org; auth=none
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
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