arc.c: Include rtl-iter.h.

gcc/
	* config/arc/arc.c: Include rtl-iter.h.
	(arc_rewrite_small_data_1): Delete.
	(arc_rewrite_small_data): Use FOR_EACH_SUBRTX_PTR.

From-SVN: r217016
This commit is contained in:
Richard Sandiford 2014-11-02 20:00:05 +00:00 committed by Richard Sandiford
parent 100a518033
commit 6733978e46
2 changed files with 32 additions and 33 deletions

View File

@ -1,3 +1,9 @@
2014-11-02 Richard Sandiford <richard.sandiford@arm.com>
* config/arc/arc.c: Include rtl-iter.h.
(arc_rewrite_small_data_1): Delete.
(arc_rewrite_small_data): Use FOR_EACH_SUBRTX_PTR.
2014-11-02 Michael Collison <michael.collison@linaro.org>
* config/arm/arm.h (CLZ_DEFINED_VALUE_AT_ZERO) : Update

View File

@ -81,6 +81,7 @@ along with GCC; see the file COPYING3. If not see
#include "pass_manager.h"
#include "wide-int.h"
#include "builtins.h"
#include "rtl-iter.h"
/* Which cpu we're compiling for (A5, ARC600, ARC601, ARC700). */
static const char *arc_cpu_string = "";
@ -6369,38 +6370,6 @@ arc_rewrite_small_data_p (rtx x)
&& SYMBOL_REF_SMALL_P(x));
}
/* A for_each_rtx callback, used by arc_rewrite_small_data. */
static int
arc_rewrite_small_data_1 (rtx *loc, void *data)
{
if (arc_rewrite_small_data_p (*loc))
{
rtx top;
gcc_assert (SDATA_BASE_REGNUM == PIC_OFFSET_TABLE_REGNUM);
*loc = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, *loc);
if (loc == data)
return -1;
top = *(rtx*) data;
if (GET_CODE (top) == MEM && &XEXP (top, 0) == loc)
; /* OK. */
else if (GET_CODE (top) == MEM
&& GET_CODE (XEXP (top, 0)) == PLUS
&& GET_CODE (XEXP (XEXP (top, 0), 0)) == MULT)
*loc = force_reg (Pmode, *loc);
else
gcc_unreachable ();
return -1;
}
if (GET_CODE (*loc) == PLUS
&& rtx_equal_p (XEXP (*loc, 0), pic_offset_table_rtx))
return -1;
return 0;
}
/* If possible, rewrite OP so that it refers to small data using
explicit relocations. */
@ -6408,7 +6377,31 @@ rtx
arc_rewrite_small_data (rtx op)
{
op = copy_insn (op);
for_each_rtx (&op, arc_rewrite_small_data_1, &op);
subrtx_ptr_iterator::array_type array;
FOR_EACH_SUBRTX_PTR (iter, array, &op, ALL)
{
rtx *loc = *iter;
if (arc_rewrite_small_data_p (*loc))
{
gcc_assert (SDATA_BASE_REGNUM == PIC_OFFSET_TABLE_REGNUM);
*loc = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, *loc);
if (loc != &op)
{
if (GET_CODE (op) == MEM && &XEXP (op, 0) == loc)
; /* OK. */
else if (GET_CODE (op) == MEM
&& GET_CODE (XEXP (op, 0)) == PLUS
&& GET_CODE (XEXP (XEXP (op, 0), 0)) == MULT)
*loc = force_reg (Pmode, *loc);
else
gcc_unreachable ();
}
iter.skip_subrtxes ();
}
else if (GET_CODE (*loc) == PLUS
&& rtx_equal_p (XEXP (*loc, 0), pic_offset_table_rtx))
iter.skip_subrtxes ();
}
return op;
}