Hi! On Wed, Nov 02, 2016 at 10:46:40AM +0100, Richard Biener wrote: > Yeah, plus if a followup test would have disambiguated things (the > dispatch to the tree oracle for example).
After discussing this on IRC that the dse.c and sched-deps.c (call (mem ...) ) changes are probably not safe, I'm proposing following patch which should be safe to backport to release branches too, the only occurrences of !DECL_RTL_SET_P where DECL_RTL worked fine in my bootstraps/regtests were FUNCTION_DECLs, so the patch should only turn ICEs into returning the safe return value that the expressions might overlap. If/once this is in, I'm planning to test/submit a patch adding /* If one decl is known to be a function or label in a function and the other is some kind of data, they can't overlap. */ if ((TREE_CODE (exprx) == FUNCTION_DECL || TREE_CODE (exprx) == LABEL_DECL) != (TREE_CODE (expry) == FUNCTION_DECL || TREE_CODE (expry) == LABEL_DECL)) return 1; before that. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-11-04 Jakub Jelinek <ja...@redhat.com> PR target/77834 * alias.c (nonoverlapping_memrefs_p): Return 0 if exprx or expry doesn't have rtl set. * 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,13 @@ nonoverlapping_memrefs_p (const_rtx x, c || TREE_CODE (expry) == CONST_DECL) return 1; + /* If either of the decls doesn't have DECL_RTL set (e.g. marked as + living in multiple places), we can't tell anything. Exception + are FUNCTION_DECLs for which we can create DECL_RTL on demand. */ + if ((!DECL_RTL_SET_P (exprx) && TREE_CODE (exprx) != FUNCTION_DECL) + || (!DECL_RTL_SET_P (expry) && TREE_CODE (expry) != FUNCTION_DECL)) + 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