[flang-commits] [flang] [flang][cuda][openacc] Fix OpenACC use_device host association symbol copies (PR #194705)

Valentin Clement バレンタイン クレメン via flang-commits flang-commits at lists.llvm.org
Wed Apr 29 10:53:57 PDT 2026


https://github.com/clementval updated https://github.com/llvm/llvm-project/pull/194705

>From b0f22dd5a40e594428d0ca5891aa808d63c5923c Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Tue, 28 Apr 2026 11:40:40 -0700
Subject: [PATCH 1/3] [flang][cuda][openacc] Fix OpenACC use_device host
 association symbol copies

---
 flang/lib/Semantics/resolve-names.cpp | 48 +++++++++++++++++++++------
 1 file changed, 37 insertions(+), 11 deletions(-)

diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index cda75fe566087..7cc9d2fab6051 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1478,6 +1478,7 @@ class AccVisitor : public virtual DeclarationVisitor {
       llvm::ArrayRef<SourceName> componentPath, parser::Designator &designator);
 
 private:
+  Symbol *CopyUseDeviceSymbol(const Symbol &symbol);
   SemanticsContext &context_;
 };
 
@@ -1615,30 +1616,55 @@ void AccVisitor::CopySymbolWithDevice(const parser::Name *name) {
   // New symbols are created for those appearing in the use_device clause.
   // These new symbols get the CUDA device attribute.
   if (name && name->symbol) {
-    Symbol *copy{currScope().CopySymbol(name->symbol->GetUltimate())};
+    Symbol *copy{CopyUseDeviceSymbol(*name->symbol)};
     if (copy) {
-      if (auto *object{copy->GetUltimate().detailsIf<ObjectEntityDetails>()}) {
+      if (auto *object{copy->detailsIf<ObjectEntityDetails>()}) {
         object->set_cudaDataAttr(common::CUDADataAttr::Device);
       }
-    } else {
-      copy = FindInScope(currScope(), name->symbol->GetUltimate().name());
-    }
-    if (copy) {
       name->symbol = copy;
     }
   }
 }
 
+Symbol *AccVisitor::CopyUseDeviceSymbol(const Symbol &symbol) {
+  const Symbol &ultimate{symbol.GetUltimate()};
+  Symbol *copy{currScope().CopySymbol(ultimate)};
+  if (!copy) {
+    copy = FindInScope(currScope(), ultimate.name());
+  }
+  if (copy && copy->has<HostAssocDetails>()) {
+    if (const auto *hostAssoc{copy->detailsIf<HostAssocDetails>()};
+        hostAssoc && copy->owner().kind() == Scope::Kind::OpenACCConstruct) {
+      Scope &hostScope{currScope().parent()};
+      if (!FindInScope(hostScope, ultimate.name())) {
+        auto pair{hostScope.try_emplace(
+            ultimate.name(), HostAssocDetails{hostAssoc->symbol()})};
+        Symbol &hostCopy{*pair.first->second};
+        hostCopy.attrs() = hostAssoc->symbol().attrs();
+        hostCopy.implicitAttrs() =
+            hostCopy.attrs() & Attrs{Attr::ASYNCHRONOUS, Attr::VOLATILE};
+        hostCopy.implicitAttrs() |=
+            hostAssoc->symbol().implicitAttrs() & Attrs{Attr::SAVE};
+        hostCopy.flags() = hostAssoc->symbol().flags();
+      }
+    }
+    if (const auto *object{ultimate.detailsIf<ObjectEntityDetails>()}) {
+      currScope().erase(copy->name());
+      auto pair{currScope().try_emplace(
+          ultimate.name(), ultimate.attrs(), ObjectEntityDetails{*object})};
+      copy = &*pair.first->second;
+      copy->flags() = ultimate.flags();
+    }
+  }
+  return copy;
+}
+
 void AccVisitor::CopySymbolWithDeviceStructurePath(const parser::Name *baseName,
     llvm::ArrayRef<SourceName> componentPath, parser::Designator &designator) {
   if (!baseName || !baseName->symbol || componentPath.empty()) {
     return;
   }
-  const Symbol &orig{*baseName->symbol};
-  Symbol *copy{currScope().CopySymbol(orig)};
-  if (!copy) {
-    copy = FindInScope(currScope(), baseName->symbol->name());
-  }
+  Symbol *copy{CopyUseDeviceSymbol(*baseName->symbol)};
   if (!copy) {
     return;
   }

>From dce020e7a20c1a14c56248742329d5a7aed87699 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Tue, 28 Apr 2026 11:54:05 -0700
Subject: [PATCH 2/3] Add test

---
 .../OpenACC/acc-host-data-cuda-host-assoc.f90 | 24 +++++++++++++++++++
 1 file changed, 24 insertions(+)
 create mode 100644 flang/test/Lower/OpenACC/acc-host-data-cuda-host-assoc.f90

diff --git a/flang/test/Lower/OpenACC/acc-host-data-cuda-host-assoc.f90 b/flang/test/Lower/OpenACC/acc-host-data-cuda-host-assoc.f90
new file mode 100644
index 0000000000000..9844fd9913fd9
--- /dev/null
+++ b/flang/test/Lower/OpenACC/acc-host-data-cuda-host-assoc.f90
@@ -0,0 +1,24 @@
+! RUN: bbc -fopenacc -fcuda -emit-hlfir %s -o - | FileCheck %s
+
+interface something 
+  subroutine proc_device(x) 
+    real(4), device :: x(100) 
+  end subroutine 
+  subroutine proc_host(x) 
+    real(4) :: x(100) 
+  end subroutine 
+end interface 
+
+real(4) :: a(100)  
+!$acc declare copy(a)  
+
+call test_simple() 
+contains  
+  subroutine test_simple  
+    !$acc host_data use_device(a)  
+    call something(a)  
+    !$acc end host_data  
+  end subroutine  
+end 
+
+! CHECK: fir.call @_QPproc_device

>From 5d3529ead491643b80b102642f04e5c2b497542a Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Wed, 29 Apr 2026 10:53:41 -0700
Subject: [PATCH 3/3] Simplify host scope copy

---
 flang/lib/Semantics/resolve-names.cpp | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 7cc9d2fab6051..3855d10291cc3 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1637,15 +1637,7 @@ Symbol *AccVisitor::CopyUseDeviceSymbol(const Symbol &symbol) {
         hostAssoc && copy->owner().kind() == Scope::Kind::OpenACCConstruct) {
       Scope &hostScope{currScope().parent()};
       if (!FindInScope(hostScope, ultimate.name())) {
-        auto pair{hostScope.try_emplace(
-            ultimate.name(), HostAssocDetails{hostAssoc->symbol()})};
-        Symbol &hostCopy{*pair.first->second};
-        hostCopy.attrs() = hostAssoc->symbol().attrs();
-        hostCopy.implicitAttrs() =
-            hostCopy.attrs() & Attrs{Attr::ASYNCHRONOUS, Attr::VOLATILE};
-        hostCopy.implicitAttrs() |=
-            hostAssoc->symbol().implicitAttrs() & Attrs{Attr::SAVE};
-        hostCopy.flags() = hostAssoc->symbol().flags();
+        hostScope.CopySymbol(ultimate);
       }
     }
     if (const auto *object{ultimate.detailsIf<ObjectEntityDetails>()}) {



More information about the flang-commits mailing list