Skip to content

Commit b3ed09d

Browse files
committed
[flang][OpenMP] Make static duration variables default to shared DSA
According to the OpenMP standard, variables with static storage duration are predetermined as shared. Add a check when creating implicit symbols for OpenMP to fix them erroneously getting set to firstprivate. Fixes #140732. Signed-off-by: Kajetan Puchalski <[email protected]>
1 parent 6b25f44 commit b3ed09d

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

flang/lib/Semantics/resolve-directives.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2310,6 +2310,8 @@ void OmpAttributeVisitor::CreateImplicitSymbols(const Symbol *symbol) {
23102310
bool targetDir = llvm::omp::allTargetSet.test(dirContext.directive);
23112311
bool parallelDir = llvm::omp::allParallelSet.test(dirContext.directive);
23122312
bool teamsDir = llvm::omp::allTeamsSet.test(dirContext.directive);
2313+
bool isStaticStorageDuration =
2314+
symbol->flags().test(Symbol::Flag::InDataStmt);
23132315

23142316
if (dsa.any()) {
23152317
if (parallelDir || taskGenDir || teamsDir) {
@@ -2367,7 +2369,8 @@ void OmpAttributeVisitor::CreateImplicitSymbols(const Symbol *symbol) {
23672369
dsa = prevDSA;
23682370
} else if (taskGenDir) {
23692371
// TODO 5) dummy arg in orphaned taskgen construct -> firstprivate
2370-
if (prevDSA.test(Symbol::Flag::OmpShared)) {
2372+
// variables with static storage duration are predetermined as shared
2373+
if (prevDSA.test(Symbol::Flag::OmpShared) || isStaticStorageDuration) {
23712374
// 6) shared in enclosing context -> shared
23722375
dsa = {Symbol::Flag::OmpShared};
23732376
makeSymbol(dsa);

flang/test/Semantics/OpenMP/implicit-dsa.f90

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,23 @@ subroutine implicit_dsa_test8
169169
end do
170170
!$omp end task
171171
end subroutine
172+
173+
! Test static storage duration variables default to shared DSA
174+
!DEF: /implicit_dsa_test9_mod Module
175+
module implicit_dsa_test9_mod
176+
!DEF: /implicit_dsa_test9_mod/tm3a PUBLIC (InDataStmt) ObjectEntity COMPLEX(4)
177+
complex tm3a/(0,0)/
178+
contains
179+
!DEF: /implicit_dsa_test9_mod/implict_dsa_test9 PUBLIC (Subroutine) Subprogram
180+
subroutine implict_dsa_test9
181+
!$omp task
182+
!$omp task
183+
!DEF: /implicit_dsa_test9_mod/implict_dsa_test9/OtherConstruct1/OtherConstruct1/tm3a (OmpShared) HostAssoc COMPLEX(4)
184+
tm3a = (1, 2)
185+
!$omp end task
186+
!$omp end task
187+
!$omp taskwait
188+
!REF: /implicit_dsa_test9_mod/tm3a
189+
print *,tm3a
190+
end subroutine
191+
end module

0 commit comments

Comments
 (0)