[flang-commits] [flang] 83c1cf6 - [flang][OpenMP] Fix offsets for EQUIVALENCE in firstprivate(/block/) (#156492)

via flang-commits flang-commits at lists.llvm.org
Wed Sep 3 11:07:14 PDT 2025


Author: Peter Klausler
Date: 2025-09-03T11:07:10-07:00
New Revision: 83c1cf6251c95f8ffbe55238e43dc2d9fee9c8ea

URL: https://github.com/llvm/llvm-project/commit/83c1cf6251c95f8ffbe55238e43dc2d9fee9c8ea
DIFF: https://github.com/llvm/llvm-project/commit/83c1cf6251c95f8ffbe55238e43dc2d9fee9c8ea.diff

LOG: [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.

Added: 
    flang/test/Semantics/offsets05.f90

Modified: 
    flang/lib/Semantics/compute-offsets.cpp
    flang/lib/Semantics/symbol.cpp
    flang/test/Semantics/cuf-device-procedures01.cuf

Removed: 
    


################################################################################
diff  --git a/flang/lib/Semantics/compute-offsets.cpp b/flang/lib/Semantics/compute-offsets.cpp
index 6d4fce2f00a6d..1c48d33549a2e 100644
--- a/flang/lib/Semantics/compute-offsets.cpp
+++ b/flang/lib/Semantics/compute-offsets.cpp
@@ -239,7 +239,9 @@ void ComputeOffsetsHelper::DoCommonBlock(Symbol &commonBlock) {
   std::size_t minAlignment{0};
   UnorderedSymbolSet previous;
   for (auto object : details.objects()) {
-    Symbol &symbol{*object};
+    // Allow for host association when the common block is
+    // OpenMP firstprivate.
+    Symbol &symbol{object->GetUltimate()};
     auto errorSite{
         commonBlock.name().empty() ? symbol.name() : commonBlock.name()};
     if (std::size_t padding{DoSymbol(symbol.GetUltimate())}) {

diff  --git a/flang/lib/Semantics/symbol.cpp b/flang/lib/Semantics/symbol.cpp
index 2259cfcf23ece..a6b402c48d4ff 100644
--- a/flang/lib/Semantics/symbol.cpp
+++ b/flang/lib/Semantics/symbol.cpp
@@ -611,7 +611,7 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &os, const Details &details) {
               sep = ',';
             }
           },
-          [](const HostAssocDetails &) {},
+          [&os](const HostAssocDetails &x) { os << " => " << x.symbol(); },
           [&](const ProcBindingDetails &x) {
             os << " => " << x.symbol().name();
             DumpOptional(os, "passName", x.passName());

diff  --git a/flang/test/Semantics/cuf-device-procedures01.cuf b/flang/test/Semantics/cuf-device-procedures01.cuf
index 92ee02bb3c64d..d8883860f46b2 100644
--- a/flang/test/Semantics/cuf-device-procedures01.cuf
+++ b/flang/test/Semantics/cuf-device-procedures01.cuf
@@ -40,5 +40,5 @@ subroutine host()
 end subroutine
 
 ! CHECK-LABEL: Subprogram scope: host
-! CHECK: atomicadd, EXTERNAL: HostAssoc{{$}}
-! CHECK: syncthreads, EXTERNAL: HostAssoc{{$}}
+! CHECK: atomicadd, EXTERNAL: HostAssoc => atomicadd, EXTERNAL (Function, Implicit): ProcEntity REAL(4){{$}}
+! CHECK: syncthreads, EXTERNAL: HostAssoc => syncthreads, EXTERNAL (Subroutine): ProcEntity{{$}}

diff  --git a/flang/test/Semantics/offsets05.f90 b/flang/test/Semantics/offsets05.f90
new file mode 100644
index 0000000000000..d88fe788576fd
--- /dev/null
+++ b/flang/test/Semantics/offsets05.f90
@@ -0,0 +1,20 @@
+!RUN: %flang_fc1 -fdebug-dump-symbols -fopenmp %s | FileCheck %s
+
+subroutine sub
+  common /block/ a
+  equivalence (b,c), (d,e), (a,f)
+!$omp parallel firstprivate(/block/)
+!$omp end parallel
+end subroutine
+
+!CHECK: a (Implicit, InCommonBlock) size=4 offset=0: ObjectEntity type: REAL(4)
+!CHECK: b (Implicit) size=4 offset=0: ObjectEntity type: REAL(4)
+!CHECK: c (Implicit) size=4 offset=0: ObjectEntity type: REAL(4)
+!CHECK: d (Implicit) size=4 offset=4: ObjectEntity type: REAL(4)
+!CHECK: e (Implicit) size=4 offset=4: ObjectEntity type: REAL(4)
+!CHECK: f (Implicit) size=4 offset=0: ObjectEntity type: REAL(4)
+!CHECK: sub (Subroutine): HostAssoc => sub (Subroutine): Subprogram ()
+!CHECK: Equivalence Sets: (b,c) (d,e) (a,f)
+!CHECK: block size=4 offset=0: CommonBlockDetails alignment=4: a
+!CHECK: OtherConstruct scope:
+!CHECK:   a (OmpFirstPrivate, OmpExplicit): HostAssoc => a (Implicit, InCommonBlock) size=4 offset=0: ObjectEntity type: REAL(4)


        


More information about the flang-commits mailing list