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