]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Aug 2014 06:23:47 +0000 (06:23 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Aug 2014 06:23:47 +0000 (06:23 +0000)
* loop-iv.c (altered_reg_used): Turn from being a for_each_rtx callback
to being a function that examines each subrtx itself.
(simplify_using_condition, simplify_using_initial_values): Update
accordingly.

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

gcc/ChangeLog
gcc/loop-iv.c

index 679e2bfe3fe8d38d4491950ff6d1b7e13aff3b56..253db61aa3594ee2e8fbaee32235445aaac6a457 100644 (file)
@@ -1,3 +1,10 @@
+2014-08-28  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * loop-iv.c (altered_reg_used): Turn from being a for_each_rtx callback
+       to being a function that examines each subrtx itself.
+       (simplify_using_condition, simplify_using_initial_values): Update
+       accordingly.
+
 2014-08-28  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * loop-iv.c: Include rtl-iter.h.
index b8f5e12f4428131496095d771a259b3ee40a55e5..27bc87959669c455ec605150d7d99c42fb41db9e 100644 (file)
@@ -1328,15 +1328,19 @@ inverse (uint64_t x, int mod)
   return rslt;
 }
 
-/* Checks whether register *REG is in set ALT.  Callback for for_each_rtx.  */
+/* Checks whether any register in X is in set ALT.  */
 
-static int
-altered_reg_used (rtx *reg, void *alt)
+static bool
+altered_reg_used (const_rtx x, bitmap alt)
 {
-  if (!REG_P (*reg))
-    return 0;
-
-  return REGNO_REG_SET_P ((bitmap) alt, REGNO (*reg));
+  subrtx_iterator::array_type array;
+  FOR_EACH_SUBRTX (iter, array, x, NONCONST)
+    {
+      const_rtx x = *iter;
+      if (REG_P (x) && REGNO_REG_SET_P (alt, REGNO (x)))
+       return true;
+    }
+  return false;
 }
 
 /* Marks registers altered by EXPR in set ALT.  */
@@ -1772,8 +1776,7 @@ simplify_using_condition (rtx cond, rtx *expr, regset altered)
 
   /* If some register gets altered later, we do not really speak about its
      value at the time of comparison.  */
-  if (altered
-      && for_each_rtx (&cond, altered_reg_used, altered))
+  if (altered && altered_reg_used (cond, altered))
     return;
 
   if (GET_CODE (cond) == EQ
@@ -2051,7 +2054,7 @@ simplify_using_initial_values (struct loop *loop, enum rtx_code op, rtx *expr)
              /* If we did not use this insn to make a replacement, any overlap
                 between stores in this insn and our expression will cause the
                 expression to become invalid.  */
-             if (for_each_rtx (expr, altered_reg_used, this_altered))
+             if (altered_reg_used (*expr, this_altered))
                goto out;
 
              /* Likewise for the conditions.  */
@@ -2061,7 +2064,7 @@ simplify_using_initial_values (struct loop *loop, enum rtx_code op, rtx *expr)
                  rtx old_cond = XEXP (note, 0);
 
                  pnote_next = (rtx_expr_list **)&XEXP (note, 1);
-                 if (for_each_rtx (&old_cond, altered_reg_used, this_altered))
+                 if (altered_reg_used (old_cond, this_altered))
                    {
                      *pnote = *pnote_next;
                      pnote_next = pnote;
@@ -2079,7 +2082,7 @@ simplify_using_initial_values (struct loop *loop, enum rtx_code op, rtx *expr)
             can't return it to the caller.  However, it is still valid for
             further simplification, so keep searching to see if we can
             eventually turn it into a constant.  */
-         if (for_each_rtx (expr, altered_reg_used, altered))
+         if (altered_reg_used (*expr, altered))
            expression_valid = false;
          if (expression_valid)
            last_valid_expr = *expr;