On Mon, Oct 14, 2024 at 10:17 AM Andrew Pinski <pins...@gmail.com> wrote:
>
> On Mon, Oct 14, 2024 at 6:10 AM Richard Biener
> <richard.guent...@gmail.com> wrote:
> >
> > On Mon, Oct 14, 2024 at 4:32 AM Andrew Pinski <quic_apin...@quicinc.com> 
> > wrote:
> > >
> > > Having a limit of 2 params for NEXT_PASS was just done because I didn't 
> > > think there was
> > > a way to handle arbitrary number of params. But I found that we can 
> > > handle this
> > > via a static const variable array (constexpr so we know it is true or 
> > > false at compile time)
> > > and just loop over the array.
> > >
> > > Note I keep around NEXT_PASS_WITH_ARG and NEXT_PASS macros instead of 
> > > always using
> > > NEXT_PASS_WITH_ARGS macro to make sure these cases get optimized for -O0 
> > > (stage1).
> > >
> > > Bootstrapped and tested on x86_64-linux-gnu.
> >
> > OK if nobody has additional comments - do we document passes.def in
> > the internals manual btw?
> > Maybe that should be adjusted?
>
> passes.def is mentioned in passes.texi but does not describe how
> passes.def functions.

I think this fits under bug 951, btw:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=951

> That is NEXT_PASS/PUSH_INSERT_PASSES_WITHIN/etc.
>
> I did notice that INSERT_PASS_AFTER/INSERT_PASS_BEFORE still only
> supports one optional arg instead of multiple optional arg/params. I
> will fix that and resubmit this patch.
>
> Thanks,
> Andrew Pinski
>
> >
> > > gcc/ChangeLog:
> > >
> > >         * gen-pass-instances.awk: Remove the limit of the params.
> > >         * pass_manager.h (NEXT_PASS_WITH_ARG2): Rename to ...
> > >         (NEXT_PASS_WITH_ARGS): This.
> > >         * passes.cc (NEXT_PASS_WITH_ARG2): Rename to ...
> > >         (NEXT_PASS_WITH_ARGS): This and support more than 2 params by 
> > > using
> > >         a constexpr array.
> > >
> > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> > > ---
> > >  gcc/gen-pass-instances.awk | 11 ++---------
> > >  gcc/pass_manager.h         |  2 +-
> > >  gcc/passes.cc              | 13 +++++++++----
> > >  3 files changed, 12 insertions(+), 14 deletions(-)
> > >
> > > diff --git a/gcc/gen-pass-instances.awk b/gcc/gen-pass-instances.awk
> > > index def09347765..9bd73c9ce0f 100644
> > > --- a/gcc/gen-pass-instances.awk
> > > +++ b/gcc/gen-pass-instances.awk
> > > @@ -195,7 +195,6 @@ function replace_pass(line, fnname,                 
> > > num, i)
> > >  }
> > >
> > >  END {
> > > -  max_number_args = 2;
> > >    for (i = 1; i < lineno; i++)
> > >      {
> > >        ret = parse_line(lines[i], "NEXT_PASS");
> > > @@ -220,13 +219,8 @@ END {
> > >           if (num_args > 0)
> > >             {
> > >               printf "NEXT_PASS_WITH_ARG";
> > > -             if (num_args > max_number_args)
> > > -               {
> > > -                 print "ERROR: Only supports up to " max_number_args " 
> > > args to NEXT_PASS";
> > > -                 exit 1;
> > > -               }
> > >               if (num_args != 1)
> > > -               printf num_args;
> > > +               printf "S";
> > >             }
> > >           else
> > >             printf "NEXT_PASS";
> > > @@ -266,8 +260,7 @@ END {
> > >    print "#undef POP_INSERT_PASSES"
> > >    print "#undef NEXT_PASS"
> > >    print "#undef NEXT_PASS_WITH_ARG"
> > > -  for (i = 2; i <= max_number_args; i++)
> > > -    print "#undef NEXT_PASS_WITH_ARG" i
> > > +  print "#undef NEXT_PASS_WITH_ARGS"
> > >    print "#undef TERMINATE_PASS_LIST"
> > >  }
> > >
> > > diff --git a/gcc/pass_manager.h b/gcc/pass_manager.h
> > > index f18ae026257..294cdd0b1f7 100644
> > > --- a/gcc/pass_manager.h
> > > +++ b/gcc/pass_manager.h
> > > @@ -130,7 +130,7 @@ private:
> > >  #define POP_INSERT_PASSES()
> > >  #define NEXT_PASS(PASS, NUM) opt_pass *PASS ## _ ## NUM
> > >  #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) NEXT_PASS (PASS, NUM)
> > > -#define NEXT_PASS_WITH_ARG2(PASS, NUM, ARG0, ARG1) NEXT_PASS (PASS, NUM)
> > > +#define NEXT_PASS_WITH_ARGS(PASS, NUM, ...) NEXT_PASS (PASS, NUM)
> > >  #define TERMINATE_PASS_LIST(PASS)
> > >
> > >  #include "pass-instances.def"
> > > diff --git a/gcc/passes.cc b/gcc/passes.cc
> > > index b5475fce522..ae80f40b96a 100644
> > > --- a/gcc/passes.cc
> > > +++ b/gcc/passes.cc
> > > @@ -1589,7 +1589,7 @@ pass_manager::pass_manager (context *ctxt)
> > >  #define POP_INSERT_PASSES()
> > >  #define NEXT_PASS(PASS, NUM) PASS ## _ ## NUM = NULL
> > >  #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) NEXT_PASS (PASS, NUM)
> > > -#define NEXT_PASS_WITH_ARG2(PASS, NUM, ARG0, ARG1) NEXT_PASS (PASS, NUM)
> > > +#define NEXT_PASS_WITH_ARGS(PASS, NUM, ...) NEXT_PASS (PASS, NUM)
> > >  #define TERMINATE_PASS_LIST(PASS)
> > >  #include "pass-instances.def"
> > >
> > > @@ -1636,11 +1636,16 @@ pass_manager::pass_manager (context *ctxt)
> > >        PASS ## _ ## NUM->set_pass_param (0, ARG);       \
> > >      } while (0)
> > >
> > > -#define NEXT_PASS_WITH_ARG2(PASS, NUM, ARG0, ARG1)     \
> > > +#define NEXT_PASS_WITH_ARGS(PASS, NUM, ...)            \
> > >      do {                                               \
> > >        NEXT_PASS (PASS, NUM);                           \
> > > -      PASS ## _ ## NUM->set_pass_param (0, ARG0);      \
> > > -      PASS ## _ ## NUM->set_pass_param (1, ARG1);      \
> > > +      static constexpr bool values[] = { __VA_ARGS__ };        \
> > > +      unsigned i = 0;                                  \
> > > +      for (bool value : values)                                \
> > > +       {                                               \
> > > +         PASS ## _ ## NUM->set_pass_param (i, value);  \
> > > +         i++;                                          \
> > > +       }                                               \
> > >      } while (0)
> > >
> > >  #include "pass-instances.def"
> > > --
> > > 2.43.0
> > >

Reply via email to