Skip to content

Commit c366cbd

Browse files
authored
[flang][acc] Allow nested gang loops inside acc routines (#158693)
The following commit incorrectly prohibited nested gang loops inside acc routines. This PR limits the restriction to loops within kernels constructs only. 8470027
1 parent 45f1440 commit c366cbd

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed

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

Lines changed: 7 additions & 6 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,10 @@ 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()) {
297+
context_.Say(GetContext().clauseSource,
298+
"Nested GANG loops are not allowed in the region of a KERNELS construct"_err_en_US);
299+
} else {
297300
auto parentDim = getGangDimensionSize(parent);
298301
auto currentDim = getGangDimensionSize(GetContext());
299302
std::int64_t parentDimNum = 1, currentDimNum = 1;
@@ -317,8 +320,6 @@ void AccStructureChecker::CheckNotInSameOrSubLevelLoopConstruct() {
317320
parentDimStr);
318321
continue;
319322
}
320-
} else {
321-
invalid = true;
322323
}
323324
} else if (parentClause == llvm::acc::Clause::ACCC_worker &&
324325
(cl == llvm::acc::Clause::ACCC_gang ||

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: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,10 +340,10 @@ program openacc_loop_validity
340340

341341
!$acc kernels loop gang(dim:3)
342342
do i = 1, n
343-
!ERROR: GANG clause is not allowed in the region of a loop with the GANG clause
343+
!ERROR: Nested GANG loops are not allowed in the region of a KERNELS construct
344344
!$acc loop gang(dim:2)
345345
do j = 1, n
346-
!ERROR: GANG clause is not allowed in the region of a loop with the GANG clause
346+
!ERROR: Nested GANG loops are not allowed in the region of a KERNELS construct
347347
!$acc loop gang(dim:1) worker vector
348348
do k = 1, i
349349
end do
@@ -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)