[flang-commits] [flang] 3ddd137 - [flang] [cuda] Move SetImplicityCUDADevice after symbols in block construct are converted to objects (#143791)
via flang-commits
flang-commits at lists.llvm.org
Thu Jun 12 17:08:52 PDT 2025
Author: Zhen Wang
Date: 2025-06-12T17:08:49-07:00
New Revision: 3ddd137332237918fbb6175c20327fe765d2c4ad
URL: https://github.com/llvm/llvm-project/commit/3ddd137332237918fbb6175c20327fe765d2c4ad
DIFF: https://github.com/llvm/llvm-project/commit/3ddd137332237918fbb6175c20327fe765d2c4ad.diff
LOG: [flang] [cuda] Move SetImplicityCUDADevice after symbols in block construct are converted to objects (#143791)
`SetImplicitCUDADevice` looks for `symbol.has<ObjectEntityDetails>()` to
set the device attribute before symbols inside block constructs are
converted to ObjectEntity. Fix is to move the call to
`SetImplicitCUDADevice` after those symbols are converted.
Added:
Modified:
flang/lib/Semantics/resolve-names.cpp
flang/test/Semantics/cuf21.cuf
Removed:
################################################################################
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 7db447aee0026..e23e91b674a73 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -2828,6 +2828,16 @@ Scope &ScopeHandler::NonDerivedTypeScope() {
return currScope_->IsDerivedType() ? currScope_->parent() : *currScope_;
}
+static void SetImplicitCUDADevice(Symbol &symbol) {
+ if (auto *object{symbol.detailsIf<ObjectEntityDetails>()}) {
+ if (!object->cudaDataAttr() && !IsValue(symbol) &&
+ !IsFunctionResult(symbol)) {
+ // Implicitly set device attribute if none is set in device context.
+ object->set_cudaDataAttr(common::CUDADataAttr::Device);
+ }
+ }
+}
+
void ScopeHandler::PushScope(Scope::Kind kind, Symbol *symbol) {
PushScope(currScope().MakeScope(kind, symbol));
}
@@ -2867,9 +2877,35 @@ void ScopeHandler::PopScope() {
// Entities that are not yet classified as objects or procedures are now
// assumed to be objects.
// TODO: Statement functions
+ bool inDeviceSubprogram{false};
+ const Symbol *scopeSym{currScope().GetSymbol()};
+ if (currScope().kind() == Scope::Kind::BlockConstruct) {
+ scopeSym = GetProgramUnitContaining(currScope()).GetSymbol();
+ }
+ if (scopeSym) {
+ if (auto *details{scopeSym->detailsIf<SubprogramDetails>()}) {
+ // Check the current procedure is a device procedure to apply implicit
+ // attribute at the end.
+ if (auto attrs{details->cudaSubprogramAttrs()}) {
+ if (*attrs == common::CUDASubprogramAttrs::Device ||
+ *attrs == common::CUDASubprogramAttrs::Global ||
+ *attrs == common::CUDASubprogramAttrs::Grid_Global) {
+ inDeviceSubprogram = true;
+ }
+ }
+ }
+ }
for (auto &pair : currScope()) {
ConvertToObjectEntity(*pair.second);
}
+
+ // Apply CUDA device attributes if in a device subprogram
+ if (inDeviceSubprogram && currScope().kind() == Scope::Kind::BlockConstruct) {
+ for (auto &pair : currScope()) {
+ SetImplicitCUDADevice(*pair.second);
+ }
+ }
+
funcResultStack_.Pop();
// If popping back into a global scope, pop back to the top scope.
Scope *hermetic{context().currentHermeticModuleFileScope()};
@@ -9555,40 +9591,11 @@ void ResolveNamesVisitor::CreateGeneric(const parser::GenericSpec &x) {
info.Resolve(&MakeSymbol(symbolName, Attrs{}, std::move(genericDetails)));
}
-static void SetImplicitCUDADevice(bool inDeviceSubprogram, Symbol &symbol) {
- if (inDeviceSubprogram && symbol.has<ObjectEntityDetails>()) {
- auto *object{symbol.detailsIf<ObjectEntityDetails>()};
- if (!object->cudaDataAttr() && !IsValue(symbol) &&
- !IsFunctionResult(symbol)) {
- // Implicitly set device attribute if none is set in device context.
- object->set_cudaDataAttr(common::CUDADataAttr::Device);
- }
- }
-}
-
void ResolveNamesVisitor::FinishSpecificationPart(
const std::list<parser::DeclarationConstruct> &decls) {
misparsedStmtFuncFound_ = false;
funcResultStack().CompleteFunctionResultType();
CheckImports();
- bool inDeviceSubprogram{false};
- Symbol *scopeSym{currScope().symbol()};
- if (currScope().kind() == Scope::Kind::BlockConstruct) {
- scopeSym = currScope().parent().symbol();
- }
- if (scopeSym) {
- if (auto *details{scopeSym->detailsIf<SubprogramDetails>()}) {
- // Check the current procedure is a device procedure to apply implicit
- // attribute at the end.
- if (auto attrs{details->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()) {
@@ -9623,11 +9630,6 @@ void ResolveNamesVisitor::FinishSpecificationPart(
SetBindNameOn(symbol);
}
}
- if (currScope().kind() == Scope::Kind::BlockConstruct) {
- // Only look for specification in BlockConstruct. Other cases are done in
- // ResolveSpecificationParts.
- SetImplicitCUDADevice(inDeviceSubprogram, symbol);
- }
}
currScope().InstantiateDerivedTypes();
for (const auto &decl : decls) {
@@ -10187,7 +10189,9 @@ void ResolveNamesVisitor::ResolveSpecificationParts(ProgramTree &node) {
}
ApplyImplicitRules(symbol);
// Apply CUDA implicit attributes if needed.
- SetImplicitCUDADevice(inDeviceSubprogram, symbol);
+ if (inDeviceSubprogram) {
+ SetImplicitCUDADevice(symbol);
+ }
// Main program local objects usually don't have an implied SAVE attribute,
// as one might think, but in the exceptional case of a derived type
// local object that contains a coarray, we have to mark it as an
diff --git a/flang/test/Semantics/cuf21.cuf b/flang/test/Semantics/cuf21.cuf
index 077657c8a52d5..db32f1dbd0e7b 100644
--- a/flang/test/Semantics/cuf21.cuf
+++ b/flang/test/Semantics/cuf21.cuf
@@ -13,18 +13,21 @@ contains
implicit none
logical, intent(in), value :: back
real(4) :: mval
-
- call maxlocUpdate(mval, back)
-
+ block
+ integer(8) :: xloc
+ call maxlocUpdate(mval, xloc, back)
+ end block
end subroutine maxlocPartialMaskR_32F1D
- attributes(device) subroutine maxlocUpdateR_32F(mval, back)
+ attributes(device) subroutine maxlocUpdateR_32F(mval, xloc, back)
real(4) :: mval
+ integer(8) :: xloc
logical :: back
end subroutine maxlocUpdateR_32F
- attributes(device) subroutine maxlocUpdateR_64F(mval, back)
+ attributes(device) subroutine maxlocUpdateR_64F(mval, xloc, back)
real(8) :: mval
+ integer(8) :: xloc
logical :: back
end subroutine maxlocUpdateR_64F
end module
More information about the flang-commits
mailing list