diff mbox

[gomp4] Fix combined directives.

Message ID 544E8849.1070406@codesourcery.com
State New
Headers show

Commit Message

James Norris Oct. 27, 2014, 6 p.m. UTC
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<jnorris@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.

Comments

Jakub Jelinek Oct. 27, 2014, 6:25 p.m. UTC | #1
On Mon, Oct 27, 2014 at 01:00:41PM -0500, James Norris wrote:
>      2014-10-27  James Norris<jnorris@codesourcery.com>

Missing two spaces before <.

>          * c/c-parser.c (c_parser_oacc_loop, OACC_LOOP_CLAUSE_MASK):

Note, gcc/c/ directory has its own ChangeLog, so the c/ prefix doesn't
belong into ChangeLog entries.

> +#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);

I must say I'm quite surprised that you hardcode the mask here, can loop
never be combined with acc parallel?  Look what I'm doing for OpenMP
constructs?

> +      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);

Doesn't this really mean that you don't parse the the loop as loop?

Also, please avoid the extra space in "=  c_...".

	Jakub
diff mbox

Patch

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