OSDN Git Service

* alias.c (addr_side_effect_eval): New function.
authorm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Dec 1998 01:32:23 +0000 (01:32 +0000)
committerm.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Dec 1998 01:32:23 +0000 (01:32 +0000)
(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

gcc/ChangeLog
gcc/alias.c
gcc/rtl.h

index 2134c4e..2481c16 100644 (file)
@@ -1,3 +1,10 @@
+Thu Dec  3 22:30:18 1998  Michael Hayes  <m.hayes@elec.canterbury.ac.nz>
+
+       * alias.c (addr_side_effect_eval): New function.
+       (memrefs_conflict_p): Use it.
+       * rtl.h (addr_side_effect_eval): Prototype it.
+
+
 1998-12-02  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * pdp11.md (extendsfdf2): Fix mode mismatch in SET.
index 719b890..909176e 100644 (file)
@@ -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))
     {
index 93e7842..da22adb 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1521,5 +1521,6 @@ extern void end_alias_analysis            PROTO ((void));
 
 extern void record_base_value          PROTO ((int, rtx, int));
 extern void record_alias_subset         PROTO ((int, int));
+extern rtx addr_side_effect_eval       PROTO ((rtx, int, int));
 
 #endif /* _RTL_H */