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.  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