From cf55cb6a1957b8ab4d2b73d372c36a262d5b09a9 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 28 Aug 2014 06:23:51 +0000 Subject: [PATCH] lower-subreg.c: Include rtl-iter.h. gcc/ * lower-subreg.c: Include rtl-iter.h. (resolve_subreg_use): Turn from being a for_each_rtx callback to being a function that examines each subrtx itself. Remove handling of null rtxes. (resolve_reg_notes, resolve_simple_move): Update accordingly. (decompose_multiword_subregs): Likewise. From-SVN: r214647 --- gcc/ChangeLog | 9 ++++++ gcc/lower-subreg.c | 71 +++++++++++++++++++++------------------------- 2 files changed, 42 insertions(+), 38 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 253db61aa35..e8c89a4207d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2014-08-28 Richard Sandiford + + * lower-subreg.c: Include rtl-iter.h. + (resolve_subreg_use): Turn from being a for_each_rtx callback + to being a function that examines each subrtx itself. Remove + handling of null rtxes. + (resolve_reg_notes, resolve_simple_move): Update accordingly. + (decompose_multiword_subregs): Likewise. + 2014-08-28 Richard Sandiford * loop-iv.c (altered_reg_used): Turn from being a for_each_rtx callback diff --git a/gcc/lower-subreg.c b/gcc/lower-subreg.c index df1c6679aa5..43991e6281a 100644 --- a/gcc/lower-subreg.c +++ b/gcc/lower-subreg.c @@ -40,6 +40,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-pass.h" #include "df.h" #include "lower-subreg.h" +#include "rtl-iter.h" #ifdef STACK_GROWS_DOWNWARD # undef STACK_GROWS_DOWNWARD @@ -726,46 +727,42 @@ resolve_subreg_p (rtx x) return resolve_reg_p (SUBREG_REG (x)); } -/* This is called via for_each_rtx. Look for SUBREGs which need to be - decomposed. */ +/* Look for SUBREGs in *LOC which need to be decomposed. */ -static int -resolve_subreg_use (rtx *px, void *data) +static bool +resolve_subreg_use (rtx *loc, rtx insn) { - rtx insn = (rtx) data; - rtx x = *px; - - if (x == NULL_RTX) - return 0; - - if (resolve_subreg_p (x)) + subrtx_ptr_iterator::array_type array; + FOR_EACH_SUBRTX_PTR (iter, array, loc, NONCONST) { - x = simplify_subreg_concatn (GET_MODE (x), SUBREG_REG (x), - SUBREG_BYTE (x)); - - /* It is possible for a note to contain a reference which we can - decompose. In this case, return 1 to the caller to indicate - that the note must be removed. */ - if (!x) + rtx *loc = *iter; + rtx x = *loc; + if (resolve_subreg_p (x)) { - gcc_assert (!insn); - return 1; - } + x = simplify_subreg_concatn (GET_MODE (x), SUBREG_REG (x), + SUBREG_BYTE (x)); - validate_change (insn, px, x, 1); - return -1; - } + /* It is possible for a note to contain a reference which we can + decompose. In this case, return 1 to the caller to indicate + that the note must be removed. */ + if (!x) + { + gcc_assert (!insn); + return true; + } - if (resolve_reg_p (x)) - { - /* Return 1 to the caller to indicate that we found a direct - reference to a register which is being decomposed. This can - happen inside notes, multiword shift or zero-extend - instructions. */ - return 1; + validate_change (insn, loc, x, 1); + iter.skip_subrtxes (); + } + else if (resolve_reg_p (x)) + /* Return 1 to the caller to indicate that we found a direct + reference to a register which is being decomposed. This can + happen inside notes, multiword shift or zero-extend + instructions. */ + return true; } - return 0; + return false; } /* This is called via for_each_rtx. Look for SUBREGs which can be @@ -808,7 +805,7 @@ resolve_reg_notes (rtx_insn *insn) if (note) { int old_count = num_validated_changes (); - if (for_each_rtx (&XEXP (note, 0), resolve_subreg_use, NULL)) + if (resolve_subreg_use (&XEXP (note, 0), NULL_RTX)) remove_note (insn, note); else if (old_count != num_validated_changes ()) @@ -952,9 +949,9 @@ resolve_simple_move (rtx set, rtx_insn *insn) int acg; if (MEM_P (src)) - for_each_rtx (&XEXP (src, 0), resolve_subreg_use, NULL_RTX); + resolve_subreg_use (&XEXP (src, 0), NULL_RTX); if (MEM_P (dest)) - for_each_rtx (&XEXP (dest, 0), resolve_subreg_use, NULL_RTX); + resolve_subreg_use (&XEXP (dest, 0), NULL_RTX); acg = apply_change_group (); gcc_assert (acg); } @@ -1617,9 +1614,7 @@ decompose_multiword_subregs (bool decompose_copies) } for (i = recog_data.n_operands - 1; i >= 0; --i) - for_each_rtx (recog_data.operand_loc[i], - resolve_subreg_use, - insn); + resolve_subreg_use (recog_data.operand_loc[i], insn); resolve_reg_notes (insn); -- 2.30.2