On Fri, Jun 30, 2023, 12:18 PM Tamar Christina <[email protected]>
wrote:
> 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?
>
I was thinking in an int or enum.
>
> > > @@ -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
>
>