I see, that's ok. I will do the same refactoring for other files that have
hits for TEST_HARD_REG_BIT. I just started with that one because the
bugzilla entry mentioned it. How can I tell that a file is worth working on
and that it's not planned for removal next release?

Regards,
Kev

On Wed, Feb 25, 2026 at 8:52 PM Andrew Pinski <
[email protected]> wrote:

> On Wed, Feb 25, 2026 at 10:44 AM Kevin Stefanov
> <[email protected]> wrote:
> >
> > This change takes loops of the form:
> >
> >   for (int <i> = 0; <i> < FIRST_PSEUDO_REGISTER; <i>++)
> >     if (TEST_HARD_REG_BIT (<set>, <i>))
> >       <body that doesn't change i or set>
> >
> > and carries out the necessary refactoring to rewrite them as:
> >
> >   hard_reg_set_iterator hrsi; [...]
> >   EXECUTE_IF_SET_IN_HARD_REG_SET (<set>, 0, <i>, hrsi)
> >     <body that doesn't change i or set>
> >
> > in loops where expressing <set> does not involve <i>.
> >
> > gcc/
> >         * caller-save.cc: Analyzed all hits, replaced those matching the
> pattern.
>
> So the plan is to remove caller-save.cc as part of the removal of
> reload in GCC 17.
> So this patch is not going to be used. Sorry. Your patch seems correct
> if we were going to keep around this code though.
>
> Note the original plan was to remove reload in GCC 16 but it didn't happen.
>
> Thanks,
> Andrew
>
>
> >
> > Signed-off-by: Kevin Stefanov <[email protected]>
> > ---
> > I do not have write access to the GCC repo, as this is my first ever
> > contribution to free and open source software. I made sure to rerun
> > the GCC testsuite on the objdir with my changes and compare it to the
> > run made on the pristine objdir with a cleanly cloned and built GCC.
> > When comparing the test result differences, I believe everything is good,
> > the only weird thing I get, which I'm not 100% sure should be cause for
> > alarm or not, is that one test gets reported to have passed, which wasn't
> > passing before (in the clean GCC) and then that same test is reported to
> > have disappeared in the test run in my changed objdir. The test in
> question is:
> > g++: g++.dg/modules/compile-std1.C module-cmi <bits/stdc++.h>.
> > This is the only difference found in my test runs, could somebody
> confirm it's
> > nothing to worry about? I made sure to write my commit message and the
> ChangeLog
> > therein as correctly as I can, I took example from existing commit
> messages.
> > Let me know if I haven't done something right and I will work on fixing
> it.
> > When everything is ready, could somebody please commit this on my behalf?
> > Also, I have a list of hits for FIRST_PSEUDO_REGISTER in caller-save.cc
> > that were in loops but were not applicable for this rewrite, along with
> > reasons why. Do I post it as a comment under the bugzilla page for this?
> >
> >  gcc/caller-save.cc | 59 +++++++++++++++++++++++++---------------------
> >  1 file changed, 32 insertions(+), 27 deletions(-)
> >
> > diff --git a/gcc/caller-save.cc b/gcc/caller-save.cc
> > index 281aa0bb009..ab812964624 100644
> > --- a/gcc/caller-save.cc
> > +++ b/gcc/caller-save.cc
> > @@ -187,6 +187,7 @@ init_caller_save (void)
> >    int offset;
> >    rtx address;
> >    int i, j;
> > +  unsigned int k;
> >
> >    if (caller_save_initialized_p)
> >      return;
> > @@ -216,16 +217,16 @@ init_caller_save (void)
> >       and by finding the smallest power of two that is a valid offset
> from
> >       that register in every mode we will use to save registers.  */
> >
> > -  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
> > -    if (TEST_HARD_REG_BIT
> > -       (reg_class_contents
> > -        [(int) base_reg_class (regno_save_mode[i][1],
> ADDR_SPACE_GENERIC,
> > -                               PLUS, CONST_INT)], i))
> > -      break;
> > +  hard_reg_set_iterator hrsi;
> > +  EXECUTE_IF_SET_IN_HARD_REG_SET
> > +  (reg_class_contents
> > +   [(int) base_reg_class (regno_save_mode[k][1], ADDR_SPACE_GENERIC,
> > +                          PLUS, CONST_INT)], 0, k, hrsi)
> > +    break;
> >
> > -  gcc_assert (i < FIRST_PSEUDO_REGISTER);
> > +  gcc_assert (k < FIRST_PSEUDO_REGISTER);
> >
> > -  addr_reg = gen_rtx_REG (Pmode, i);
> > +  addr_reg = gen_rtx_REG (Pmode, k);
> >
> >    for (offset = 1 << (HOST_BITS_PER_INT / 2); offset; offset >>= 1)
> >      {
> > @@ -442,15 +443,17 @@ setup_save_areas (void)
> >
> >        used_regs &= ~(fixed_reg_set | this_insn_sets);
> >        hard_regs_to_save &= used_regs & savable_regs;
> > -      for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
> > -       if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
> > -         {
> > -           if (hard_reg_map[regno] != NULL)
> > -             hard_reg_map[regno]->call_freq += freq;
> > -           else
> > -             new_saved_hard_reg (regno, freq);
> > -           SET_HARD_REG_BIT (hard_regs_used, regno);
> > -         }
> > +
> > +      hard_reg_set_iterator hrsi;
> > +      EXECUTE_IF_SET_IN_HARD_REG_SET (hard_regs_to_save, 0, regno, hrsi)
> > +      {
> > +        if (hard_reg_map[regno] != NULL)
> > +          hard_reg_map[regno]->call_freq += freq;
> > +        else
> > +          new_saved_hard_reg (regno, freq);
> > +        SET_HARD_REG_BIT (hard_regs_used, regno);
> > +      }
> > +
> >        cheap = find_reg_note (insn, REG_RETURNED, NULL);
> >        if (cheap)
> >         cheap = XEXP (cheap, 0);
> > @@ -526,13 +529,15 @@ setup_save_areas (void)
> >
> >           used_regs &= ~(fixed_reg_set | this_insn_sets);
> >           hard_regs_to_save &= used_regs & savable_regs;
> > -         for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
> > -           if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
> > -             {
> > -               gcc_assert (hard_reg_map[regno] != NULL);
> > -               call_saved_regs[call_saved_regs_num++] =
> hard_reg_map[regno];
> > -             }
> > -         /* Look through all live pseudos, mark their hard registers.
> */
> > +
> > +      hard_reg_set_iterator hrsi;
> > +      EXECUTE_IF_SET_IN_HARD_REG_SET (hard_regs_to_save, 0, regno, hrsi)
> > +      {
> > +        gcc_assert (hard_reg_map[regno] != NULL);
> > +        call_saved_regs[call_saved_regs_num++] = hard_reg_map[regno];
> > +      }
> > +
> > +      /* Look through all live pseudos, mark their hard registers.  */
> >           EXECUTE_IF_SET_IN_REG_SET
> >             (&chain->live_throughout, FIRST_PSEUDO_REGISTER, regno, rsi)
> >             {
> > @@ -848,9 +853,9 @@ save_call_clobbered_regs (void)
> >
> >               /* Must recompute n_regs_saved.  */
> >               n_regs_saved = 0;
> > -             for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
> > -               if (TEST_HARD_REG_BIT (hard_regs_saved, regno))
> > -                 n_regs_saved++;
> > +          hard_reg_set_iterator hrsi;
> > +          EXECUTE_IF_SET_IN_HARD_REG_SET (hard_regs_saved, 0, regno,
> hrsi)
> > +            n_regs_saved++;
> >
> >               if (cheap
> >                   && HARD_REGISTER_P (cheap)
> > --
> > 2.53.0
> >
>

Reply via email to