As noted in https://gcc.gnu.org/ml/gcc-patches/2014-02/msg01391.html
a bitmap-related cleanup turned add_used_regs_1 into a no-op for pseudo
registers, because the result of:

  regno = reg_renumber[regno];

is never used.  This patch does as Steven requested and adds an
assert that no allocated pseudos are seen here.


gcc/
        * caller-save.c: Include rtl-iter.h.
        (add_used_regs_1): Delete.
        (add_used_regs): Use FOR_EACH_SUBRTX rather than for_each_rtx
        to iterate over subrtxes.  Assert that any remaining pseudos
        have been spilled.

Index: gcc/caller-save.c
===================================================================
--- gcc/caller-save.c   2014-08-03 11:25:10.514960134 +0100
+++ gcc/caller-save.c   2014-08-03 11:25:21.155065328 +0100
@@ -37,6 +37,7 @@ Software Foundation; either version 3, o
 #include "addresses.h"
 #include "ggc.h"
 #include "dumpfile.h"
+#include "rtl-iter.h"
 
 #define MOVE_MAX_WORDS (MOVE_MAX / UNITS_PER_WORD)
 
@@ -1336,36 +1337,26 @@ insert_save (struct insn_chain *chain, i
   return numregs - 1;
 }
 
-/* A for_each_rtx callback used by add_used_regs.  Add the hard-register
-   equivalent of each REG to regset DATA.  */
-
-static int
-add_used_regs_1 (rtx *loc, void *data)
-{
-  unsigned int regno;
-  regset live;
-  rtx x;
-
-  x = *loc;
-  live = (regset) data;
-  if (REG_P (x))
-    {
-      regno = REGNO (x);
-      if (HARD_REGISTER_NUM_P (regno))
-       bitmap_set_range (live, regno, hard_regno_nregs[regno][GET_MODE (x)]);
-      else
-       regno = reg_renumber[regno];
-    }
-  return 0;
-}
-
 /* A note_uses callback used by insert_one_insn.  Add the hard-register
    equivalent of each REG to regset DATA.  */
 
 static void
 add_used_regs (rtx *loc, void *data)
 {
-  for_each_rtx (loc, add_used_regs_1, data);
+  subrtx_iterator::array_type array;
+  FOR_EACH_SUBRTX (iter, array, *loc, NONCONST)
+    {
+      const_rtx x = *iter;
+      if (REG_P (x))
+       {
+         unsigned int regno = REGNO (x);
+         if (HARD_REGISTER_NUM_P (regno))
+           bitmap_set_range ((regset) data, regno,
+                             hard_regno_nregs[regno][GET_MODE (x)]);
+         else
+           gcc_checking_assert (reg_renumber[regno] < 0);
+       }
+    }
 }
 
 /* Emit a new caller-save insn and set the code.  */

Reply via email to