[flang-commits] [flang] [flang][cuda] Implicitly add DEVICE attribute in device/global functions (PR #119743)
Valentin Clement バレンタイン クレメン via flang-commits
flang-commits at lists.llvm.org
Thu Dec 12 11:01:27 PST 2024
https://github.com/clementval updated https://github.com/llvm/llvm-project/pull/119743
>From 6e2c547ad7469d2bf13fdac9f0d006d69bae0cfe Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Thu, 12 Dec 2024 10:53:13 -0800
Subject: [PATCH 1/2] [flang][cuda] Implicitly add DEVICE attribute in
device/global functions
---
flang/lib/Semantics/resolve-names.cpp | 19 +++++++++++++++++++
flang/test/Semantics/modfile55.cuf | 1 +
2 files changed, 20 insertions(+)
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index b576f59e8c7e52..a38c86e683b6b3 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -8953,6 +8953,18 @@ void ResolveNamesVisitor::FinishSpecificationPart(
misparsedStmtFuncFound_ = false;
funcResultStack().CompleteFunctionResultType();
CheckImports();
+ bool inDeviceSubprogram = false;
+ if (auto *subp{currScope().symbol()
+ ? currScope().symbol()->detailsIf<SubprogramDetails>()
+ : nullptr}) {
+ if (auto attrs{subp->cudaSubprogramAttrs()}) {
+ if (*attrs != common::CUDASubprogramAttrs::Device ||
+ *attrs != common::CUDASubprogramAttrs::Global ||
+ *attrs != common::CUDASubprogramAttrs::Grid_Global) {
+ inDeviceSubprogram = true;
+ }
+ }
+ }
for (auto &pair : currScope()) {
auto &symbol{*pair.second};
if (inInterfaceBlock()) {
@@ -8961,6 +8973,13 @@ void ResolveNamesVisitor::FinishSpecificationPart(
if (NeedsExplicitType(symbol)) {
ApplyImplicitRules(symbol);
}
+ if (inDeviceSubprogram && IsDummy(symbol) && symbol.has<ObjectEntityDetails>()) {
+ auto *dummy{symbol.detailsIf<ObjectEntityDetails>()};
+ if (!dummy->cudaDataAttr()) {
+ // Implicitly set device attribute if none is set in device context.
+ dummy->set_cudaDataAttr(common::CUDADataAttr::Device);
+ }
+ }
if (IsDummy(symbol) && isImplicitNoneType() &&
symbol.test(Symbol::Flag::Implicit) && !context().HasError(symbol)) {
Say(symbol.name(),
diff --git a/flang/test/Semantics/modfile55.cuf b/flang/test/Semantics/modfile55.cuf
index cf01bdd5f58f6f..6c0d152a382a88 100644
--- a/flang/test/Semantics/modfile55.cuf
+++ b/flang/test/Semantics/modfile55.cuf
@@ -29,6 +29,7 @@ end
!contains
!attributes(global) subroutine globsub(x,y,z)
!real(4),value::x
+!attributes(device) x
!real(4)::y
!attributes(device) y
!real(4)::z
>From 5f343667d2a70d8ebf49488e7072d3b92451b1d1 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Thu, 12 Dec 2024 11:01:14 -0800
Subject: [PATCH 2/2] clang-format
---
flang/lib/Semantics/resolve-names.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index a38c86e683b6b3..aef2898919f3ff 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -8973,7 +8973,8 @@ void ResolveNamesVisitor::FinishSpecificationPart(
if (NeedsExplicitType(symbol)) {
ApplyImplicitRules(symbol);
}
- if (inDeviceSubprogram && IsDummy(symbol) && symbol.has<ObjectEntityDetails>()) {
+ if (inDeviceSubprogram && IsDummy(symbol) &&
+ symbol.has<ObjectEntityDetails>()) {
auto *dummy{symbol.detailsIf<ObjectEntityDetails>()};
if (!dummy->cudaDataAttr()) {
// Implicitly set device attribute if none is set in device context.
More information about the flang-commits
mailing list