OSDN Git Service

* alias.c (memrefs_conflict_p): If x and y are the same VALUE,
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Apr 2010 09:26:43 +0000 (09:26 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 01:02:50 +0000 (10:02 +0900)
don't call get_addr on both.  If one expression is a VALUE and
the other a REG, check VALUE's locs if the REG isn't among them.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158401 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/alias.c

index 032af2b..7f4c633 100644 (file)
@@ -1,3 +1,9 @@
+2010-04-16  Jakub Jelinek  <jakub@redhat.com>
+
+       * alias.c (memrefs_conflict_p): If x and y are the same VALUE,
+       don't call get_addr on both.  If one expression is a VALUE and
+       the other a REG, check VALUE's locs if the REG isn't among them.
+
 2010-04-16  Christian Bruel  <christian.bruel@st.com>
 
        * config/sh/sh.h (sh_frame_pointer_required): New function.
index 4be7085..6ec51ec 100644 (file)
@@ -1789,9 +1789,39 @@ static int
 memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c)
 {
   if (GET_CODE (x) == VALUE)
-    x = get_addr (x);
+    {
+      if (REG_P (y))
+       {
+         struct elt_loc_list *l;
+         for (l = CSELIB_VAL_PTR (x)->locs; l; l = l->next)
+           if (REG_P (l->loc) && rtx_equal_for_memref_p (l->loc, y))
+             break;
+         if (l)
+           x = y;
+         else
+           x = get_addr (x);
+       }
+      /* Don't call get_addr if y is the same VALUE.  */
+      else if (x != y)
+       x = get_addr (x);
+    }
   if (GET_CODE (y) == VALUE)
-    y = get_addr (y);
+    {
+      if (REG_P (x))
+       {
+         struct elt_loc_list *l;
+         for (l = CSELIB_VAL_PTR (y)->locs; l; l = l->next)
+           if (REG_P (l->loc) && rtx_equal_for_memref_p (l->loc, x))
+             break;
+         if (l)
+           y = x;
+         else
+           y = get_addr (y);
+       }
+      /* Don't call get_addr if x is the same VALUE.  */
+      else if (y != x)
+       y = get_addr (y);
+    }
   if (GET_CODE (x) == HIGH)
     x = XEXP (x, 0);
   else if (GET_CODE (x) == LO_SUM)