[flang-commits] [flang] [flang][OpenMP] Make static duration variables default to shared DSA (PR #142783)
Kajetan Puchalski via flang-commits
flang-commits at lists.llvm.org
Wed Jun 4 08:07:21 PDT 2025
https://github.com/mrkajetanp created https://github.com/llvm/llvm-project/pull/142783
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 llvm#140732.
>From 84f9a709a70e0bcc99380091ed5956f82145d43c Mon Sep 17 00:00:00 2001
From: Kajetan Puchalski <kajetan.puchalski at arm.com>
Date: Wed, 4 Jun 2025 11:36:02 +0000
Subject: [PATCH] [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 llvm#140732.
Signed-off-by: Kajetan Puchalski <kajetan.puchalski at arm.com>
---
flang/lib/Semantics/resolve-directives.cpp | 5 ++++-
flang/test/Semantics/OpenMP/implicit-dsa.f90 | 20 ++++++++++++++++++++
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index ec385b7baf8bd..d1495e7b3b7f2 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -2310,6 +2310,8 @@ void OmpAttributeVisitor::CreateImplicitSymbols(const Symbol *symbol) {
bool targetDir = llvm::omp::allTargetSet.test(dirContext.directive);
bool parallelDir = llvm::omp::allParallelSet.test(dirContext.directive);
bool teamsDir = llvm::omp::allTeamsSet.test(dirContext.directive);
+ bool isStaticStorageDuration =
+ symbol->flags().test(Symbol::Flag::InDataStmt);
if (dsa.any()) {
if (parallelDir || taskGenDir || teamsDir) {
@@ -2367,7 +2369,8 @@ void OmpAttributeVisitor::CreateImplicitSymbols(const Symbol *symbol) {
dsa = prevDSA;
} else if (taskGenDir) {
// TODO 5) dummy arg in orphaned taskgen construct -> firstprivate
- if (prevDSA.test(Symbol::Flag::OmpShared)) {
+ // variables with static storage duration are predetermined as shared
+ if (prevDSA.test(Symbol::Flag::OmpShared) || isStaticStorageDuration) {
// 6) shared in enclosing context -> shared
dsa = {Symbol::Flag::OmpShared};
makeSymbol(dsa);
diff --git a/flang/test/Semantics/OpenMP/implicit-dsa.f90 b/flang/test/Semantics/OpenMP/implicit-dsa.f90
index 7e38435274b7b..9e48dd2a83257 100644
--- a/flang/test/Semantics/OpenMP/implicit-dsa.f90
+++ b/flang/test/Semantics/OpenMP/implicit-dsa.f90
@@ -169,3 +169,23 @@ subroutine implicit_dsa_test8
end do
!$omp end task
end subroutine
+
+! Test static storage duration variables default to shared DSA
+!DEF: /implicit_dsa_test9_mod Module
+module implicit_dsa_test9_mod
+ !DEF: /implicit_dsa_test9_mod/tm3a PUBLIC (InDataStmt) ObjectEntity COMPLEX(4)
+ complex tm3a/(0,0)/
+contains
+ !DEF: /implicit_dsa_test9_mod/implict_dsa_test9 PUBLIC (Subroutine) Subprogram
+ subroutine implict_dsa_test9
+ !$omp task
+ !$omp task
+ !DEF: /implicit_dsa_test9_mod/implict_dsa_test9/OtherConstruct1/OtherConstruct1/tm3a (OmpShared) HostAssoc COMPLEX(4)
+ tm3a = (1, 2)
+ !$omp end task
+ !$omp end task
+ !$omp taskwait
+ !REF: /implicit_dsa_test9_mod/tm3a
+ print *,tm3a
+ end subroutine
+end module
More information about the flang-commits
mailing list