Support multiple OpenACC wait clauses
authorThomas Schwinge <thomas@codesourcery.com>
Fri, 30 Nov 2018 20:39:08 +0000 (21:39 +0100)
committerThomas Schwinge <tschwinge@gcc.gnu.org>
Fri, 30 Nov 2018 20:39:08 +0000 (21:39 +0100)
Support for this is not explicitly called for in OpenACC 2.6, but given that
GCC internally decomposes "wait (1, 2)" into "wait (1) wait (2)" (similar for
other clauses, too), it's reasonable to also support that syntax in the front
ends -- which happens to already be the case for C, C++, and easy enough to do
for Fortran.

gcc/fortran/
* openmp.c (gfc_match_omp_clauses): Support multiple OpenACC wait
clauses.
gcc/testsuite/
* c-c++-common/goacc/asyncwait-5.c: New file.
* gfortran.dg/goacc/asyncwait-5.f: Likewise.

From-SVN: r266684

gcc/fortran/ChangeLog
gcc/fortran/openmp.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/goacc/asyncwait-5.c [new file with mode: 0644]
gcc/testsuite/gfortran.dg/goacc/asyncwait-5.f [new file with mode: 0644]

index 06e7400..435ecf8 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-30  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * openmp.c (gfc_match_omp_clauses): Support multiple OpenACC wait
+       clauses.
+
 2018-11-27  Martin Liska  <mliska@suse.cz>
 
        * decl.c (gfc_match_gcc_builtin): New function.
index 6430e61..e1560c1 100644 (file)
@@ -1876,7 +1876,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
          break;
        case 'w':
          if ((mask & OMP_CLAUSE_WAIT)
-             && !c->wait
              && gfc_match ("wait") == MATCH_YES)
            {
              c->wait = true;
index 874c158..75ca70b 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-30  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * c-c++-common/goacc/asyncwait-5.c: New file.
+       * gfortran.dg/goacc/asyncwait-5.f: Likewise.
+
 2018-11-30  Peter Bergner  <bergner@linux.ibm.com>
 
        PR target/87496
diff --git a/gcc/testsuite/c-c++-common/goacc/asyncwait-5.c b/gcc/testsuite/c-c++-common/goacc/asyncwait-5.c
new file mode 100644 (file)
index 0000000..fe6f8a0
--- /dev/null
@@ -0,0 +1,14 @@
+/* Multiple OpenACC wait clauses.  */
+
+/* { dg-additional-options "-fdump-tree-original" } */
+
+void f()
+{
+#pragma acc parallel async (1) wait (14)
+  ;
+  /* { dg-final { scan-tree-dump-times "(?n)#pragma acc parallel wait\\(14\\) async\\(1\\)$" 1 "original" } } */
+
+#pragma acc parallel async (2) wait (11, 12) wait (13)
+  ;
+  /* { dg-final { scan-tree-dump-times "(?n)#pragma acc parallel wait\\(13\\) wait\\(12\\) wait\\(11\\) async\\(2\\)\$" 1 "original" } } */
+}
diff --git a/gcc/testsuite/gfortran.dg/goacc/asyncwait-5.f b/gcc/testsuite/gfortran.dg/goacc/asyncwait-5.f
new file mode 100644 (file)
index 0000000..59b8863
--- /dev/null
@@ -0,0 +1,13 @@
+! Multiple OpenACC wait clauses.
+
+! { dg-additional-options "-fdump-tree-original" } 
+
+!$ACC PARALLEL ASYNC (1) WAIT (14)
+!$ACC END PARALLEL
+! { dg-final { scan-tree-dump-times "(?n)#pragma acc parallel async\\(1\\) wait\\(14\\)$" 1 "original" } }
+
+!$ACC PARALLEL ASYNC (2) WAIT (11, 12) WAIT(13)
+!$ACC END PARALLEL
+! { dg-final { scan-tree-dump-times "(?n)#pragma acc parallel async\\(2\\) wait\\(11\\) wait\\(12\\) wait\\(13\\)$" 1 "original" } }
+
+      END