Commit 5147bf6a by Alexandre Oliva Committed by Alexandre Oliva

re PR rtl-optimization/55547 (Alias analysis does not handle AND addresses correctly)

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
parent c851c76c
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> 2013-01-15 Jakub Jelinek <jakub@redhat.com>
PR target/55940 PR target/55940
......
...@@ -2080,14 +2080,20 @@ memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c) ...@@ -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 /* Deal with alignment ANDs by adjusting offset and size so as to
cover the maximum range, without taking any previously known 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))) if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1)))
{ {
HOST_WIDE_INT sc = INTVAL (XEXP (x, 1)); HOST_WIDE_INT sc = INTVAL (XEXP (x, 1));
unsigned HOST_WIDE_INT uc = sc; 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; c -= sc + 1;
return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)), return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
ysize, y, c); ysize, y, c);
...@@ -2097,9 +2103,11 @@ memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT 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)); HOST_WIDE_INT sc = INTVAL (XEXP (y, 1));
unsigned HOST_WIDE_INT uc = sc; 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; c += sc + 1;
return memrefs_conflict_p (xsize, x, return memrefs_conflict_p (xsize, x,
ysize, canon_rtx (XEXP (y, 0)), c); ysize, canon_rtx (XEXP (y, 0)), c);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment