[flang-commits] [flang] [flang][OpenMP] don't privatise loop index marked shared (PR #108176)
Mats Petersson via flang-commits
flang-commits at lists.llvm.org
Wed Sep 11 02:44:01 PDT 2024
https://github.com/Leporacanthicus created https://github.com/llvm/llvm-project/pull/108176
Mark the symbol with OmpShared, and then check that later in lowering to avoid making a local loop index.
Tests updated to match the extra OmpShared attribute.
Add regression test for lowering to hlfir.
Closes #102961
>From 688bef8d46c2a28a12edb8164de0849bd9bfa767 Mon Sep 17 00:00:00 2001
From: Tom Eccles <tom.eccles at arm.com>
Date: Tue, 10 Sep 2024 15:50:49 +0000
Subject: [PATCH] [flang][OpenMP] don't privatise loop index marked shared
Mark the symbol with OmpShared, and then check that later in
lowering to avoid making a local loop index.
Tests updated to match the extra OmpShared attribute.
Add regression test for lowering to hlfir.
Closes #102961
---
flang/lib/Lower/Bridge.cpp | 3 +-
flang/lib/Semantics/resolve-directives.cpp | 29 +++++++++-------
flang/test/Lower/OpenMP/shared-loop.f90 | 33 +++++++++++++++++++
.../Semantics/OpenMP/do05-positivecase.f90 | 2 +-
flang/test/Semantics/OpenMP/do20.f90 | 2 +-
flang/test/Semantics/OpenMP/implicit-dsa.f90 | 10 +++---
flang/test/Semantics/OpenMP/symbol01.f90 | 2 +-
flang/test/Semantics/OpenMP/symbol02.f90 | 4 +--
flang/test/Semantics/OpenMP/symbol03.f90 | 4 +--
flang/test/Semantics/OpenMP/symbol07.f90 | 2 +-
flang/test/Semantics/OpenMP/symbol09.f90 | 2 +-
11 files changed, 66 insertions(+), 27 deletions(-)
create mode 100644 flang/test/Lower/OpenMP/shared-loop.f90
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 1f2724290b8852..4c3ce79b52048b 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -1326,7 +1326,8 @@ class FirConverter : public Fortran::lower::AbstractConverter {
bool isUnordered) {
if (isUnordered || sym.has<Fortran::semantics::HostAssocDetails>() ||
sym.has<Fortran::semantics::UseDetails>()) {
- if (!shallowLookupSymbol(sym)) {
+ if (!shallowLookupSymbol(sym) &&
+ !sym.test(Fortran::semantics::Symbol::Flag::OmpShared)) {
// Do concurrent loop variables are not mapped yet since they are local
// to the Do concurrent scope (same for OpenMP loops).
mlir::OpBuilder::InsertPoint insPt = builder->saveInsertionPoint();
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 17567a555db326..f6fef0f963c699 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -2121,15 +2121,18 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
}
return lastDeclSymbol;
};
- auto makeSharedSymbol = [&]() {
+ auto makeSharedSymbol = [&](bool setFlag) {
const Symbol *hostSymbol =
lastDeclSymbol ? lastDeclSymbol : &symbol->GetUltimate();
- MakeAssocSymbol(symbol->name(), *hostSymbol,
+ Symbol &assocSymbol = MakeAssocSymbol(symbol->name(), *hostSymbol,
context_.FindScope(dirContext.directiveSource));
+ if (setFlag) {
+ assocSymbol.set(Symbol::Flag::OmpShared);
+ }
};
- auto useLastDeclSymbol = [&]() {
+ auto useLastDeclSymbol = [&](bool setFlag) {
if (lastDeclSymbol) {
- makeSharedSymbol();
+ makeSharedSymbol(setFlag);
}
};
@@ -2140,8 +2143,9 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
if (dsa.has_value()) {
if (dsa.value() == Symbol::Flag::OmpShared &&
- (parallelDir || taskGenDir || teamsDir))
- makeSharedSymbol();
+ (parallelDir || taskGenDir || teamsDir)) {
+ makeSharedSymbol(/*setFlag=*/true);
+ }
// Private symbols will have been declared already.
prevDSA = dsa;
continue;
@@ -2153,18 +2157,19 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
// 1) default
// Allowed only with parallel, teams and task generating constructs.
assert(parallelDir || taskGenDir || teamsDir);
- if (dirContext.defaultDSA != Symbol::Flag::OmpShared)
+ if (dirContext.defaultDSA != Symbol::Flag::OmpShared) {
makePrivateSymbol(dirContext.defaultDSA);
- else
- makeSharedSymbol();
+ } else {
+ makeSharedSymbol(/*setFlag=*/true);
+ }
dsa = dirContext.defaultDSA;
} else if (parallelDir) {
// 2) parallel -> shared
- makeSharedSymbol();
+ makeSharedSymbol(/*setFlag=*/false);
dsa = Symbol::Flag::OmpShared;
} else if (!taskGenDir && !targetDir) {
// 3) enclosing context
- useLastDeclSymbol();
+ useLastDeclSymbol(/*setFlag=*/false);
dsa = prevDSA;
} else if (targetDir) {
// TODO 4) not mapped target variable -> firstprivate
@@ -2173,7 +2178,7 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
// TODO 5) dummy arg in orphaned taskgen construct -> firstprivate
if (prevDSA == Symbol::Flag::OmpShared) {
// 6) shared in enclosing context -> shared
- makeSharedSymbol();
+ makeSharedSymbol(/*setFlag=*/false);
dsa = Symbol::Flag::OmpShared;
} else {
// 7) firstprivate
diff --git a/flang/test/Lower/OpenMP/shared-loop.f90 b/flang/test/Lower/OpenMP/shared-loop.f90
new file mode 100644
index 00000000000000..6ae37a896a3371
--- /dev/null
+++ b/flang/test/Lower/OpenMP/shared-loop.f90
@@ -0,0 +1,33 @@
+! RUN: bbc -emit-hlfir -fopenmp %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
+
+! CHECK: func.func @_QQmain() attributes
+! CHECK: %[[ALLOC_I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFEi"}
+! CHECK: %[[DECL_I:.*]]:2 = hlfir.declare %[[ALLOC_I]] {uniq_name = "_QFEi"} :
+! CHECK: omp.parallel {
+! CHECK: omp.sections {
+! CHECK: omp.section {
+! CHECK: %[[RES:.*]]:2 = fir.do_loop {{.*}} iter_args(%[[ARG:.*]] =
+! CHECK: fir.store %[[ARG]] to %[[DECL_I]]#1
+! CHECK: fir.result
+! CHECK: }
+! CHECK: fir.store %[[RES]]#1 to %[[DECL_I]]#1
+! CHECK: omp.terminator
+! CHECK: }
+! CHECK: omp.terminator
+! CHECK: }
+! CHECK: return
+! CHECK: }
+program omploop
+ implicit none
+ integer :: i, j
+ i = 1
+ j = 0
+ !$omp parallel shared(i)
+ !$omp sections
+ do i=1,10
+ j = j + i
+ end do
+ !$omp end sections
+ !$omp end parallel
+end program
diff --git a/flang/test/Semantics/OpenMP/do05-positivecase.f90 b/flang/test/Semantics/OpenMP/do05-positivecase.f90
index 3b512a5b4f25eb..f81140ddaf9fd9 100644
--- a/flang/test/Semantics/OpenMP/do05-positivecase.f90
+++ b/flang/test/Semantics/OpenMP/do05-positivecase.f90
@@ -20,7 +20,7 @@ program omp_do
!$omp parallel default(shared)
!$omp do
!DEF: /omp_do/OtherConstruct2/OtherConstruct1/i (OmpPrivate, OmpPreDetermined) HostAssoc INTEGER(4)
- !DEF: /omp_do/OtherConstruct2/n HostAssoc INTEGER(4)
+ !DEF: /omp_do/OtherConstruct2/n (OmpShared) HostAssoc INTEGER(4)
do i=1,n
!$omp parallel
!$omp single
diff --git a/flang/test/Semantics/OpenMP/do20.f90 b/flang/test/Semantics/OpenMP/do20.f90
index 0cafae76b86b00..040a82079590f0 100644
--- a/flang/test/Semantics/OpenMP/do20.f90
+++ b/flang/test/Semantics/OpenMP/do20.f90
@@ -10,7 +10,7 @@ subroutine shared_iv
!$omp parallel shared(i)
!$omp single
- !DEF: /shared_iv/OtherConstruct1/i HostAssoc INTEGER(4)
+ !DEF: /shared_iv/OtherConstruct1/i (OmpShared) HostAssoc INTEGER(4)
do i = 0, 1
end do
!$omp end single
diff --git a/flang/test/Semantics/OpenMP/implicit-dsa.f90 b/flang/test/Semantics/OpenMP/implicit-dsa.f90
index 2abe3a0e16d624..f73c19dbc61955 100644
--- a/flang/test/Semantics/OpenMP/implicit-dsa.f90
+++ b/flang/test/Semantics/OpenMP/implicit-dsa.f90
@@ -15,14 +15,14 @@ subroutine implicit_dsa_test1
!$omp task private(y) shared(z)
!DEF: /implicit_dsa_test1/OtherConstruct1/x (OmpFirstPrivate, OmpImplicit) HostAssoc INTEGER(4)
!DEF: /implicit_dsa_test1/OtherConstruct1/y (OmpPrivate) HostAssoc INTEGER(4)
- !DEF: /implicit_dsa_test1/OtherConstruct1/z HostAssoc INTEGER(4)
+ !DEF: /implicit_dsa_test1/OtherConstruct1/z (OmpShared) HostAssoc INTEGER(4)
x = y + z
!$omp end task
!$omp task default(shared)
- !DEF: /implicit_dsa_test1/OtherConstruct2/x HostAssoc INTEGER(4)
- !DEF: /implicit_dsa_test1/OtherConstruct2/y HostAssoc INTEGER(4)
- !DEF: /implicit_dsa_test1/OtherConstruct2/z HostAssoc INTEGER(4)
+ !DEF: /implicit_dsa_test1/OtherConstruct2/x (OmpShared) HostAssoc INTEGER(4)
+ !DEF: /implicit_dsa_test1/OtherConstruct2/y (OmpShared) HostAssoc INTEGER(4)
+ !DEF: /implicit_dsa_test1/OtherConstruct2/z (OmpShared) HostAssoc INTEGER(4)
x = y + z
!$omp end task
@@ -133,7 +133,7 @@ subroutine implicit_dsa_test6
!$omp end parallel
!$omp parallel default(firstprivate) shared(y)
- !DEF: /implicit_dsa_test6/OtherConstruct1/OtherConstruct2/y HostAssoc INTEGER(4)
+ !DEF: /implicit_dsa_test6/OtherConstruct1/OtherConstruct2/y (OmpShared) HostAssoc INTEGER(4)
!DEF: /implicit_dsa_test6/OtherConstruct1/OtherConstruct2/x (OmpFirstPrivate) HostAssocINTEGER(4)
!DEF: /implicit_dsa_test6/OtherConstruct1/OtherConstruct2/z (OmpFirstPrivate) HostAssocINTEGER(4)
y = x + z
diff --git a/flang/test/Semantics/OpenMP/symbol01.f90 b/flang/test/Semantics/OpenMP/symbol01.f90
index ecfb8622f81794..a40a8563fde1f8 100644
--- a/flang/test/Semantics/OpenMP/symbol01.f90
+++ b/flang/test/Semantics/OpenMP/symbol01.f90
@@ -62,7 +62,7 @@ program mm
!REF: /mm/OtherConstruct1/i
!REF: /mm/OtherConstruct1/y
x = a+i+y
- !DEF: /mm/OtherConstruct1/c HostAssoc REAL(4)
+ !DEF: /mm/OtherConstruct1/c (OmpShared) HostAssoc REAL(4)
c = 3.0
end do
end program
diff --git a/flang/test/Semantics/OpenMP/symbol02.f90 b/flang/test/Semantics/OpenMP/symbol02.f90
index c199c526e1fa8c..31d9cb2e46ba8a 100644
--- a/flang/test/Semantics/OpenMP/symbol02.f90
+++ b/flang/test/Semantics/OpenMP/symbol02.f90
@@ -15,9 +15,9 @@
a = 3.
!DEF: /MainProgram1/OtherConstruct1/b (OmpPrivate) HostAssoc REAL(4)
b = 4
- !DEF: /MainProgram1/OtherConstruct1/c HostAssoc REAL(4)
+ !DEF: /MainProgram1/OtherConstruct1/c (OmpShared) HostAssoc REAL(4)
c = 5
- !DEF: /MainProgram1/OtherConstruct1/d HostAssoc REAL(4)
+ !DEF: /MainProgram1/OtherConstruct1/d (OmpShared) HostAssoc REAL(4)
d = 6
!$omp end parallel
!DEF: /MainProgram1/a (Implicit) ObjectEntity REAL(4)
diff --git a/flang/test/Semantics/OpenMP/symbol03.f90 b/flang/test/Semantics/OpenMP/symbol03.f90
index ba941b9c9e7c4e..08defb40e56a71 100644
--- a/flang/test/Semantics/OpenMP/symbol03.f90
+++ b/flang/test/Semantics/OpenMP/symbol03.f90
@@ -9,10 +9,10 @@
!$omp parallel private(a) shared(b)
!DEF: /MainProgram1/OtherConstruct1/a (OmpPrivate) HostAssoc REAL(4)
a = 3.
- !DEF: /MainProgram1/OtherConstruct1/b HostAssoc REAL(4)
+ !DEF: /MainProgram1/OtherConstruct1/b (OmpShared) HostAssoc REAL(4)
b = 4
!$omp parallel private(b) shared(a)
- !DEF: /MainProgram1/OtherConstruct1/OtherConstruct1/a HostAssoc REAL(4)
+ !DEF: /MainProgram1/OtherConstruct1/OtherConstruct1/a (OmpShared) HostAssoc REAL(4)
a = 5.
!DEF: /MainProgram1/OtherConstruct1/OtherConstruct1/b (OmpPrivate) HostAssoc REAL(4)
b = 6
diff --git a/flang/test/Semantics/OpenMP/symbol07.f90 b/flang/test/Semantics/OpenMP/symbol07.f90
index 8b4716999820b1..a375942ebb1d9a 100644
--- a/flang/test/Semantics/OpenMP/symbol07.f90
+++ b/flang/test/Semantics/OpenMP/symbol07.f90
@@ -23,7 +23,7 @@ subroutine function_call_in_region
!$omp parallel default(none) private(a) shared(b)
!DEF: /function_call_in_region/OtherConstruct1/a (OmpPrivate) HostAssoc REAL(4)
!REF: /function_call_in_region/foo
- !DEF: /function_call_in_region/OtherConstruct1/b HostAssoc REAL(4)
+ !DEF: /function_call_in_region/OtherConstruct1/b (OmpShared) HostAssoc REAL(4)
a = foo(b)
!$omp end parallel
!REF: /function_call_in_region/a
diff --git a/flang/test/Semantics/OpenMP/symbol09.f90 b/flang/test/Semantics/OpenMP/symbol09.f90
index 8b4716999820b1..a375942ebb1d9a 100644
--- a/flang/test/Semantics/OpenMP/symbol09.f90
+++ b/flang/test/Semantics/OpenMP/symbol09.f90
@@ -23,7 +23,7 @@ subroutine function_call_in_region
!$omp parallel default(none) private(a) shared(b)
!DEF: /function_call_in_region/OtherConstruct1/a (OmpPrivate) HostAssoc REAL(4)
!REF: /function_call_in_region/foo
- !DEF: /function_call_in_region/OtherConstruct1/b HostAssoc REAL(4)
+ !DEF: /function_call_in_region/OtherConstruct1/b (OmpShared) HostAssoc REAL(4)
a = foo(b)
!$omp end parallel
!REF: /function_call_in_region/a
More information about the flang-commits
mailing list