re PR rtl-optimization/55547 (Alias analysis does not handle AND addresses correctly)
authorAlexandre Oliva <aoliva@redhat.com>
Wed, 16 Jan 2013 04:31:30 +0000 (04:31 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Wed, 16 Jan 2013 04:31:30 +0000 (04:31 +0000)
PR rtl-optimization/55547
PR rtl-optimization/53827
PR debug/53671
PR debug/49888
* alias.c (memrefs_conflict_p): Set sizes to negative after
AND adjustments.

From-SVN: r195227

gcc/ChangeLog
gcc/alias.c

index e9220f5f8c6a7c17562b3ba6ff513c5e5129e2e6..6f7441e8b237e204cb9af1726d9dcdab3bd61902 100644 (file)
@@ -1,3 +1,12 @@
+2013-01-16  Alexandre Oliva <aoliva@redhat.com>
+
+       PR rtl-optimization/55547
+       PR rtl-optimization/53827
+       PR debug/53671
+       PR debug/49888
+       * alias.c (memrefs_conflict_p): Set sizes to negative after
+       AND adjustments.
+
 2013-01-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/55940
index df328ec9d73138ffaa377ea26a93fb27633fea3f..9a386dde3820d0a23a745749e4d66c7374f65368 100644 (file)
@@ -2080,14 +2080,20 @@ memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c)
 
   /* Deal with alignment ANDs by adjusting offset and size so as to
      cover the maximum range, without taking any previously known
-     alignment into account.  */
+     alignment into account.  Make a size negative after such an
+     adjustments, so that, if we end up with e.g. two SYMBOL_REFs, we
+     assume a potential overlap, because they may end up in contiguous
+     memory locations and the stricter-alignment access may span over
+     part of both.  */
   if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1)))
     {
       HOST_WIDE_INT sc = INTVAL (XEXP (x, 1));
       unsigned HOST_WIDE_INT uc = sc;
-      if (xsize > 0 && sc < 0 && -uc == (uc & -uc))
+      if (sc < 0 && -uc == (uc & -uc))
        {
-         xsize -= sc + 1;
+         if (xsize > 0)
+           xsize = -xsize;
+         xsize += sc + 1;
          c -= sc + 1;
          return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
                                     ysize, y, c);
@@ -2097,9 +2103,11 @@ memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c)
     {
       HOST_WIDE_INT sc = INTVAL (XEXP (y, 1));
       unsigned HOST_WIDE_INT uc = sc;
-      if (ysize > 0 && sc < 0 && -uc == (uc & -uc))
+      if (sc < 0 && -uc == (uc & -uc))
        {
-         ysize -= sc + 1;
+         if (ysize > 0)
+           ysize = -ysize;
+         ysize += sc + 1;
          c += sc + 1;
          return memrefs_conflict_p (xsize, x,
                                     ysize, canon_rtx (XEXP (y, 0)), c);