File tree Expand file tree Collapse file tree 3 files changed +36
-5
lines changed
Expand file tree Collapse file tree 3 files changed +36
-5
lines changed Original file line number Diff line number Diff 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 ;
Original file line number Diff line number Diff 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);
Original file line number Diff line number Diff 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+
450481end program openacc_loop_validity
You can’t perform that action at this time.
0 commit comments