diff options
author | Tobias Burnus <burnus@net-b.de> | 2013-10-24 18:25:44 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2013-10-24 18:25:44 +0200 |
commit | 8170608bfc488f0dde37b332776e59c912244366 (patch) | |
tree | ddaa06506f828f6ab35f493e688951e5b042fbdf /gcc/c | |
parent | a079f50a721208e94d23fee77ad77322ad1b74a8 (diff) | |
download | gcc-8170608bfc488f0dde37b332776e59c912244366.zip gcc-8170608bfc488f0dde37b332776e59c912244366.tar.gz gcc-8170608bfc488f0dde37b332776e59c912244366.tar.bz2 |
re PR other/33426 (Support of #pragma ivdep)
2013-08-24 Tobias Burnus <burnus@net-b.de>
PR other/33426
* c-pragma.c (init_pragma) Add #pragma ivdep handling.
* c-pragma.h (pragma_kind): Add PRAGMA_IVDEP.
PR other/33426
* c-parser.c (c_parser_pragma, c_parser_for_statement):
Handle PRAGMA_IVDEP.
(c_parser_statement_after_labels): Update call.
PR other/33426
* tree-cfg.c (replace_loop_annotate): New function.
(execute_build_cfg): Call it.
* gimplify.c (gimple_boolify, gimplify_expr): Handle
* ANNOTATE_EXPR.
* internal-fn.c (expand_ANNOTATE): New function.
* internal-fn.def (ANNOTATE): Define as new internal function.
* tree-core.h (tree_node_kind): Add annot_expr_ivdep_kind.
* tree-pretty-print.c (dump_generic_node): Handle ANNOTATE_EXPR.
* tree.def (ANNOTATE_EXPR): New DEFTREECODE.
* doc/extend.texi (Pragmas): Document #pragma ivdep.
* doc/generic.texi (Expressions): Document ANNOTATE_EXPR.
PR other/33426
* testsuite/gcc.dg/ivdep.c: New.
* testsuite/gcc.dg/vect/vect-ivdep-1.c: New.
From-SVN: r204021
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c/c-parser.c | 33 |
2 files changed, 35 insertions, 5 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 1d0dd95..22cf8ff 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,10 @@ +2013-08-24 Tobias Burnus <burnus@net-b.de> + + PR other/33426 + * c-parser.c (c_parser_pragma, c_parser_for_statement): + Handle PRAGMA_IVDEP. + (c_parser_statement_after_labels): Update call. + 2013-10-24 Marek Polacek <polacek@redhat.com> * c-parser.c (c_parser_struct_declaration): Add a comment. diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 4d6c930..4f25078 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -1159,7 +1159,7 @@ 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_for_statement (c_parser *); +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 *); static tree c_parser_asm_goto_operands (c_parser *); @@ -4585,7 +4585,7 @@ c_parser_statement_after_labels (c_parser *parser) c_parser_do_statement (parser); break; case RID_FOR: - c_parser_for_statement (parser); + c_parser_for_statement (parser, false); break; case RID_GOTO: c_parser_consume_token (parser); @@ -5038,7 +5038,7 @@ c_parser_do_statement (c_parser *parser) */ static void -c_parser_for_statement (c_parser *parser) +c_parser_for_statement (c_parser *parser, bool ivdep) { tree block, cond, incr, save_break, save_cont, body; /* The following are only used when parsing an ObjC foreach statement. */ @@ -5144,8 +5144,17 @@ c_parser_for_statement (c_parser *parser) { if (c_parser_next_token_is (parser, CPP_SEMICOLON)) { - c_parser_consume_token (parser); - cond = NULL_TREE; + if (ivdep) + { + c_parser_error (parser, "missing loop condition in loop with " + "%<GCC ivdep%> pragma"); + cond = error_mark_node; + } + else + { + c_parser_consume_token (parser); + cond = NULL_TREE; + } } else { @@ -5159,6 +5168,10 @@ c_parser_for_statement (c_parser *parser) c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); } + if (ivdep && cond != error_mark_node) + cond = build2 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, + build_int_cst (integer_type_node, + annot_expr_ivdep_kind)); } /* Parse the increment expression (the third expression in a for-statement). In the case of a foreach-statement, this is @@ -9086,6 +9099,16 @@ c_parser_pragma (c_parser *parser, enum pragma_context context) case PRAGMA_OMP_DECLARE_REDUCTION: c_parser_omp_declare (parser, context); return false; + 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)) + { + c_parser_error (parser, "for statement expected"); + return false; + } + c_parser_for_statement (parser, true); + return false; case PRAGMA_GCC_PCH_PREPROCESS: c_parser_error (parser, "%<#pragma GCC pch_preprocess%> must be first"); |