]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/68999 (FAIL: gfortran.fortran-torture/execute/save_1.f90 execution)
authorUros Bizjak <uros@gcc.gnu.org>
Mon, 11 Jan 2016 15:48:40 +0000 (16:48 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 11 Jan 2016 15:48:40 +0000 (16:48 +0100)
PR middle-end/68999
* alias.c (base_alias_check): Move check for addresses with
alignment ANDs before the call for compare_base_decls.
(memrefs_conflict_p): Return -1 for different decls
that went through alignment adjustments.

From-SVN: r232229

gcc/ChangeLog
gcc/alias.c

index 74875108f04771faa7f5db5268bea3e5eac228ca..62aaea2652520a30f4733608e414361065644464 100644 (file)
@@ -1,3 +1,11 @@
+2016-01-11  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR middle-end/68999
+       * alias.c (base_alias_check): Move check for addresses with
+       alignment ANDs before the call for compare_base_decls.
+       (memrefs_conflict_p): Return -1 for different decls
+       that went through alignment adjustments.
+
 2016-01-11  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR rtl-optimization/68796
 
 2016-01-11  H.J. Lu  <hongjiu.lu@intel.com>
 
-       * config/i386/sse.md (<avx512>_load<mode>_mask): Remove
-       snprintf.
+       * config/i386/sse.md (<avx512>_load<mode>_mask): Remove snprintf.
        (<avx512>_store<mode>_mask): Likewise.
 
 2016-01-11  Bernd Schmidt  <bschmidt@redhat.com>
-            Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+           Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR rtl-optimization/68841
        * ifcvt.c (struct noce_if_info): Add orig_x field.
index 1b8390e85bb3893e9ea37ff160742bde202d692a..ccfad4d8386d024a40000fc2f3420c62ccf69f34 100644 (file)
@@ -2093,17 +2093,6 @@ base_alias_check (rtx x, rtx x_base, rtx y, rtx y_base,
   if (rtx_equal_p (x_base, y_base))
     return 1;
 
-  if (GET_CODE (x_base) == SYMBOL_REF && GET_CODE (y_base) == SYMBOL_REF)
-    {
-      tree x_decl = SYMBOL_REF_DECL (x_base);
-      tree y_decl = SYMBOL_REF_DECL (y_base);
-
-      /* We can assume that no stores are made to labels.  */
-      if (!x_decl || !y_decl)
-       return 0;
-      return compare_base_decls (x_decl, y_decl) != 0;
-    }
-
   /* The base addresses are different expressions.  If they are not accessed
      via AND, there is no conflict.  We can bring knowledge of object
      alignment into play here.  For example, on alpha, "char a, b;" can
@@ -2122,6 +2111,17 @@ base_alias_check (rtx x, rtx x_base, rtx y, rtx y_base,
          || (int) GET_MODE_UNIT_SIZE (x_mode) < -INTVAL (XEXP (y, 1))))
     return 1;
 
+  if (GET_CODE (x_base) == SYMBOL_REF && GET_CODE (y_base) == SYMBOL_REF)
+    {
+      tree x_decl = SYMBOL_REF_DECL (x_base);
+      tree y_decl = SYMBOL_REF_DECL (y_base);
+
+      /* We can assume that no stores are made to labels.  */
+      if (!x_decl || !y_decl)
+       return 0;
+      return compare_base_decls (x_decl, y_decl) != 0;
+    }
+
   /* Differing symbols not accessed via AND never alias.  */
   if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS)
     return 0;
@@ -2344,6 +2344,12 @@ memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c)
       /* If both decls are the same, decide by offsets.  */
       if (cmp == 1)
         return offset_overlap_p (c, xsize, ysize);
+      /* Assume a potential overlap for symbolic addresses that went
+        through alignment adjustments (i.e., that have negative
+        sizes), because we can't know how far they are from each
+        other.  */
+      if (xsize < 0 || ysize < 0)
+       return -1;
       /* If decls are different or we know by offsets that there is no overlap,
         we win.  */
       if (!cmp || !offset_overlap_p (c, xsize, ysize))