Commit 43ae206c by Tobias Burnus Committed by Tobias Burnus

re PR other/33426 (Support of #pragma ivdep)

2013-10-25  Tobias Burnus  <burnus@net-b.de>

        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
parent 66d6cbaa
2013-10-25 Tobias Burnus <burnus@net-b.de>
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 <polacek@redhat.com> 2013-10-24 Marek Polacek <polacek@redhat.com>
PR c++/58705 PR c++/58705
......
...@@ -1970,13 +1970,13 @@ static tree cp_parser_selection_statement ...@@ -1970,13 +1970,13 @@ static tree cp_parser_selection_statement
static tree cp_parser_condition static tree cp_parser_condition
(cp_parser *); (cp_parser *);
static tree cp_parser_iteration_statement static tree cp_parser_iteration_statement
(cp_parser *); (cp_parser *, bool);
static bool cp_parser_for_init_statement static bool cp_parser_for_init_statement
(cp_parser *, tree *decl); (cp_parser *, tree *decl);
static tree cp_parser_for static tree cp_parser_for
(cp_parser *); (cp_parser *, bool);
static tree cp_parser_c_for static tree cp_parser_c_for
(cp_parser *, tree, tree); (cp_parser *, tree, tree, bool);
static tree cp_parser_range_for static tree cp_parser_range_for
(cp_parser *, tree, tree, tree); (cp_parser *, tree, tree, tree);
static void do_range_for_auto_deduction static void do_range_for_auto_deduction
...@@ -9231,7 +9231,7 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr, ...@@ -9231,7 +9231,7 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr,
case RID_WHILE: case RID_WHILE:
case RID_DO: case RID_DO:
case RID_FOR: case RID_FOR:
statement = cp_parser_iteration_statement (parser); statement = cp_parser_iteration_statement (parser, false);
break; break;
case RID_BREAK: case RID_BREAK:
...@@ -9892,7 +9892,7 @@ cp_parser_condition (cp_parser* parser) ...@@ -9892,7 +9892,7 @@ cp_parser_condition (cp_parser* parser)
not included. */ not included. */
static tree static tree
cp_parser_for (cp_parser *parser) cp_parser_for (cp_parser *parser, bool ivdep)
{ {
tree init, scope, decl; tree init, scope, decl;
bool is_range_for; bool is_range_for;
...@@ -9906,11 +9906,11 @@ cp_parser_for (cp_parser *parser) ...@@ -9906,11 +9906,11 @@ cp_parser_for (cp_parser *parser)
if (is_range_for) if (is_range_for)
return cp_parser_range_for (parser, scope, init, decl); return cp_parser_range_for (parser, scope, init, decl);
else else
return cp_parser_c_for (parser, scope, init); return cp_parser_c_for (parser, scope, init, ivdep);
} }
static tree 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 */ /* Normal for loop */
tree condition = NULL_TREE; tree condition = NULL_TREE;
...@@ -9924,7 +9924,19 @@ cp_parser_c_for (cp_parser *parser, tree scope, tree init) ...@@ -9924,7 +9924,19 @@ cp_parser_c_for (cp_parser *parser, tree scope, tree init)
/* If there's a condition, process it. */ /* If there's a condition, process it. */
if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)) 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 "
"%<GCC ivdep%> pragma");
condition = error_mark_node;
}
finish_for_cond (condition, stmt); finish_for_cond (condition, stmt);
/* Look for the `;'. */ /* Look for the `;'. */
cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON); cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
...@@ -10287,7 +10299,7 @@ cp_parser_range_for_member_function (tree range, tree identifier) ...@@ -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. */ Returns the new WHILE_STMT, DO_STMT, FOR_STMT or RANGE_FOR_STMT. */
static tree static tree
cp_parser_iteration_statement (cp_parser* parser) cp_parser_iteration_statement (cp_parser* parser, bool ivdep)
{ {
cp_token *token; cp_token *token;
enum rid keyword; enum rid keyword;
...@@ -10360,7 +10372,7 @@ cp_parser_iteration_statement (cp_parser* parser) ...@@ -10360,7 +10372,7 @@ cp_parser_iteration_statement (cp_parser* parser)
/* Look for the `('. */ /* Look for the `('. */
cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN); cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
statement = cp_parser_for (parser); statement = cp_parser_for (parser, ivdep);
/* Look for the `)'. */ /* Look for the `)'. */
cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN); cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
...@@ -30909,6 +30921,20 @@ cp_parser_pragma (cp_parser *parser, enum pragma_context context) ...@@ -30909,6 +30921,20 @@ cp_parser_pragma (cp_parser *parser, enum pragma_context context)
"%<#pragma omp sections%> construct"); "%<#pragma omp sections%> construct");
break; 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: default:
gcc_assert (id >= PRAGMA_FIRST_EXTERNAL); gcc_assert (id >= PRAGMA_FIRST_EXTERNAL);
c_invoke_pragma_handler (id); c_invoke_pragma_handler (id);
......
2013-10-25 Tobias Burnus <burnus@net-b.de>
* g++.dg/parse/ivdep.C: New.
* g++.dg/vect/pr33426-ivdep.cc: New.
2013-10-24 Richard Henderson <rth@redhat.com> 2013-10-24 Richard Henderson <rth@redhat.com>
PR rtl/58542 PR rtl/58542
......
/* { 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];
}
}
/* { 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" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment