[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:59:26 PDT 2026
================
@@ -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();
----------------
clementval wrote:
Yeah that works fine and its cleaner. Thanks
https://github.com/llvm/llvm-project/pull/194705
More information about the flang-commits
mailing list