This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 29/50] loop-iv.c:altered_reg_used
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 03 Aug 2014 15:14:17 +0100
- Subject: [PATCH 29/50] loop-iv.c:altered_reg_used
- Authentication-results: sourceware.org; auth=none
- References: <87y4v5d77q dot fsf at googlemail dot com>
gcc/
* 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.
Index: gcc/loop-iv.c
===================================================================
--- gcc/loop-iv.c 2014-08-03 11:25:27.978132785 +0100
+++ gcc/loop-iv.c 2014-08-03 11:25:28.247135444 +0100
@@ -1327,15 +1327,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. */
@@ -1771,8 +1775,7 @@ simplify_using_condition (rtx cond, rtx
/* 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
@@ -2048,7 +2051,7 @@ simplify_using_initial_values (struct lo
/* 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. */
@@ -2058,7 +2061,7 @@ simplify_using_initial_values (struct lo
rtx old_cond = XEXP (note, 0);
pnote_next = &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;
@@ -2076,7 +2079,7 @@ simplify_using_initial_values (struct lo
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;