-
Notifications
You must be signed in to change notification settings - Fork 14.9k
[flang][acc] Allow nested gang loops inside acc routines #158693
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
Conversation
@llvm/pr-subscribers-flang-semantics @llvm/pr-subscribers-openacc Author: None (khaki3) ChangesThe following commit incorrectly prohibited nested gang loops inside acc routines. This PR limits the restriction to loops within kernels constructs only. 8470027 Full diff: https://github.com/llvm/llvm-project/pull/158693.diff 3 Files Affected:
diff --git a/flang/lib/Semantics/check-acc-structure.cpp b/flang/lib/Semantics/check-acc-structure.cpp
index 6cb7e5e9e6e25..bcb485d4e0f47 100644
--- a/flang/lib/Semantics/check-acc-structure.cpp
+++ b/flang/lib/Semantics/check-acc-structure.cpp
@@ -136,10 +136,10 @@ void AccStructureChecker::CheckNotInComputeConstruct() {
}
}
-bool AccStructureChecker::IsInsideParallelConstruct() const {
+bool AccStructureChecker::IsInsideKernelsConstruct() const {
if (auto directive = getParentComputeConstruct())
- if (*directive == llvm::acc::ACCD_parallel ||
- *directive == llvm::acc::ACCD_parallel_loop)
+ if (*directive == llvm::acc::ACCD_kernels ||
+ *directive == llvm::acc::ACCD_kernels_loop)
return true;
return false;
}
@@ -293,7 +293,7 @@ void AccStructureChecker::CheckNotInSameOrSubLevelLoopConstruct() {
bool invalid{false};
if (parentClause == llvm::acc::Clause::ACCC_gang &&
cl == llvm::acc::Clause::ACCC_gang) {
- if (IsInsideParallelConstruct()) {
+ if (!IsInsideKernelsConstruct()) {
auto parentDim = getGangDimensionSize(parent);
auto currentDim = getGangDimensionSize(GetContext());
std::int64_t parentDimNum = 1, currentDimNum = 1;
diff --git a/flang/lib/Semantics/check-acc-structure.h b/flang/lib/Semantics/check-acc-structure.h
index 711d0326349a4..09399297ca4be 100644
--- a/flang/lib/Semantics/check-acc-structure.h
+++ b/flang/lib/Semantics/check-acc-structure.h
@@ -101,7 +101,7 @@ class AccStructureChecker
bool IsLoopConstruct(llvm::acc::Directive directive) const;
std::optional<llvm::acc::Directive> getParentComputeConstruct() const;
bool IsInsideComputeConstruct() const;
- bool IsInsideParallelConstruct() const;
+ bool IsInsideKernelsConstruct() const;
void CheckNotInComputeConstruct();
std::optional<std::int64_t> getGangDimensionSize(
DirectiveContext &dirContext);
diff --git a/flang/test/Semantics/OpenACC/acc-loop.f90 b/flang/test/Semantics/OpenACC/acc-loop.f90
index 77c427e0a85ae..d3777f48430e5 100644
--- a/flang/test/Semantics/OpenACC/acc-loop.f90
+++ b/flang/test/Semantics/OpenACC/acc-loop.f90
@@ -447,4 +447,35 @@ program openacc_loop_validity
END DO
END DO
+contains
+
+ subroutine sub1()
+ !$acc routine gang(dim:2)
+ implicit none
+ integer, parameter :: N = 256
+ integer :: i, j
+
+ !$acc loop gang(dim:2)
+ DO j = 1, N
+ !$acc loop gang(dim:1) vector
+ DO i = 1, N
+ END DO
+ END DO
+ end subroutine sub1
+
+ subroutine sub2()
+ !$acc routine gang(dim:2)
+ implicit none
+ integer, parameter :: N = 256
+ integer :: i, j
+
+ !$acc loop gang(dim:2)
+ DO j = 1, N
+ !ERROR: GANG(dim:2) clause is not allowed in the region of a loop with the GANG(dim:2) clause
+ !$acc loop gang(dim:2) vector
+ DO i = 1, N
+ END DO
+ END DO
+ end subroutine sub2
+
end program openacc_loop_validity
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM , nit/suggestion inline.
The following commit incorrectly prohibited nested gang loops inside acc routines. This PR limits the restriction to loops within kernels constructs only. 8470027