[flang-commits] [flang] 471ca94 - [Flang][OpenMP]Make Do concurrent indices private (#93785)
via flang-commits
flang-commits at lists.llvm.org
Mon Jul 1 20:51:27 PDT 2024
Author: harishch4
Date: 2024-07-02T09:21:24+05:30
New Revision: 471ca9496f8a6c8253cc9db1a0aa72b6826d7f33
URL: https://github.com/llvm/llvm-project/commit/471ca9496f8a6c8253cc9db1a0aa72b6826d7f33
DIFF: https://github.com/llvm/llvm-project/commit/471ca9496f8a6c8253cc9db1a0aa72b6826d7f33.diff
LOG: [Flang][OpenMP]Make Do concurrent indices private (#93785)
Fixes: #85538
Added:
flang/test/Semantics/OpenMP/doconcurrent01.f90
Modified:
flang/lib/Semantics/resolve-directives.cpp
Removed:
################################################################################
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 0bf63a00bdf91..16658d50c151c 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -1708,26 +1708,46 @@ void OmpAttributeVisitor::ResolveSeqLoopIndexInParallelOrTaskConstruct(
// Use of DO CONCURRENT inside OpenMP construct is unspecified behavior
// till OpenMP-5.0 standard.
// In above both cases we skip the privatization of iteration variables.
+// [OpenMP 5.1] DO CONCURRENT indices are private
bool OmpAttributeVisitor::Pre(const parser::DoConstruct &x) {
- // TODO:[OpenMP 5.1] DO CONCURRENT indices are private
- if (x.IsDoNormal()) {
- if (!dirContext_.empty() && GetContext().withinConstruct) {
+ if (!dirContext_.empty() && GetContext().withinConstruct) {
+ llvm::SmallVector<const parser::Name *> ivs;
+ if (x.IsDoNormal()) {
const parser::Name *iv{GetLoopIndex(x)};
- if (iv && iv->symbol) {
- if (!iv->symbol->test(Symbol::Flag::OmpPreDetermined)) {
- ResolveSeqLoopIndexInParallelOrTaskConstruct(*iv);
- } else {
- // TODO: conflict checks with explicitly determined DSA
- }
- ordCollapseLevel--;
- if (ordCollapseLevel) {
- if (const auto *details{iv->symbol->detailsIf<HostAssocDetails>()}) {
- const Symbol *tpSymbol = &details->symbol();
- if (tpSymbol->test(Symbol::Flag::OmpThreadprivate)) {
- context_.Say(iv->source,
- "Loop iteration variable %s is not allowed in THREADPRIVATE."_err_en_US,
- iv->ToString());
- }
+ if (iv && iv->symbol)
+ ivs.push_back(iv);
+ } else if (x.IsDoConcurrent()) {
+ const Fortran::parser::LoopControl *loopControl = &*x.GetLoopControl();
+ const Fortran::parser::LoopControl::Concurrent &concurrent =
+ std::get<Fortran::parser::LoopControl::Concurrent>(loopControl->u);
+ const Fortran::parser::ConcurrentHeader &concurrentHeader =
+ std::get<Fortran::parser::ConcurrentHeader>(concurrent.t);
+ const std::list<Fortran::parser::ConcurrentControl> &controls =
+ std::get<std::list<Fortran::parser::ConcurrentControl>>(
+ concurrentHeader.t);
+ for (const auto &control : controls) {
+ const parser::Name *iv{&std::get<0>(control.t)};
+ if (iv && iv->symbol)
+ ivs.push_back(iv);
+ }
+ }
+ ordCollapseLevel--;
+ for (auto iv : ivs) {
+ if (!iv->symbol->test(Symbol::Flag::OmpPreDetermined)) {
+ ResolveSeqLoopIndexInParallelOrTaskConstruct(*iv);
+ } else {
+ // TODO: conflict checks with explicitly determined DSA
+ }
+ if (ordCollapseLevel) {
+ if (const auto *details{iv->symbol->detailsIf<HostAssocDetails>()}) {
+ const Symbol *tpSymbol = &details->symbol();
+ // TODO: DoConcurrent won't capture the following check because a new
+ // symbol is declared in ResolveIndexName(), which will not have the
+ // OmpThreadprivate flag.
+ if (tpSymbol->test(Symbol::Flag::OmpThreadprivate)) {
+ context_.Say(iv->source,
+ "Loop iteration variable %s is not allowed in THREADPRIVATE."_err_en_US,
+ iv->ToString());
}
}
}
diff --git a/flang/test/Semantics/OpenMP/doconcurrent01.f90 b/flang/test/Semantics/OpenMP/doconcurrent01.f90
new file mode 100644
index 0000000000000..7e3bdce871dd4
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/doconcurrent01.f90
@@ -0,0 +1,17 @@
+! RUN: %python %S/../test_symbols.py %s %flang_fc1 -fopenmp
+
+! OpenMP 5.1.1
+! DO Concurrent indices are private
+
+!DEF: /private_iv (Subroutine)Subprogram
+subroutine private_iv
+ !DEF: /private_iv/i ObjectEntity INTEGER(4)
+ integer i
+ !$omp parallel default(private)
+ !$omp single
+ !DEF: /private_iv/OtherConstruct1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4)
+ do concurrent(i=1:2)
+ end do
+ !$omp end single
+ !$omp end parallel
+end subroutine
More information about the flang-commits
mailing list