re PR c++/71349 (Combined async target clause parsing issues)
authorJakub Jelinek <jakub@redhat.com>
Mon, 30 May 2016 21:36:24 +0000 (23:36 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 30 May 2016 21:36:24 +0000 (23:36 +0200)
PR c++/71349
* c-parser.c (c_parser_omp_for): Don't disallow nowait clause
when combined with target construct.

* parser.c (cp_parser_omp_for): Don't disallow nowait clause
when combined with target construct.
(cp_parser_omp_parallel): Pass cclauses == NULL as last argument
to cp_parser_omp_all_clauses.

* c-omp.c (c_omp_split_clauses): Put OMP_CLAUSE_DEPEND to
C_OMP_CLAUSE_SPLIT_TARGET.  Put OMP_CLAUSE_NOWAIT to
C_OMP_CLAUSE_SPLIT_TARGET if combined with target construct,
instead of C_OMP_CLAUSE_SPLIT_FOR.

* c-c++-common/gomp/clauses-1.c (bar): Add dd argument.  Add
nowait depend(inout: dd[0]) clauses where permitted.

From-SVN: r236900

gcc/c-family/ChangeLog
gcc/c-family/c-omp.c
gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/clauses-1.c

index 7f0ca2d805735a716b40fb72e54fcbab5eb624f4..f2f98c5c863e3e8af71cdb13f3cab41e095ba4d8 100644 (file)
@@ -1,3 +1,11 @@
+2016-05-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/71349
+       * c-omp.c (c_omp_split_clauses): Put OMP_CLAUSE_DEPEND to
+       C_OMP_CLAUSE_SPLIT_TARGET.  Put OMP_CLAUSE_NOWAIT to
+       C_OMP_CLAUSE_SPLIT_TARGET if combined with target construct,
+       instead of C_OMP_CLAUSE_SPLIT_FOR.
+
 2016-05-24  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/70434
index be401bbb6b411c3dbab87b5c88ceb1ef75416d96..1691c40f11a661cafb8fbe53a4689be64d13ad60 100644 (file)
@@ -983,6 +983,7 @@ c_omp_split_clauses (location_t loc, enum tree_code code,
        case OMP_CLAUSE_MAP:
        case OMP_CLAUSE_IS_DEVICE_PTR:
        case OMP_CLAUSE_DEFAULTMAP:
+       case OMP_CLAUSE_DEPEND:
          s = C_OMP_CLAUSE_SPLIT_TARGET;
          break;
        case OMP_CLAUSE_NUM_TEAMS:
@@ -998,7 +999,6 @@ c_omp_split_clauses (location_t loc, enum tree_code code,
          s = C_OMP_CLAUSE_SPLIT_PARALLEL;
          break;
        case OMP_CLAUSE_ORDERED:
-       case OMP_CLAUSE_NOWAIT:
          s = C_OMP_CLAUSE_SPLIT_FOR;
          break;
        case OMP_CLAUSE_SCHEDULE:
@@ -1333,6 +1333,18 @@ c_omp_split_clauses (location_t loc, enum tree_code code,
          else
            s = C_OMP_CLAUSE_SPLIT_FOR;
          break;
+       case OMP_CLAUSE_NOWAIT:
+         /* Nowait clause is allowed on target, for and sections, but
+            is not allowed on parallel for or parallel sections.  Therefore,
+            put it on target construct if present, because that can only
+            be combined with parallel for{, simd} and not with for{, simd},
+            otherwise to the worksharing construct.  */
+         if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP))
+             != 0)
+           s = C_OMP_CLAUSE_SPLIT_TARGET;
+         else
+           s = C_OMP_CLAUSE_SPLIT_FOR;
+         break;
        default:
          gcc_unreachable ();
        }
index f7d1a6d582ec12cbe9208d9b934e18acd0e1f364..d2a8947d1b39700801521792eb0d37b260659d77 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/71349
+       * c-parser.c (c_parser_omp_for): Don't disallow nowait clause
+       when combined with target construct.
+
 2016-05-26  Jakub Jelinek  <jakub@redhat.com>
 
        * c-parser.c (c_parser_omp_clause_schedule): Warn if
index fda2df8e44e3950286718209f158911014c151ca..bca8653f8d8500dc2564fdc94af5dc8f04b178aa 100644 (file)
@@ -15113,7 +15113,9 @@ c_parser_omp_for (location_t loc, c_parser *parser,
 
   strcat (p_name, " for");
   mask |= OMP_FOR_CLAUSE_MASK;
-  if (cclauses)
+  /* parallel for{, simd} disallows nowait clause, but for
+     target {teams distribute ,}parallel for{, simd} it should be accepted.  */
+  if (cclauses && (mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)) == 0)
     mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
   /* Composite distribute parallel for{, simd} disallows ordered clause.  */
   if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0)
index 84d7e0ac7ff23ffa456811a87740545e037f5491..1e4ca0c347180b5acd3a30fb58e6273fc0d29f41 100644 (file)
@@ -1,3 +1,11 @@
+2016-05-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/71349
+       * parser.c (cp_parser_omp_for): Don't disallow nowait clause
+       when combined with target construct.
+       (cp_parser_omp_parallel): Pass cclauses == NULL as last argument
+       to cp_parser_omp_all_clauses.
+
 2016-05-30  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/71238
index c6c2c0cf948478480314edcc14f193bb257e66aa..29a1b804e73d7c3a623b5db52f6912f06907badf 100644 (file)
@@ -33919,7 +33919,9 @@ cp_parser_omp_for (cp_parser *parser, cp_token *pragma_tok,
 
   strcat (p_name, " for");
   mask |= OMP_FOR_CLAUSE_MASK;
-  if (cclauses)
+  /* parallel for{, simd} disallows nowait clause, but for
+     target {teams distribute ,}parallel for{, simd} it should be accepted.  */
+  if (cclauses && (mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)) == 0)
     mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
   /* Composite distribute parallel for{, simd} disallows ordered clause.  */
   if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0)
@@ -34258,7 +34260,8 @@ cp_parser_omp_parallel (cp_parser *parser, cp_token *pragma_tok,
        }
     }
 
-  clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok);
+  clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
+                                      cclauses == NULL);
   if (cclauses)
     {
       cp_omp_split_clauses (loc, OMP_PARALLEL, mask, clauses, cclauses);
index 4859224ed56be65ef88571399c42d4cd693b67ba..d9ef789ba1f53dd3a00954ceca3fbbc9c5bbbf87 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/71349
+       * c-c++-common/gomp/clauses-1.c (bar): Add dd argument.  Add
+       nowait depend(inout: dd[0]) clauses where permitted.
+
 2016-05-30  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/71238
index 91aed3960f6c49826f055432c5ae0a9c131c0e4c..fe90c2428e0447d8bf482cefdd6def52fee197c8 100644 (file)
@@ -34,7 +34,7 @@ foo (int d, int m, int i1, int i2, int p, int *idp, int s,
 
 void
 bar (int d, int m, int i1, int i2, int p, int *idp, int s,
-     int nte, int tl, int nth, int g, int nta, int fi, int pp, int *q)
+     int nte, int tl, int nth, int g, int nta, int fi, int pp, int *q, int *dd)
 {
   #pragma omp for simd \
     private (p) firstprivate (f) lastprivate (l) linear (ll:1) reduction(+:r) schedule(static, 4) collapse(1) nowait \
@@ -63,29 +63,30 @@ bar (int d, int m, int i1, int i2, int p, int *idp, int s,
   }
   #pragma omp target parallel \
     device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
-    if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread)
+    if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \
+    nowait depend(inout: dd[0])
     ;
   #pragma omp target parallel for \
     device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
     if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \
-    lastprivate (l) linear (ll:1) ordered schedule(static, 4) collapse(1)
+    lastprivate (l) linear (ll:1) ordered schedule(static, 4) collapse(1) nowait depend(inout: dd[0])
   for (int i = 0; i < 64; i++)
     ll++;
   #pragma omp target parallel for simd \
     device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
     if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \
     lastprivate (l) linear (ll:1) schedule(static, 4) collapse(1) \
-    safelen(8) simdlen(4) aligned(q: 32)
+    safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0])
   for (int i = 0; i < 64; i++)
     ll++;
   #pragma omp target teams \
     device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
-    shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl)
+    shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) nowait depend(inout: dd[0])
     ;
   #pragma omp target teams distribute \
     device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
     shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
-    collapse(1) dist_schedule(static, 16)
+    collapse(1) dist_schedule(static, 16) nowait depend(inout: dd[0])
   for (int i = 0; i < 64; i++)
     ;
   #pragma omp target teams distribute parallel for \
@@ -93,7 +94,7 @@ bar (int d, int m, int i1, int i2, int p, int *idp, int s,
     shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
     collapse(1) dist_schedule(static, 16) \
     if (parallel: i2) num_threads (nth) proc_bind(spread) \
-    lastprivate (l) schedule(static, 4)
+    lastprivate (l) schedule(static, 4) nowait depend(inout: dd[0])
   for (int i = 0; i < 64; i++)
     ll++;
   #pragma omp target teams distribute parallel for simd \
@@ -102,19 +103,20 @@ bar (int d, int m, int i1, int i2, int p, int *idp, int s,
     collapse(1) dist_schedule(static, 16) \
     if (parallel: i2) num_threads (nth) proc_bind(spread) \
     lastprivate (l) schedule(static, 4) \
-    safelen(8) simdlen(4) aligned(q: 32)
+    safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0])
   for (int i = 0; i < 64; i++)
     ll++;
   #pragma omp target teams distribute simd \
     device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
     shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
     collapse(1) dist_schedule(static, 16) \
-    safelen(8) simdlen(4) aligned(q: 32)
+    safelen(8) simdlen(4) aligned(q: 32) nowait depend(inout: dd[0])
   for (int i = 0; i < 64; i++)
     ll++;
   #pragma omp target simd \
     device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
-    safelen(8) simdlen(4) lastprivate (l) linear(ll: 1) aligned(q: 32) reduction(+:r)
+    safelen(8) simdlen(4) lastprivate (l) linear(ll: 1) aligned(q: 32) reduction(+:r) \
+     nowait depend(inout: dd[0])
   for (int i = 0; i < 64; i++)
     ll++;
   #pragma omp taskloop simd \
@@ -128,7 +130,7 @@ bar (int d, int m, int i1, int i2, int p, int *idp, int s,
     safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) reduction(+:r)
   for (int i = 0; i < 64; i++)
     ll++;
-  #pragma omp target
+  #pragma omp target nowait depend(inout: dd[0])
   #pragma omp teams distribute \
     private(p) firstprivate (f) shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
     collapse(1) dist_schedule(static, 16)