re PR target/77834 (ICE: in make_decl_rtl, at varasm.c:1311 with -O -ftree-pre -mstri...
authorJakub Jelinek <jakub@redhat.com>
Mon, 7 Nov 2016 13:33:37 +0000 (14:33 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 7 Nov 2016 13:33:37 +0000 (14:33 +0100)
PR target/77834
* alias.c (nonoverlapping_memrefs_p): If one decl is
FUNCTION_DECL or LABEL_DECL and the other is not, return 1.

From-SVN: r241905

gcc/ChangeLog
gcc/alias.c

index 9714a07dbe0521f44ddc51aa901b4a04119d3e83..34e88da56420b409b5c2fd8e26b6328f7fec410b 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/77834
+       * alias.c (nonoverlapping_memrefs_p): If one decl is
+       FUNCTION_DECL or LABEL_DECL and the other is not, return 1.
+
 2016-11-07  Richard Biener  <rguenther@suse.de>
 
        PR target/78229
index fd3dec4d0e3e31c61703c3c4eb34bcbc637762e1..1ea2417bed1d29d41eeb796744e298a4ba824beb 100644 (file)
@@ -2755,6 +2755,14 @@ nonoverlapping_memrefs_p (const_rtx x, const_rtx y, bool loop_invariant)
       || TREE_CODE (expry) == CONST_DECL)
     return 1;
 
+  /* 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;
+
   /* 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.  */
@@ -2804,7 +2812,7 @@ nonoverlapping_memrefs_p (const_rtx x, const_rtx y, bool loop_invariant)
 
   /* Offset based disambiguation not appropriate for loop invariant */
   if (loop_invariant)
-    return 0;              
+    return 0;
 
   /* Offset based disambiguation is OK even if we do not know that the
      declarations are necessarily different