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
This commit is contained in:
Richard Sandiford 2014-08-28 06:23:51 +00:00 committed by Richard Sandiford
parent b42b06e6d7
commit cf55cb6a19
2 changed files with 43 additions and 39 deletions

View File

@ -1,3 +1,12 @@
2014-08-28 Richard Sandiford <rdsandiford@googlemail.com>
* 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 <rdsandiford@googlemail.com>
* loop-iv.c (altered_reg_used): Turn from being a for_each_rtx callback

View File

@ -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));
/* 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;
}
validate_change (insn, loc, x, 1);
iter.skip_subrtxes ();
}
validate_change (insn, px, x, 1);
return -1;
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;
}
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;
}
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);