aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/alias.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr77834.c18
4 files changed, 36 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d062157..7e4a50d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-11-04 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/77834
+ * alias.c (nonoverlapping_memrefs_p): Return 0 if exprx or expry
+ doesn't have rtl set.
+
2016-11-04 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* config/rs6000/rs6000.c (gimple-ssa.h): New #include.
diff --git a/gcc/alias.c b/gcc/alias.c
index ca475ff..fd3dec4 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -2755,6 +2755,13 @@ nonoverlapping_memrefs_p (const_rtx x, const_rtx y, bool loop_invariant)
|| 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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index eae75f1..4ca326b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-04 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/77834
+ * gcc.dg/pr77834.c: New test.
+
2016-11-04 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/67980
diff --git a/gcc/testsuite/gcc.dg/pr77834.c b/gcc/testsuite/gcc.dg/pr77834.c
new file mode 100644
index 0000000..a9085b9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr77834.c
@@ -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;
+}