From de3b204ee73441083c3812cf71620464ccb14216 Mon Sep 17 00:00:00 2001 From: rsandifo Date: Sun, 2 Nov 2014 20:00:05 +0000 Subject: [PATCH] gcc/ * config/arc/arc.c: Include rtl-iter.h. (arc_rewrite_small_data_1): Delete. (arc_rewrite_small_data): Use FOR_EACH_SUBRTX_PTR. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217016 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/config/arc/arc.c | 59 +++++++++++++++++++++++----------------------------- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9cbebf0bccf..18b1e107039 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-11-02 Richard Sandiford + + * 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 * config/arm/arm.h (CLZ_DEFINED_VALUE_AT_ZERO) : Update diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c index f3769dd59ed..1bc903b3a2a 100644 --- a/gcc/config/arc/arc.c +++ b/gcc/config/arc/arc.c @@ -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; } -- 2.11.4.GIT