Skip to content

Commit ef2299d

Browse files
clementvalIanWood1
authored andcommitted
[flang][openacc] Make async clause behavior homogenous (llvm#136610)
The `async` clause was not handed in a similar way on `serial`, `parallel` and `kernels` directive. This patches updates the `ACC.td` file and the flang semantic to make it homogenous.
1 parent 844d82e commit ef2299d

File tree

5 files changed

+56
-26
lines changed

5 files changed

+56
-26
lines changed

flang/lib/Semantics/check-acc-structure.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,6 @@ void AccStructureChecker::Leave(const parser::OpenACCCacheConstruct &x) {
374374

375375
// Clause checkers
376376
CHECK_SIMPLE_CLAUSE(Auto, ACCC_auto)
377-
CHECK_SIMPLE_CLAUSE(Async, ACCC_async)
378377
CHECK_SIMPLE_CLAUSE(Attach, ACCC_attach)
379378
CHECK_SIMPLE_CLAUSE(Bind, ACCC_bind)
380379
CHECK_SIMPLE_CLAUSE(Capture, ACCC_capture)
@@ -444,6 +443,12 @@ void AccStructureChecker::CheckMultipleOccurrenceInDeclare(
444443
CheckMultipleOccurrenceInDeclare(objectList, clause);
445444
}
446445

446+
void AccStructureChecker::Enter(const parser::AccClause::Async &c) {
447+
llvm::acc::Clause crtClause = llvm::acc::Clause::ACCC_async;
448+
CheckAllowed(crtClause);
449+
CheckAllowedOncePerGroup(crtClause, llvm::acc::Clause::ACCC_device_type);
450+
}
451+
447452
void AccStructureChecker::Enter(const parser::AccClause::Create &c) {
448453
CheckAllowed(llvm::acc::Clause::ACCC_create);
449454
const auto &modifierClause{c.v};

flang/test/Semantics/OpenACC/acc-kernels.f90

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,17 @@ program openacc_kernels_validity
3737
!$acc kernels async(async1)
3838
!$acc end kernels
3939

40+
!ERROR: At most one ASYNC clause can appear on the KERNELS directive or in group separated by the DEVICE_TYPE clause
41+
!$acc kernels async(async1) async(2)
42+
!$acc end kernels
43+
44+
!$acc kernels async(async1) device_type(multicore) async(2) ! ok
45+
!$acc end kernels
46+
47+
!ERROR: At most one ASYNC clause can appear on the KERNELS directive or in group separated by the DEVICE_TYPE clause
48+
!$acc kernels async(async1) device_type(multicore) async(2) async(3)
49+
!$acc end kernels
50+
4051
!$acc kernels wait(wait1)
4152
!$acc end kernels
4253

flang/test/Semantics/OpenACC/acc-parallel.f90

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ program openacc_parallel_validity
3434
!$acc parallel async(1)
3535
!$acc end parallel
3636

37+
!ERROR: At most one ASYNC clause can appear on the PARALLEL directive or in group separated by the DEVICE_TYPE clause
38+
!$acc parallel async(1) async(2)
39+
!$acc end parallel
40+
41+
!$acc parallel async(1) device_type(nvidia) async(3)
42+
!$acc end parallel
43+
44+
!ERROR: At most one ASYNC clause can appear on the PARALLEL directive or in group separated by the DEVICE_TYPE clause
45+
!$acc parallel async(1) device_type(nvidia) async(2) async(3)
46+
!$acc end parallel
47+
3748
!$acc parallel async(async1)
3849
!$acc end parallel
3950

flang/test/Semantics/OpenACC/acc-serial.f90

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,17 @@ program openacc_serial_validity
5252
!$acc serial async(1)
5353
!$acc end serial
5454

55-
!ERROR: At most one ASYNC clause can appear on the SERIAL directive
55+
!ERROR: At most one ASYNC clause can appear on the SERIAL directive or in group separated by the DEVICE_TYPE clause
5656
!$acc serial async(1) async(2)
5757
!$acc end serial
5858

59+
!ERROR: At most one ASYNC clause can appear on the SERIAL directive or in group separated by the DEVICE_TYPE clause
60+
!$acc serial async(1) device_type(nvidia) async(2) async(4)
61+
!$acc end serial
62+
63+
!$acc serial async(1) device_type(nvidia) async(2)
64+
!$acc end serial
65+
5966
!$acc serial async(async1)
6067
!$acc end serial
6168

llvm/include/llvm/Frontend/OpenACC/ACC.td

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,8 @@ def ACC_Declare : Directive<"declare"> {
325325

326326
// 2.5.3
327327
def ACC_Kernels : Directive<"kernels"> {
328-
let allowedClauses = [VersionedClause<ACCC_Attach>,
328+
let allowedClauses = [VersionedClause<ACCC_Async>,
329+
VersionedClause<ACCC_Attach>,
329330
VersionedClause<ACCC_Copy>,
330331
VersionedClause<ACCC_Copyin>,
331332
VersionedClause<ACCC_Copyout>,
@@ -338,8 +339,7 @@ def ACC_Kernels : Directive<"kernels"> {
338339
VersionedClause<ACCC_DevicePtr>,
339340
VersionedClause<ACCC_VectorLength>,
340341
VersionedClause<ACCC_Wait>];
341-
let allowedOnceClauses = [VersionedClause<ACCC_Async>,
342-
VersionedClause<ACCC_Default>,
342+
let allowedOnceClauses = [VersionedClause<ACCC_Default>,
343343
VersionedClause<ACCC_If>,
344344
VersionedClause<ACCC_Self>];
345345
let association = AS_Block;
@@ -380,27 +380,23 @@ def ACC_Parallel : Directive<"parallel"> {
380380
def ACC_Serial : Directive<"serial"> {
381381
// Spec line 950-951: clause is as for the parallel construct except that the
382382
// num_gangs, num_workers, and vector_length clauses are not permitted.
383-
let allowedClauses = [
384-
VersionedClause<ACCC_Attach>,
385-
VersionedClause<ACCC_Copy>,
386-
VersionedClause<ACCC_Copyin>,
387-
VersionedClause<ACCC_Copyout>,
388-
VersionedClause<ACCC_Create>,
389-
VersionedClause<ACCC_DevicePtr>,
390-
VersionedClause<ACCC_DeviceType>,
391-
VersionedClause<ACCC_NoCreate>,
392-
VersionedClause<ACCC_Present>,
393-
VersionedClause<ACCC_Private>,
394-
VersionedClause<ACCC_FirstPrivate>,
395-
VersionedClause<ACCC_Reduction>,
396-
VersionedClause<ACCC_Wait>
397-
];
398-
let allowedOnceClauses = [
399-
VersionedClause<ACCC_Async>,
400-
VersionedClause<ACCC_Default>,
401-
VersionedClause<ACCC_If>,
402-
VersionedClause<ACCC_Self>
403-
];
383+
let allowedClauses = [VersionedClause<ACCC_Async>,
384+
VersionedClause<ACCC_Attach>,
385+
VersionedClause<ACCC_Copy>,
386+
VersionedClause<ACCC_Copyin>,
387+
VersionedClause<ACCC_Copyout>,
388+
VersionedClause<ACCC_Create>,
389+
VersionedClause<ACCC_DevicePtr>,
390+
VersionedClause<ACCC_DeviceType>,
391+
VersionedClause<ACCC_NoCreate>,
392+
VersionedClause<ACCC_Present>,
393+
VersionedClause<ACCC_Private>,
394+
VersionedClause<ACCC_FirstPrivate>,
395+
VersionedClause<ACCC_Reduction>,
396+
VersionedClause<ACCC_Wait>];
397+
let allowedOnceClauses = [VersionedClause<ACCC_Default>,
398+
VersionedClause<ACCC_If>,
399+
VersionedClause<ACCC_Self>];
404400
let association = AS_Block;
405401
let category = CA_Executable;
406402
}

0 commit comments

Comments
 (0)