public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [gomp4] Fix combined directives.
@ 2014-10-27 18:04 James Norris
  2014-10-27 18:34 ` Jakub Jelinek
  0 siblings, 1 reply; 2+ messages in thread
From: James Norris @ 2014-10-27 18:04 UTC (permalink / raw)
  To: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 454 bytes --]

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.

[-- Attachment #2: combdir.patch --]
[-- Type: text/x-patch, Size: 4560 bytes --]

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [gomp4] Fix combined directives.
  2014-10-27 18:04 [gomp4] Fix combined directives James Norris
@ 2014-10-27 18:34 ` Jakub Jelinek
  0 siblings, 0 replies; 2+ messages in thread
From: Jakub Jelinek @ 2014-10-27 18:34 UTC (permalink / raw)
  To: James Norris; +Cc: gcc-patches

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-10-27 18:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-27 18:04 [gomp4] Fix combined directives James Norris
2014-10-27 18:34 ` Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).