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 06e7400eda7dd07fd898b9c4a62a8c3c506df2bd..435ecf82f9706a007bc393ca90fafb13aecc952f 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 6430e61ea7a670d3b706a893e96937cc743772b8..e1560c1fe37297cf111627fbbdc81919a7e5dc91 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 874c158f75dd2cc3d5a23da1b49d7bfd87ac65d0..75ca70b4af2829d251f23ca2d94b4f3a71ccca5a 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