Skip to content

[flang][openacc] Align async check for combined construct #139744

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions flang/test/Lower/OpenACC/acc-kernels-loop.f90
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,12 @@ subroutine acc_kernels_loop
! CHECK: acc.terminator
! CHECK-NEXT: }{{$}}

!$acc kernels loop async(async) device_type(nvidia) async(1)
DO i = 1, n
a(i) = b(i)
END DO
! CHECK: acc.kernels combined(loop) async(%{{.*}} : i32, %c1{{.*}} : i32 [#acc.device_type<nvidia>])

!$acc kernels loop wait
DO i = 1, n
a(i) = b(i)
Expand Down
6 changes: 6 additions & 0 deletions flang/test/Lower/OpenACC/acc-parallel-loop.f90
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,12 @@ subroutine acc_parallel_loop
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}

!$acc parallel loop async(async) device_type(nvidia) async(1)
DO i = 1, n
a(i) = b(i)
END DO
! CHECK: acc.parallel combined(loop) async(%{{.*}} : i32, %c1{{.*}} : i32 [#acc.device_type<nvidia>])

!$acc parallel loop wait
DO i = 1, n
a(i) = b(i)
Expand Down
6 changes: 6 additions & 0 deletions flang/test/Lower/OpenACC/acc-serial-loop.f90
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,12 @@ subroutine acc_serial_loop
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}

!$acc serial loop async(async) device_type(nvidia) async(1)
DO i = 1, n
a(i) = b(i)
END DO
! CHECK: acc.serial combined(loop) async(%{{.*}} : i32, %c1{{.*}} : i32 [#acc.device_type<nvidia>])

!$acc serial loop wait
DO i = 1, n
a(i) = b(i)
Expand Down
9 changes: 9 additions & 0 deletions flang/test/Semantics/OpenACC/acc-kernels-loop.f90
Original file line number Diff line number Diff line change
Expand Up @@ -295,4 +295,13 @@ program openacc_kernels_loop_validity
if(i == 10) cycle
end do

!$acc kernels loop async(1) device_type(nvidia) async(3)
do i = 1, n
end do

!ERROR: At most one ASYNC clause can appear on the KERNELS LOOP directive or in group separated by the DEVICE_TYPE clause
!$acc kernels loop async(1) device_type(nvidia) async async
do i = 1, n
end do

end program openacc_kernels_loop_validity
9 changes: 9 additions & 0 deletions flang/test/Semantics/OpenACC/acc-parallel-loop-validity.f90
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,13 @@ program openacc_parallel_loop_validity
if(i == 10) cycle
end do

!$acc parallel loop async(1) device_type(nvidia) async(3)
do i = 1, n
end do

!ERROR: At most one ASYNC clause can appear on the PARALLEL LOOP directive or in group separated by the DEVICE_TYPE clause
!$acc parallel loop async(1) device_type(nvidia) async async
do i = 1, n
end do

end program openacc_parallel_loop_validity
9 changes: 9 additions & 0 deletions flang/test/Semantics/OpenACC/acc-serial-loop.f90
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,13 @@ program openacc_serial_loop_validity
if(i == 10) cycle
end do

!$acc serial loop async(1) device_type(nvidia) async(3)
do i = 1, n
end do

!ERROR: At most one ASYNC clause can appear on the SERIAL LOOP directive or in group separated by the DEVICE_TYPE clause
!$acc serial loop async(1) device_type(nvidia) async async
do i = 1, n
end do

end program openacc_serial_loop_validity
160 changes: 74 additions & 86 deletions llvm/include/llvm/Frontend/OpenACC/ACC.td
Original file line number Diff line number Diff line change
Expand Up @@ -556,35 +556,31 @@ def ACC_HostData : Directive<"host_data"> {

// 2.11
def ACC_KernelsLoop : Directive<"kernels loop"> {
let allowedClauses = [
VersionedClause<ACCC_Attach>,
VersionedClause<ACCC_Collapse>,
VersionedClause<ACCC_Copy>,
VersionedClause<ACCC_Copyin>,
VersionedClause<ACCC_Copyout>,
VersionedClause<ACCC_Create>,
VersionedClause<ACCC_DevicePtr>,
VersionedClause<ACCC_DeviceType>,
VersionedClause<ACCC_Gang>,
VersionedClause<ACCC_NoCreate>,
VersionedClause<ACCC_NumGangs>,
VersionedClause<ACCC_NumWorkers>,
VersionedClause<ACCC_Present>,
VersionedClause<ACCC_Private>,
VersionedClause<ACCC_Reduction>,
VersionedClause<ACCC_ShortLoop>,
VersionedClause<ACCC_Tile>,
VersionedClause<ACCC_Vector>,
VersionedClause<ACCC_VectorLength>,
VersionedClause<ACCC_Wait>,
VersionedClause<ACCC_Worker>
];
let allowedOnceClauses = [
VersionedClause<ACCC_Async>,
VersionedClause<ACCC_Default>,
VersionedClause<ACCC_If>,
VersionedClause<ACCC_Self>
];
let allowedClauses = [VersionedClause<ACCC_Async>,
VersionedClause<ACCC_Attach>,
VersionedClause<ACCC_Collapse>,
VersionedClause<ACCC_Copy>,
VersionedClause<ACCC_Copyin>,
VersionedClause<ACCC_Copyout>,
VersionedClause<ACCC_Create>,
VersionedClause<ACCC_DevicePtr>,
VersionedClause<ACCC_DeviceType>,
VersionedClause<ACCC_Gang>,
VersionedClause<ACCC_NoCreate>,
VersionedClause<ACCC_NumGangs>,
VersionedClause<ACCC_NumWorkers>,
VersionedClause<ACCC_Present>,
VersionedClause<ACCC_Private>,
VersionedClause<ACCC_Reduction>,
VersionedClause<ACCC_ShortLoop>,
VersionedClause<ACCC_Tile>,
VersionedClause<ACCC_Vector>,
VersionedClause<ACCC_VectorLength>,
VersionedClause<ACCC_Wait>,
VersionedClause<ACCC_Worker>];
let allowedOnceClauses = [VersionedClause<ACCC_Default>,
VersionedClause<ACCC_If>,
VersionedClause<ACCC_Self>];
let allowedExclusiveClauses = [
VersionedClause<ACCC_Auto>,
VersionedClause<ACCC_Independent>,
Expand All @@ -596,36 +592,32 @@ def ACC_KernelsLoop : Directive<"kernels loop"> {

// 2.11
def ACC_ParallelLoop : Directive<"parallel loop"> {
let allowedClauses = [
VersionedClause<ACCC_Attach>,
VersionedClause<ACCC_Collapse>,
VersionedClause<ACCC_Copy>,
VersionedClause<ACCC_Copyin>,
VersionedClause<ACCC_Copyout>,
VersionedClause<ACCC_Create>,
VersionedClause<ACCC_DevicePtr>,
VersionedClause<ACCC_DeviceType>,
VersionedClause<ACCC_FirstPrivate>,
VersionedClause<ACCC_Gang>,
VersionedClause<ACCC_NoCreate>,
VersionedClause<ACCC_NumGangs>,
VersionedClause<ACCC_NumWorkers>,
VersionedClause<ACCC_Present>,
VersionedClause<ACCC_Private>,
VersionedClause<ACCC_Reduction>,
VersionedClause<ACCC_ShortLoop>,
VersionedClause<ACCC_Tile>,
VersionedClause<ACCC_Vector>,
VersionedClause<ACCC_VectorLength>,
VersionedClause<ACCC_Wait>,
VersionedClause<ACCC_Worker>
];
let allowedOnceClauses = [
VersionedClause<ACCC_Async>,
VersionedClause<ACCC_Default>,
VersionedClause<ACCC_If>,
VersionedClause<ACCC_Self>
];
let allowedClauses = [VersionedClause<ACCC_Async>,
VersionedClause<ACCC_Attach>,
VersionedClause<ACCC_Collapse>,
VersionedClause<ACCC_Copy>,
VersionedClause<ACCC_Copyin>,
VersionedClause<ACCC_Copyout>,
VersionedClause<ACCC_Create>,
VersionedClause<ACCC_DevicePtr>,
VersionedClause<ACCC_DeviceType>,
VersionedClause<ACCC_FirstPrivate>,
VersionedClause<ACCC_Gang>,
VersionedClause<ACCC_NoCreate>,
VersionedClause<ACCC_NumGangs>,
VersionedClause<ACCC_NumWorkers>,
VersionedClause<ACCC_Present>,
VersionedClause<ACCC_Private>,
VersionedClause<ACCC_Reduction>,
VersionedClause<ACCC_ShortLoop>,
VersionedClause<ACCC_Tile>,
VersionedClause<ACCC_Vector>,
VersionedClause<ACCC_VectorLength>,
VersionedClause<ACCC_Wait>,
VersionedClause<ACCC_Worker>];
let allowedOnceClauses = [VersionedClause<ACCC_Default>,
VersionedClause<ACCC_If>,
VersionedClause<ACCC_Self>];
let allowedExclusiveClauses = [
VersionedClause<ACCC_Auto>,
VersionedClause<ACCC_Independent>,
Expand All @@ -637,33 +629,29 @@ def ACC_ParallelLoop : Directive<"parallel loop"> {

// 2.11
def ACC_SerialLoop : Directive<"serial loop"> {
let allowedClauses = [
VersionedClause<ACCC_Attach>,
VersionedClause<ACCC_Collapse>,
VersionedClause<ACCC_Copy>,
VersionedClause<ACCC_Copyin>,
VersionedClause<ACCC_Copyout>,
VersionedClause<ACCC_Create>,
VersionedClause<ACCC_DevicePtr>,
VersionedClause<ACCC_DeviceType>,
VersionedClause<ACCC_FirstPrivate>,
VersionedClause<ACCC_Gang>,
VersionedClause<ACCC_NoCreate>,
VersionedClause<ACCC_Present>,
VersionedClause<ACCC_Private>,
VersionedClause<ACCC_Reduction>,
VersionedClause<ACCC_ShortLoop>,
VersionedClause<ACCC_Tile>,
VersionedClause<ACCC_Vector>,
VersionedClause<ACCC_Wait>,
VersionedClause<ACCC_Worker>
];
let allowedOnceClauses = [
VersionedClause<ACCC_Async>,
VersionedClause<ACCC_Default>,
VersionedClause<ACCC_If>,
VersionedClause<ACCC_Self>
];
let allowedClauses = [VersionedClause<ACCC_Async>,
VersionedClause<ACCC_Attach>,
VersionedClause<ACCC_Collapse>,
VersionedClause<ACCC_Copy>,
VersionedClause<ACCC_Copyin>,
VersionedClause<ACCC_Copyout>,
VersionedClause<ACCC_Create>,
VersionedClause<ACCC_DevicePtr>,
VersionedClause<ACCC_DeviceType>,
VersionedClause<ACCC_FirstPrivate>,
VersionedClause<ACCC_Gang>,
VersionedClause<ACCC_NoCreate>,
VersionedClause<ACCC_Present>,
VersionedClause<ACCC_Private>,
VersionedClause<ACCC_Reduction>,
VersionedClause<ACCC_ShortLoop>,
VersionedClause<ACCC_Tile>,
VersionedClause<ACCC_Vector>,
VersionedClause<ACCC_Wait>,
VersionedClause<ACCC_Worker>];
let allowedOnceClauses = [VersionedClause<ACCC_Default>,
VersionedClause<ACCC_If>,
VersionedClause<ACCC_Self>];
let allowedExclusiveClauses = [
VersionedClause<ACCC_Auto>,
VersionedClause<ACCC_Independent>,
Expand Down