From: Tobias Burnus Date: Fri, 25 Oct 2013 05:47:25 +0000 (+0200) Subject: re PR other/33426 (Support of #pragma ivdep) X-Git-Tag: upstream/12.2.0~67048 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=43ae206cf9094ef913c3d91e1a0be6b3f07c95d0;p=platform%2Fupstream%2Fgcc.git re PR other/33426 (Support of #pragma ivdep) 2013-10-25 Tobias Burnus PR other/33426 * parser.c (cp_parser_iteration_statement, cp_parser_for, cp_parser_c_for, cp_parser_pragma): Handle IVDEP pragma. * g++.dg/parse/ivdep.C: New. * g++.dg/vect/pr33426-ivdep.cc: New. From-SVN: r204047 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5fa01fe..dfe4a3f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2013-10-25 Tobias Burnus + + PR other/33426 + * parser.c (cp_parser_iteration_statement, + cp_parser_for, cp_parser_c_for, cp_parser_pragma): Handle + IVDEP pragma. + 2013-10-24 Marek Polacek PR c++/58705 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index c5d19a4..8deffc3 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1970,13 +1970,13 @@ static tree cp_parser_selection_statement static tree cp_parser_condition (cp_parser *); static tree cp_parser_iteration_statement - (cp_parser *); + (cp_parser *, bool); static bool cp_parser_for_init_statement (cp_parser *, tree *decl); static tree cp_parser_for - (cp_parser *); + (cp_parser *, bool); static tree cp_parser_c_for - (cp_parser *, tree, tree); + (cp_parser *, tree, tree, bool); static tree cp_parser_range_for (cp_parser *, tree, tree, tree); static void do_range_for_auto_deduction @@ -9231,7 +9231,7 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr, case RID_WHILE: case RID_DO: case RID_FOR: - statement = cp_parser_iteration_statement (parser); + statement = cp_parser_iteration_statement (parser, false); break; case RID_BREAK: @@ -9892,7 +9892,7 @@ cp_parser_condition (cp_parser* parser) not included. */ static tree -cp_parser_for (cp_parser *parser) +cp_parser_for (cp_parser *parser, bool ivdep) { tree init, scope, decl; bool is_range_for; @@ -9906,11 +9906,11 @@ cp_parser_for (cp_parser *parser) if (is_range_for) return cp_parser_range_for (parser, scope, init, decl); else - return cp_parser_c_for (parser, scope, init); + return cp_parser_c_for (parser, scope, init, ivdep); } static tree -cp_parser_c_for (cp_parser *parser, tree scope, tree init) +cp_parser_c_for (cp_parser *parser, tree scope, tree init, bool ivdep) { /* Normal for loop */ tree condition = NULL_TREE; @@ -9924,7 +9924,19 @@ cp_parser_c_for (cp_parser *parser, tree scope, tree init) /* If there's a condition, process it. */ if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)) - condition = cp_parser_condition (parser); + { + condition = cp_parser_condition (parser); + if (ivdep) + condition = build2 (ANNOTATE_EXPR, TREE_TYPE (condition), condition, + build_int_cst (integer_type_node, + annot_expr_ivdep_kind)); + } + else if (ivdep) + { + cp_parser_error (parser, "missing loop condition in loop with " + "% pragma"); + condition = error_mark_node; + } finish_for_cond (condition, stmt); /* Look for the `;'. */ cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON); @@ -10287,7 +10299,7 @@ cp_parser_range_for_member_function (tree range, tree identifier) Returns the new WHILE_STMT, DO_STMT, FOR_STMT or RANGE_FOR_STMT. */ static tree -cp_parser_iteration_statement (cp_parser* parser) +cp_parser_iteration_statement (cp_parser* parser, bool ivdep) { cp_token *token; enum rid keyword; @@ -10360,7 +10372,7 @@ cp_parser_iteration_statement (cp_parser* parser) /* Look for the `('. */ cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN); - statement = cp_parser_for (parser); + statement = cp_parser_for (parser, ivdep); /* Look for the `)'. */ cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN); @@ -30909,6 +30921,20 @@ cp_parser_pragma (cp_parser *parser, enum pragma_context context) "%<#pragma omp sections%> construct"); break; + case PRAGMA_IVDEP: + { + cp_parser_skip_to_pragma_eol (parser, pragma_tok); + cp_token *tok; + tok = cp_lexer_peek_token (the_parser->lexer); + if (tok->type != CPP_KEYWORD || tok->keyword != RID_FOR) + { + cp_parser_error (parser, "for statement expected"); + return false; + } + cp_parser_iteration_statement (parser, true); + return true; + } + default: gcc_assert (id >= PRAGMA_FIRST_EXTERNAL); c_invoke_pragma_handler (id); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6025f46..6ffba19 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-10-25 Tobias Burnus + + * g++.dg/parse/ivdep.C: New. + * g++.dg/vect/pr33426-ivdep.cc: New. + 2013-10-24 Richard Henderson PR rtl/58542 diff --git a/gcc/testsuite/g++.dg/parse/ivdep.C b/gcc/testsuite/g++.dg/parse/ivdep.C new file mode 100644 index 0000000..23d51de --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ivdep.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ + +/* PR other/33426 */ + +void foo(int n, int *a, int *b, int *c, int *d, int *e) { + int i, j; +#pragma GCC ivdep + for (i = 0; ; ++i) { /* { dg-error "missing loop condition in loop with 'GCC ivdep' pragma before ';' token" } */ + a[i] = b[i] + c[i]; + } +} diff --git a/gcc/testsuite/g++.dg/vect/pr33426-ivdep.cc b/gcc/testsuite/g++.dg/vect/pr33426-ivdep.cc new file mode 100644 index 0000000..7f867c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr33426-ivdep.cc @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_float } */ +/* { dg-options "-O3 -fopt-info-vec-optimized" } */ + +/* PR other/33426 */ +/* Testing whether #pragma ivdep is working. */ + +void foo(int n, int *a, int *b, int *c, int *d, int *e) { + int i; +#pragma GCC ivdep + for (i = 0; i < n; ++i) { + a[i] = b[i] + c[i]; + } +} + +/* { dg-message "loop vectorized" "" { target *-*-* } 0 } */ +/* { dg-bogus "version" "" { target *-*-* } 0 } */ +/* { dg-bogus "alias" "" { target *-*-* } 0 } */ +/* { dg-final { cleanup-tree-dump "vect" } } */