This is part of a series to remove uses of for_each_rtx from the ports.
As with the first FR-V patch, we can find_all_hard_regs instead.

Tested by making sure there were no code changes for gcc.dg, gcc.c-torture
and g++.dg for arc-elf.  OK to install?

Thanks,
Richard


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

Index: gcc/config/arc/arc.c
===================================================================
--- gcc/config/arc/arc.c        2014-10-25 09:40:38.176518180 +0100
+++ gcc/config/arc/arc.c        2014-10-25 09:51:25.501884042 +0100
@@ -72,6 +72,7 @@ the Free Software Foundation; either ver
 #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 = "";
@@ -6351,38 +6352,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.  */
 
@@ -6390,7 +6359,31 @@ arc_rewrite_small_data_1 (rtx *loc, void
 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;
 }
 

Reply via email to