@@ -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;
}