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