Hi Jason,
Thanks for the review. I only now realized I should have split them between C
and C++.
Will do so on the respins.
>
> On 6/28/23 09:41, Tamar Christina wrote:
> > Hi All,
> >
> > FORTRAN currently has a pragma NOVECTOR for indicating that
> > vectorization should not be applied to a particular loop.
> >
> > ICC/ICX also has such a pragma for C and C++ called #pragma novector.
> >
> > As part of this patch series I need a way to easily turn off
> > vectorization of particular loops, particularly for testsuite reasons.
> >
> > This patch proposes a #pragma GCC novector that does the same for C
> > and C++ as gfortan does for FORTRAN and what ICX/ICX does for C and C++.
> >
> > I added only some basic tests here, but the next patch in the series
> > uses this in the testsuite in about ~800 tests.
> >
> > Bootstrapped Regtested on aarch64-none-linux-gnu and no issues.
> >
> > Ok for master?
> >
> > Thanks,
> > Tamar
> >
> > gcc/c-family/ChangeLog:
> >
> > * c-pragma.h (enum pragma_kind): Add PRAGMA_NOVECTOR.
> > * c-pragma.cc (init_pragma): Use it.
> >
> > gcc/c/ChangeLog:
> >
> > * c-parser.cc (c_parser_while_statement, c_parser_do_statement,
> > c_parser_for_statement, c_parser_statement_after_labels,
> > c_parse_pragma_novector, c_parser_pragma): Wire through novector
> and
> > default to false.
>
> I'll let the C maintainers review the C changes.
>
> > gcc/cp/ChangeLog:
> >
> > * cp-tree.def (RANGE_FOR_STMT): Update comment.
> > * cp-tree.h (RANGE_FOR_NOVECTOR): New.
> > (cp_convert_range_for, finish_while_stmt_cond, finish_do_stmt,
> > finish_for_cond): Add novector param.
> > * init.cc (build_vec_init): Default novector to false.
> > * method.cc (build_comparison_op): Likewise.
> > * parser.cc (cp_parser_statement): Likewise.
> > (cp_parser_for, cp_parser_c_for, cp_parser_range_for,
> > cp_convert_range_for, cp_parser_iteration_statement,
> > cp_parser_omp_for_loop, cp_parser_pragma): Support novector.
> > (cp_parser_pragma_novector): New.
> > * pt.cc (tsubst_expr): Likewise.
> > * semantics.cc (finish_while_stmt_cond, finish_do_stmt,
> > finish_for_cond): Likewise.
> >
> > gcc/ChangeLog:
> >
> > * doc/extend.texi: Document it.
> > * tree-core.h (struct tree_base): Add lang_flag_7 and reduce spare0.
> > * tree.h (TREE_LANG_FLAG_7): New.
>
> This doesn't seem necessary; I think only flags 1 and 6 are currently used in
> RANGE_FOR_STMT.
Ah fair, I thought every option needed to occupy a specific bit. I'll try to
re-use one.
>
> > gcc/testsuite/ChangeLog:
> >
> > * g++.dg/vect/vect-novector-pragma.cc: New test.
> > * gcc.dg/vect/vect-novector-pragma.c: New test.
> >
> > --- inline copy of patch --
> >...
> > @@ -13594,7 +13595,8 @@ cp_parser_condition (cp_parser* parser)
> > not included. */
> >
> > static tree
> > -cp_parser_for (cp_parser *parser, bool ivdep, unsigned short unroll)
> > +cp_parser_for (cp_parser *parser, bool ivdep, unsigned short unroll,
> > + bool novector)
>
> I wonder about combining the ivdep and novector parameters here and in
> other functions? Up to you.
As in, combine them in e.g. a struct?
>
> > @@ -49613,17 +49633,33 @@ cp_parser_pragma (cp_parser *parser,
> enum pragma_context context, bool *if_p)
> > break;
> > }
> > const bool ivdep = cp_parser_pragma_ivdep (parser, pragma_tok);
> > - unsigned short unroll;
> > + unsigned short unroll = 0;
> > + bool novector = false;
> > cp_token *tok = cp_lexer_peek_token (the_parser->lexer);
> > - if (tok->type == CPP_PRAGMA
> > - && cp_parser_pragma_kind (tok) == PRAGMA_UNROLL)
> > +
> > + while (tok->type == CPP_PRAGMA)
> > {
> > - tok = cp_lexer_consume_token (parser->lexer);
> > - unroll = cp_parser_pragma_unroll (parser, tok);
> > - tok = cp_lexer_peek_token (the_parser->lexer);
> > + switch (cp_parser_pragma_kind (tok))
> > + {
> > + case PRAGMA_UNROLL:
> > + {
> > + tok = cp_lexer_consume_token (parser->lexer);
> > + unroll = cp_parser_pragma_unroll (parser, tok);
> > + tok = cp_lexer_peek_token (the_parser->lexer);
> > + break;
> > + }
> > + case PRAGMA_NOVECTOR:
> > + {
> > + tok = cp_lexer_consume_token (parser->lexer);
> > + novector = cp_parser_pragma_novector (parser, tok);
> > + tok = cp_lexer_peek_token (the_parser->lexer);
> > + break;
> > + }
> > + default:
> > + gcc_unreachable ();
> > + }
> > }
>
> Repeating this pattern three times for the three related pragmas is too much;
> please combine the three cases into one.
Sure, I had some trouble combing them before because of the initial token being
consumed, but think I know a way.
Thanks for the review, will send updated split patch Monday.
Cheers,
Tamar
>
> Jason