Skip to content

Commit cc9f674

Browse files
authored
[flang][OpenMP] Consider previous DSA for static duration variables (llvm#143601)
Symbols that have a pre-existing DSA set in the enclosing context should not be made shared based on them being static duration variables. Suggested-by: Leandro Lupori <[email protected]> --------- Signed-off-by: Kajetan Puchalski <[email protected]>
1 parent e15d50d commit cc9f674

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

flang/lib/Semantics/resolve-directives.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2382,7 +2382,9 @@ void OmpAttributeVisitor::CreateImplicitSymbols(const Symbol *symbol) {
23822382
dsa = prevDSA;
23832383
} else if (taskGenDir) {
23842384
// TODO 5) dummy arg in orphaned taskgen construct -> firstprivate
2385-
if (prevDSA.test(Symbol::Flag::OmpShared) || isStaticStorageDuration) {
2385+
if (prevDSA.test(Symbol::Flag::OmpShared) ||
2386+
(isStaticStorageDuration &&
2387+
(prevDSA & dataSharingAttributeFlags).none())) {
23862388
// 6) shared in enclosing context -> shared
23872389
dsa = {Symbol::Flag::OmpShared};
23882390
makeSymbol(dsa);

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,3 +244,25 @@ subroutine implicit_dsa_test_12
244244
!REF: /implicit_dsa_test_12/tm3a
245245
print *,tm3a
246246
end subroutine
247+
248+
! Test static duration variables with DSA set in the enclosing scope do not default to shared DSA
249+
!DEF: /implicit_dsa_test_13_mod Module
250+
module implicit_dsa_test_13_mod
251+
!DEF: /implicit_dsa_test_13_mod/a PUBLIC ObjectEntity INTEGER(4)
252+
integer::a=5
253+
contains
254+
!DEF: /implicit_dsa_test_13_mod/implicit_dsa_test_13 PUBLIC (Subroutine) Subprogram
255+
subroutine implicit_dsa_test_13
256+
!DEF: /implicit_dsa_test_13_mod/implicit_dsa_test_13/i ObjectEntity INTEGER(4)
257+
integer i
258+
!$omp do private(a)
259+
!DEF: /implicit_dsa_test_13_mod/implicit_dsa_test_13/OtherConstruct1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4)
260+
do i=0,10
261+
!$omp task
262+
!DEF: /implicit_dsa_test_13_mod/implicit_dsa_test_13/OtherConstruct1/OtherConstruct1/a (OmpFirstPrivate, OmpImplicit) HostAssoc INTEGER(4)
263+
!DEF: /implicit_dsa_test_13_mod/implicit_dsa_test_13/OtherConstruct1/OtherConstruct1/i (OmpFirstPrivate, OmpImplicit) HostAssoc INTEGER(4)
264+
a=a+i
265+
!$omp end task
266+
end do
267+
end subroutine implicit_dsa_test_13
268+
end module implicit_dsa_test_13_mod

0 commit comments

Comments
 (0)