Skip to content

Commit 83c1cf6

Browse files
authored
[flang][OpenMP] Fix offsets for EQUIVALENCE in firstprivate(/block/) (#156492)
When a common block appears in firstprivate, its contents become host associations, which the symbol offset computation code for equivalences wasn't expecting. Add a GetUltimate() call, and extend symbol dumping for HostAssocDetails.
1 parent 2b9328c commit 83c1cf6

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

flang/lib/Semantics/compute-offsets.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,9 @@ void ComputeOffsetsHelper::DoCommonBlock(Symbol &commonBlock) {
239239
std::size_t minAlignment{0};
240240
UnorderedSymbolSet previous;
241241
for (auto object : details.objects()) {
242-
Symbol &symbol{*object};
242+
// Allow for host association when the common block is
243+
// OpenMP firstprivate.
244+
Symbol &symbol{object->GetUltimate()};
243245
auto errorSite{
244246
commonBlock.name().empty() ? symbol.name() : commonBlock.name()};
245247
if (std::size_t padding{DoSymbol(symbol.GetUltimate())}) {

flang/lib/Semantics/symbol.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &os, const Details &details) {
611611
sep = ',';
612612
}
613613
},
614-
[](const HostAssocDetails &) {},
614+
[&os](const HostAssocDetails &x) { os << " => " << x.symbol(); },
615615
[&](const ProcBindingDetails &x) {
616616
os << " => " << x.symbol().name();
617617
DumpOptional(os, "passName", x.passName());

flang/test/Semantics/cuf-device-procedures01.cuf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,5 @@ subroutine host()
4040
end subroutine
4141

4242
! CHECK-LABEL: Subprogram scope: host
43-
! CHECK: atomicadd, EXTERNAL: HostAssoc{{$}}
44-
! CHECK: syncthreads, EXTERNAL: HostAssoc{{$}}
43+
! CHECK: atomicadd, EXTERNAL: HostAssoc => atomicadd, EXTERNAL (Function, Implicit): ProcEntity REAL(4){{$}}
44+
! CHECK: syncthreads, EXTERNAL: HostAssoc => syncthreads, EXTERNAL (Subroutine): ProcEntity{{$}}

flang/test/Semantics/offsets05.f90

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
!RUN: %flang_fc1 -fdebug-dump-symbols -fopenmp %s | FileCheck %s
2+
3+
subroutine sub
4+
common /block/ a
5+
equivalence (b,c), (d,e), (a,f)
6+
!$omp parallel firstprivate(/block/)
7+
!$omp end parallel
8+
end subroutine
9+
10+
!CHECK: a (Implicit, InCommonBlock) size=4 offset=0: ObjectEntity type: REAL(4)
11+
!CHECK: b (Implicit) size=4 offset=0: ObjectEntity type: REAL(4)
12+
!CHECK: c (Implicit) size=4 offset=0: ObjectEntity type: REAL(4)
13+
!CHECK: d (Implicit) size=4 offset=4: ObjectEntity type: REAL(4)
14+
!CHECK: e (Implicit) size=4 offset=4: ObjectEntity type: REAL(4)
15+
!CHECK: f (Implicit) size=4 offset=0: ObjectEntity type: REAL(4)
16+
!CHECK: sub (Subroutine): HostAssoc => sub (Subroutine): Subprogram ()
17+
!CHECK: Equivalence Sets: (b,c) (d,e) (a,f)
18+
!CHECK: block size=4 offset=0: CommonBlockDetails alignment=4: a
19+
!CHECK: OtherConstruct scope:
20+
!CHECK: a (OmpFirstPrivate, OmpExplicit): HostAssoc => a (Implicit, InCommonBlock) size=4 offset=0: ObjectEntity type: REAL(4)

0 commit comments

Comments
 (0)