From 4c90c04cbb5bf884a8a3e5ccc20d25c020fb3780 Mon Sep 17 00:00:00 2001 From: burnus Date: Sun, 27 Oct 2013 07:40:31 +0000 Subject: [PATCH] 2013-10-27 Tobias Burnus gcc/c/ PR other/33426 * c-parser.c (c_parser_while_statement, * c_parser_while_statement, c_parser_pragma): Add GCC ivdep support to 'do' and 'while'. (c_parser_statement_after_labels): Update calls. gcc/testsuite/ PR other/33426 * gcc.dg/vect/vect-ivdep-2.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204102 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/c/ChangeLog | 7 +++++++ gcc/c/c-parser.c | 35 +++++++++++++++++++++++--------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/vect/vect-ivdep-2.c | 35 ++++++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/vect-ivdep-2.c diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index a47098f..707c5d2 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,10 @@ +2013-10-27 Tobias Burnus + + PR other/33426 + * c-parser.c (c_parser_while_statement, c_parser_while_statement, + c_parser_pragma): Add GCC ivdep support to 'do' and 'while'. + (c_parser_statement_after_labels): Update calls. + 2013-10-24 Tobias Burnus PR other/33426 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 4f25078..9ccae3b 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -1157,8 +1157,8 @@ static void c_parser_statement (c_parser *); static void c_parser_statement_after_labels (c_parser *); static void c_parser_if_statement (c_parser *); static void c_parser_switch_statement (c_parser *); -static void c_parser_while_statement (c_parser *); -static void c_parser_do_statement (c_parser *); +static void c_parser_while_statement (c_parser *, bool); +static void c_parser_do_statement (c_parser *, bool); static void c_parser_for_statement (c_parser *, bool); static tree c_parser_asm_statement (c_parser *); static tree c_parser_asm_operands (c_parser *); @@ -4579,10 +4579,10 @@ c_parser_statement_after_labels (c_parser *parser) c_parser_switch_statement (parser); break; case RID_WHILE: - c_parser_while_statement (parser); + c_parser_while_statement (parser, false); break; case RID_DO: - c_parser_do_statement (parser); + c_parser_do_statement (parser, false); break; case RID_FOR: c_parser_for_statement (parser, false); @@ -4912,7 +4912,7 @@ c_parser_switch_statement (c_parser *parser) */ static void -c_parser_while_statement (c_parser *parser) +c_parser_while_statement (c_parser *parser, bool ivdep) { tree block, cond, body, save_break, save_cont; location_t loc; @@ -4927,6 +4927,11 @@ c_parser_while_statement (c_parser *parser) "statement"); cond = error_mark_node; } + + if (ivdep && cond != error_mark_node) + cond = build2 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, + build_int_cst (integer_type_node, + annot_expr_ivdep_kind)); save_break = c_break_label; c_break_label = NULL_TREE; save_cont = c_cont_label; @@ -4945,7 +4950,7 @@ c_parser_while_statement (c_parser *parser) */ static void -c_parser_do_statement (c_parser *parser) +c_parser_do_statement (c_parser *parser, bool ivdep) { tree block, cond, body, save_break, save_cont, new_break, new_cont; location_t loc; @@ -4974,7 +4979,10 @@ c_parser_do_statement (c_parser *parser) "do-while statement"); cond = error_mark_node; } - + if (ivdep && cond != error_mark_node) + cond = build2 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, + build_int_cst (integer_type_node, + annot_expr_ivdep_kind)); if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) c_parser_skip_to_end_of_block_or_statement (parser); c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false); @@ -9102,12 +9110,19 @@ c_parser_pragma (c_parser *parser, enum pragma_context context) case PRAGMA_IVDEP: c_parser_consume_pragma (parser); c_parser_skip_to_pragma_eol (parser); - if (!c_parser_next_token_is_keyword (parser, RID_FOR)) + if (!c_parser_next_token_is_keyword (parser, RID_FOR) + && !c_parser_next_token_is_keyword (parser, RID_WHILE) + && !c_parser_next_token_is_keyword (parser, RID_DO)) { - c_parser_error (parser, "for statement expected"); + c_parser_error (parser, "for, while or do statement expected"); return false; } - c_parser_for_statement (parser, true); + if (c_parser_next_token_is_keyword (parser, RID_FOR)) + c_parser_for_statement (parser, true); + else if (c_parser_next_token_is_keyword (parser, RID_WHILE)) + c_parser_while_statement (parser, true); + else + c_parser_do_statement (parser, true); return false; case PRAGMA_GCC_PCH_PREPROCESS: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a9aa27d..fa2eb7d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-10-27 Tobias Burnus + + PR other/33426 + * gcc.dg/vect/vect-ivdep-2.c: New. + 2013-10-26 Oleg Endo PR target/52483 diff --git a/gcc/testsuite/gcc.dg/vect/vect-ivdep-2.c b/gcc/testsuite/gcc.dg/vect/vect-ivdep-2.c new file mode 100644 index 0000000..ff9cb20 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-ivdep-2.c @@ -0,0 +1,35 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_float } */ +/* { dg-additional-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 i; + i = 0; +#pragma GCC ivdep + while(i < n) + { + a[i] = b[i] + c[i]; + ++i; + } +} + +void bar(int n, int *a, int *b, int *c) { + int i; + i = 0; +#pragma GCC ivdep + do + { + a[i] = b[i] + c[i]; + ++i; + } + while(i < n); +} + + +/* { dg-message "loop vectorized" "" { target *-*-* } 0 } */ +/* { dg-bogus " version" "" { target *-*-* } 0 } */ +/* { dg-bogus " alias" "" { target *-*-* } 0 } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ -- 2.7.4