[flang][openacc] Allow multiple wait clauses
authorValentin Clement <clementval@gmail.com>
Wed, 27 Jan 2021 18:18:27 +0000 (13:18 -0500)
committerclementval <clementval@gmail.com>
Wed, 27 Jan 2021 18:18:46 +0000 (13:18 -0500)
kernels loop and enter data had a too restrictive constraint for the wait clause.
The wait clause is allowed multiple times and not only once. This patch fix this problem.

Reviewed By: SouraVX

Differential Revision: https://reviews.llvm.org/D95469

flang/test/Semantics/OpenACC/acc-data.f90
flang/test/Semantics/OpenACC/acc-kernels-loop.f90
llvm/include/llvm/Frontend/OpenACC/ACC.td

index 316f087..e9953e6 100644 (file)
@@ -63,6 +63,8 @@ program openacc_data_validity
 
   !$acc enter data create(aa) wait(wait1, wait2)
 
+  !$acc enter data create(aa) wait(wait1) wait(wait2)
+
   !$acc enter data attach(bb)
 
   !ERROR: At least one of COPYOUT, DELETE, DETACH clause must appear on the EXIT DATA directive
index bc48022..4ce039b 100644 (file)
@@ -122,6 +122,11 @@ program openacc_kernels_loop_validity
     a(i) = 3.14
   end do
 
+  !$acc kernels loop wait(wait1) wait(wait2)
+  do i = 1, N
+    a(i) = 3.14
+  end do
+
   !$acc kernels loop wait(1, 2) async(3)
   do i = 1, N
     a(i) = 3.14
index 6762105..44de0d8 100644 (file)
@@ -477,10 +477,12 @@ def ACC_Wait : Directive<"wait"> {
 
 // 2.14.6
 def ACC_EnterData : Directive<"enter data"> {
+  let allowedClauses = [
+    VersionedClause<ACCC_Wait>
+  ];
   let allowedOnceClauses = [
     VersionedClause<ACCC_Async>,
-    VersionedClause<ACCC_If>,
-    VersionedClause<ACCC_Wait>
+    VersionedClause<ACCC_If>
   ];
   let requiredClauses = [
     VersionedClause<ACCC_Attach>,
@@ -529,7 +531,8 @@ def ACC_KernelsLoop : Directive<"kernels loop"> {
     VersionedClause<ACCC_Present>,
     VersionedClause<ACCC_Private>,
     VersionedClause<ACCC_DevicePtr>,
-    VersionedClause<ACCC_Attach>
+    VersionedClause<ACCC_Attach>,
+    VersionedClause<ACCC_Wait>
   ];
   let allowedOnceClauses = [
     VersionedClause<ACCC_Async>,
@@ -544,7 +547,6 @@ def ACC_KernelsLoop : Directive<"kernels loop"> {
     VersionedClause<ACCC_Tile>,
     VersionedClause<ACCC_Vector>,
     VersionedClause<ACCC_VectorLength>,
-    VersionedClause<ACCC_Wait>,
     VersionedClause<ACCC_Worker>
   ];
   let allowedExclusiveClauses = [