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.

Index: gcc/lower-subreg.c
===================================================================
--- gcc/lower-subreg.c  2014-08-03 11:25:09.853953599 +0100
+++ gcc/lower-subreg.c  2014-08-03 11:25:28.502137966 +0100
@@ -40,6 +40,7 @@ Software Foundation; either version 3, o
 #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)
   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 ())
@@ -950,9 +947,9 @@ resolve_simple_move (rtx set, rtx 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);
     }
@@ -1614,9 +1611,7 @@ decompose_multiword_subregs (bool decomp
                    }
 
                  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);
 

Reply via email to