summaryrefslogtreecommitdiffstats
path: root/gcc/alias.c
diff options
context:
space:
mode:
authorm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>1998-12-03 01:32:23 +0000
committerm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>1998-12-03 01:32:23 +0000
commitb9f929767767e1874483e580ed70fe79086fa897 (patch)
tree784e2a2f3a4aa6bf5c9f17a4f251a307531cf5b0 /gcc/alias.c
parentc90a021cf0c259855f8be18355f2f51d50cea01b (diff)
downloadppe42-gcc-b9f929767767e1874483e580ed70fe79086fa897.tar.gz
ppe42-gcc-b9f929767767e1874483e580ed70fe79086fa897.zip
* alias.c (addr_side_effect_eval): New function.
(memrefs_conflict_p): Use it. * rtl.h (addr_side_effect_eval): Prototype it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@24068 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/alias.c')
-rw-r--r--gcc/alias.c43
1 files changed, 41 insertions, 2 deletions
diff --git a/gcc/alias.c b/gcc/alias.c
index 719b8901d15..909176ea3fb 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -860,6 +860,45 @@ base_alias_check (x, y, x_mode, y_mode)
return ! (GET_MODE (x_base) == VOIDmode && GET_MODE (y_base) == VOIDmode);
}
+/* Return the address of the (N_REFS + 1)th memory reference to ADDR
+ where SIZE is the size in bytes of the memory reference. If ADDR
+ is not modified by the memory reference then ADDR is returned. */
+
+rtx
+addr_side_effect_eval (addr, size, n_refs)
+ rtx addr;
+ int size;
+ int n_refs;
+{
+ int offset = 0;
+
+ switch (GET_CODE (addr))
+ {
+ case PRE_INC:
+ offset = (n_refs + 1) * size;
+ break;
+ case PRE_DEC:
+ offset = -(n_refs + 1) * size;
+ break;
+ case POST_INC:
+ offset = n_refs * size;
+ break;
+ case POST_DEC:
+ offset = -n_refs * size;
+ break;
+
+ default:
+ return addr;
+ }
+
+ if (offset)
+ addr = gen_rtx_PLUS (GET_MODE (addr), XEXP (addr, 0), GEN_INT (offset));
+ else
+ addr = XEXP (addr, 0);
+
+ return addr;
+}
+
/* Return nonzero if X and Y (memory addresses) could reference the
same location in memory. C is an offset accumulator. When
C is nonzero, we are testing aliases between X and Y + C.
@@ -889,13 +928,13 @@ memrefs_conflict_p (xsize, x, ysize, y, c)
else if (GET_CODE (x) == LO_SUM)
x = XEXP (x, 1);
else
- x = canon_rtx (x);
+ x = canon_rtx (addr_side_effect_eval (x, xsize, 0));
if (GET_CODE (y) == HIGH)
y = XEXP (y, 0);
else if (GET_CODE (y) == LO_SUM)
y = XEXP (y, 1);
else
- y = canon_rtx (y);
+ y = canon_rtx (addr_side_effect_eval (y, ysize, 0));
if (rtx_equal_for_memref_p (x, y))
{
OpenPOWER on IntegriCloud