Skip to content

Commit ce6bcb7

Browse files
committed
Allow nested gang clauses in acc routines
1 parent f5d3cf4 commit ce6bcb7

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,10 @@ void AccStructureChecker::CheckNotInComputeConstruct() {
136136
}
137137
}
138138

139-
bool AccStructureChecker::IsInsideParallelConstruct() const {
139+
bool AccStructureChecker::IsInsideKernelsConstruct() const {
140140
if (auto directive = getParentComputeConstruct())
141-
if (*directive == llvm::acc::ACCD_parallel ||
142-
*directive == llvm::acc::ACCD_parallel_loop)
141+
if (*directive == llvm::acc::ACCD_kernels ||
142+
*directive == llvm::acc::ACCD_kernels_loop)
143143
return true;
144144
return false;
145145
}
@@ -293,7 +293,7 @@ void AccStructureChecker::CheckNotInSameOrSubLevelLoopConstruct() {
293293
bool invalid{false};
294294
if (parentClause == llvm::acc::Clause::ACCC_gang &&
295295
cl == llvm::acc::Clause::ACCC_gang) {
296-
if (IsInsideParallelConstruct()) {
296+
if (!IsInsideKernelsConstruct()) {
297297
auto parentDim = getGangDimensionSize(parent);
298298
auto currentDim = getGangDimensionSize(GetContext());
299299
std::int64_t parentDimNum = 1, currentDimNum = 1;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class AccStructureChecker
101101
bool IsLoopConstruct(llvm::acc::Directive directive) const;
102102
std::optional<llvm::acc::Directive> getParentComputeConstruct() const;
103103
bool IsInsideComputeConstruct() const;
104-
bool IsInsideParallelConstruct() const;
104+
bool IsInsideKernelsConstruct() const;
105105
void CheckNotInComputeConstruct();
106106
std::optional<std::int64_t> getGangDimensionSize(
107107
DirectiveContext &dirContext);

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,4 +447,35 @@ program openacc_loop_validity
447447
END DO
448448
END DO
449449

450+
contains
451+
452+
subroutine sub1()
453+
!$acc routine gang(dim:2)
454+
implicit none
455+
integer, parameter :: N = 256
456+
integer :: i, j
457+
458+
!$acc loop gang(dim:2)
459+
DO j = 1, N
460+
!$acc loop gang(dim:1) vector
461+
DO i = 1, N
462+
END DO
463+
END DO
464+
end subroutine sub1
465+
466+
subroutine sub2()
467+
!$acc routine gang(dim:2)
468+
implicit none
469+
integer, parameter :: N = 256
470+
integer :: i, j
471+
472+
!$acc loop gang(dim:2)
473+
DO j = 1, N
474+
!ERROR: GANG(dim:2) clause is not allowed in the region of a loop with the GANG(dim:2) clause
475+
!$acc loop gang(dim:2) vector
476+
DO i = 1, N
477+
END DO
478+
END DO
479+
end subroutine sub2
480+
450481
end program openacc_loop_validity

0 commit comments

Comments
 (0)