Hi!
This patch fixes an issue in handling combined directives. The
code now accepts clauses for both the loop directive and the
other directive, i.e., parallel or kernels.
OK for gomp4 branch?
Thanks!
Jim
ChangeLog
2014-10-27 James Norris<jnor...@codesourcery.com>
* c/c-parser.c (c_parser_oacc_loop, OACC_LOOP_CLAUSE_MASK):
Relocate.
(c_parser_oacc_kernels, c_parser_oacc_parallel): Fix combined
directives.
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index 0480932..f0d7138 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -11857,6 +11857,34 @@ c_parser_oacc_data (location_t loc, c_parser *parser)
}
/* OpenACC 2.0:
+ # pragma acc loop oacc-loop-clause[optseq] new-line
+ structured-block
+
+ LOC is the location of the #pragma token.
+*/
+
+#define OACC_LOOP_CLAUSE_MASK \
+ ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE) \
+ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) )
+
+static tree
+c_parser_oacc_loop (location_t loc, c_parser *parser, char *p_name)
+{
+ tree stmt, clauses, block;
+
+ strcat (p_name, " loop");
+
+ clauses = c_parser_oacc_all_clauses (parser, OACC_LOOP_CLAUSE_MASK, p_name);
+
+ block = c_begin_compound_stmt (true);
+ stmt = c_parser_omp_for_loop (loc, parser, OACC_LOOP, clauses, NULL);
+ block = c_end_compound_stmt (loc, block, true);
+ add_stmt (block);
+
+ return stmt;
+}
+
+/* OpenACC 2.0:
# pragma acc kernels oacc-kernels-clause[optseq] new-line
structured-block
@@ -11881,60 +11909,32 @@ c_parser_oacc_data (location_t loc, c_parser *parser)
static tree
c_parser_oacc_kernels (location_t loc, c_parser *parser, char *p_name)
{
- tree stmt, clauses = NULL_TREE, block;
+ tree stmt, clauses, block;
+ omp_clause_mask mask;
+ bool is_combined = false;
strcat (p_name, " kernels");
+ mask = OACC_KERNELS_CLAUSE_MASK;
if (c_parser_next_token_is (parser, CPP_NAME))
{
- const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
- if (strcmp (p, "loop") == 0)
+ stmt = c_parser_peek_token (parser)->value;
+ if (!strcmp ("loop", IDENTIFIER_POINTER (stmt)))
{
+ mask |= OACC_LOOP_CLAUSE_MASK;
+ strcat (p_name, " loop");
c_parser_consume_token (parser);
- block = c_begin_omp_parallel ();
- c_parser_oacc_loop (loc, parser, p_name);
- stmt = c_finish_oacc_kernels (loc, clauses, block);
- OACC_KERNELS_COMBINED (stmt) = 1;
- return stmt;
+ is_combined = true;
}
}
- clauses = c_parser_oacc_all_clauses (parser, OACC_KERNELS_CLAUSE_MASK,
- p_name);
+ clauses = c_parser_oacc_all_clauses (parser, mask, p_name);
block = c_begin_omp_parallel ();
add_stmt (c_parser_omp_structured_block (parser));
-
stmt = c_finish_oacc_kernels (loc, clauses, block);
-
- return stmt;
-}
-
-/* OpenACC 2.0:
- # pragma acc loop oacc-loop-clause[optseq] new-line
- structured-block
-
- LOC is the location of the #pragma token.
-*/
-
-#define OACC_LOOP_CLAUSE_MASK \
- ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE) \
- | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) )
-
-static tree
-c_parser_oacc_loop (location_t loc, c_parser *parser, char *p_name)
-{
- tree stmt, clauses, block;
-
- strcat (p_name, " loop");
-
- clauses = c_parser_oacc_all_clauses (parser, OACC_LOOP_CLAUSE_MASK, p_name);
-
- block = c_begin_compound_stmt (true);
- stmt = c_parser_omp_for_loop (loc, parser, OACC_LOOP, clauses, NULL);
- block = c_end_compound_stmt (loc, block, true);
- add_stmt (block);
-
+ if (is_combined)
+ OACC_KERNELS_COMBINED (stmt) = 1;
return stmt;
}
@@ -11967,32 +11967,32 @@ c_parser_oacc_loop (location_t loc, c_parser *parser, char *p_name)
static tree
c_parser_oacc_parallel (location_t loc, c_parser *parser, char *p_name)
{
- tree stmt, clauses = NULL_TREE, block;
+ tree stmt, clauses, block;
+ omp_clause_mask mask;
+ bool is_combined = false;
strcat (p_name, " parallel");
+ mask = OACC_PARALLEL_CLAUSE_MASK;
if (c_parser_next_token_is (parser, CPP_NAME))
{
- const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
- if (strcmp (p, "loop") == 0)
+ stmt = c_parser_peek_token (parser)->value;
+ if (!strcmp ("loop", IDENTIFIER_POINTER (stmt)))
{
+ mask |= OACC_LOOP_CLAUSE_MASK;
+ strcat (p_name, " loops");
c_parser_consume_token (parser);
- block = c_begin_omp_parallel ();
- c_parser_oacc_loop (loc, parser, p_name);
- stmt = c_finish_oacc_parallel (loc, clauses, block);
- OACC_PARALLEL_COMBINED (stmt) = 1;
- return stmt;
+ is_combined = true;
}
}
- clauses = c_parser_oacc_all_clauses (parser, OACC_PARALLEL_CLAUSE_MASK,
- p_name);
+ clauses = c_parser_oacc_all_clauses (parser, mask, p_name);
block = c_begin_omp_parallel ();
add_stmt (c_parser_omp_structured_block (parser));
-
stmt = c_finish_oacc_parallel (loc, clauses, block);
-
+ if (is_combined)
+ OACC_PARALLEL_COMBINED (stmt) = 1;
return stmt;
}