]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
rs6000.c (get_store_dest): New.
authorPeter Bergner <bergner@vnet.ibm.com>
Wed, 22 Nov 2006 19:06:41 +0000 (13:06 -0600)
committerPeter Bergner <bergner@gcc.gnu.org>
Wed, 22 Nov 2006 19:06:41 +0000 (13:06 -0600)
* config/rs6000/rs6000.c (get_store_dest): New.
(adjacent_mem_locations): Use get_store_dest() to get
the rtl of the store destination.

From-SVN: r119099

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 31edafe97a5629b186e156f3380641accfe75efa..c6fdb9f1830fe083c4c060bd4b7c021a19859841 100644 (file)
@@ -1,3 +1,9 @@
+2006-11-22  Peter Bergner  <bergner@vnet.ibm.com>
+
+       * config/rs6000/rs6000.c (get_store_dest): New.
+       (adjacent_mem_locations): Use get_store_dest() to get
+       the rtl of the store destination.
+
 2006-11-22  Joseph Myers  <joseph@codesourcery.com>
 
        * config/rs6000/spe.md (SPE64): New mode macro.
index f8e58fb43c008dff8e882e817707fd022e3a7276..51e51178a404832f2b6e0d1c7f180818e4e9dbce 100644 (file)
@@ -693,6 +693,7 @@ static bool is_nonpipeline_insn (rtx);
 static bool is_cracked_insn (rtx);
 static bool is_branch_slot_insn (rtx);
 static bool is_load_insn (rtx);
+static rtx get_store_dest (rtx pat);
 static bool is_store_insn (rtx);
 static bool set_to_load_agen (rtx,rtx);
 static bool adjacent_mem_locations (rtx,rtx); 
@@ -17066,9 +17067,9 @@ static bool
 adjacent_mem_locations (rtx insn1, rtx insn2)
 {
 
-  rtx a = SET_DEST (PATTERN (insn1));
-  rtx b = SET_DEST (PATTERN (insn2));
+  rtx a = get_store_dest (PATTERN (insn1));
+  rtx b = get_store_dest (PATTERN (insn2));
+
   if ((GET_CODE (XEXP (a, 0)) == REG
        || (GET_CODE (XEXP (a, 0)) == PLUS
           && GET_CODE (XEXP (XEXP (a, 0), 1)) == CONST_INT))
@@ -17374,6 +17375,32 @@ is_store_insn (rtx insn)
   return is_store_insn1 (PATTERN (insn));
 }
 
+/* Return the dest of a store insn.  */
+
+static rtx
+get_store_dest (rtx pat)
+{
+  gcc_assert (is_store_insn1 (pat));
+
+  if (GET_CODE (pat) == SET)
+    return SET_DEST (pat);
+  else if (GET_CODE (pat) == PARALLEL)
+    {
+      int i;
+
+      for (i = 0; i < XVECLEN (pat, 0); i++)
+       {
+         rtx inner_pat = XVECEXP (pat, 0, i);
+         if (GET_CODE (inner_pat) == SET
+             && is_mem_ref (SET_DEST (inner_pat)))
+           return inner_pat;
+       }
+    }
+  /* We shouldn't get here, because we should have either a simple
+     store insn or a store with update which are covered above.  */
+  gcc_unreachable();
+}
+
 /* Returns whether the dependence between INSN and NEXT is considered
    costly by the given target.  */