This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix nonoverlapping_memrefs_p ICE (PR target/77834)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 2 Nov 2016 10:08:25 +0100 (CET)
- Subject: Re: [PATCH] Fix nonoverlapping_memrefs_p ICE (PR target/77834)
- Authentication-results: sourceware.org; auth=none
- References: <20161031215244.GN3541@tucnak.redhat.com>
On Mon, 31 Oct 2016, Jakub Jelinek wrote:
> 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.
What kind of cases did this trigger on? I would have expected we
have DECL_RTL_SET_P on (almost?) all decls that can have it. And for
those that don't it should be uninteresting to have?
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Hmm. Can you try splitting out a decl_can_have_rtl () predicate
from make_decl_rtl and use that?
Thanks,
Richard.
> 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
>
>
--
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)