[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