[flang-commits] [flang] 752ccf7 - [flang][openacc][cuda] Add implicit device attribute for use_device unconditionally (#186844)

via flang-commits flang-commits at lists.llvm.org
Wed Mar 18 13:59:46 PDT 2026


Author: Valentin Clement (バレンタイン クレメン)
Date: 2026-03-18T13:59:40-07:00
New Revision: 752ccf718b713e52741c356889cfde1569e3a0f2

URL: https://github.com/llvm/llvm-project/commit/752ccf718b713e52741c356889cfde1569e3a0f2
DIFF: https://github.com/llvm/llvm-project/commit/752ccf718b713e52741c356889cfde1569e3a0f2.diff

LOG: [flang][openacc][cuda] Add implicit device attribute for use_device unconditionally (#186844)

For interoperability between CUDA Fortran and OpenACC.

Added: 
    

Modified: 
    flang/lib/Lower/OpenACC.cpp
    flang/lib/Semantics/resolve-names.cpp
    flang/test/Semantics/OpenACC/bug1583.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index dad4b7e827b7e..e54b3ac9b21bd 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -1759,7 +1759,7 @@ void AccDataMap::remapDataOperandSymbols(
       llvm::cast<hlfir::DeclareOp>(*computeDef).setSkipRebox(true);
 
     symbolMap.addVariableDefinition(
-        symbol, llvm::cast<fir::FortranVariableOpInterface>(computeDef));
+        symbol, llvm::cast<fir::FortranVariableOpInterface>(computeDef), true);
   }
 
   for (const auto &comp : components) {
@@ -2857,41 +2857,40 @@ genACCHostDataOp(Fortran::lower::AbstractConverter &converter,
   for (const Fortran::parser::AccClause &clause : accClauseList.v) {
     if (const auto *useDevice =
             std::get_if<Fortran::parser::AccClause::UseDevice>(&clause.u)) {
-      // When CUDA Fortran is enabled, extra symbols are used in the host_data
-      // region. Look for them and bind their values with the symbols in the
-      // outer scope.
-      if (semanticsContext.IsEnabled(Fortran::common::LanguageFeature::CUDA)) {
-        const Fortran::parser::AccObjectList &objectList{useDevice->v};
-        for (const auto &accObject : objectList.v) {
-          const Fortran::semantics::Symbol *newSym = nullptr;
-          if (const auto *designator =
-                  std::get_if<Fortran::parser::Designator>(&accObject.u)) {
+      // For CUDA Fortran interoperability, extra symbols are used in the
+      // host_data region. Look for them and bind their values with the symbols
+      // in the outer scope.
+      const Fortran::parser::AccObjectList &objectList{useDevice->v};
+      for (const auto &accObject : objectList.v) {
+        const Fortran::semantics::Symbol *newSym = nullptr;
+        if (const auto *designator =
+                std::get_if<Fortran::parser::Designator>(&accObject.u)) {
+          if (const auto *name =
+                  Fortran::parser::GetDesignatorNameIfDataRef(*designator)) {
+            newSym = name->symbol;
+          } else if (const auto *arrayElement =
+                         Fortran::parser::Unwrap<Fortran::parser::ArrayElement>(
+                             *designator)) {
+            const Fortran::parser::Name &name =
+                Fortran::parser::GetLastName(arrayElement->Base());
+            newSym = name.symbol;
+          } else if (const auto *component = Fortran::parser::Unwrap<
+                         Fortran::parser::StructureComponent>(*designator)) {
+            const Fortran::parser::DataRef &base{component->Base()};
             if (const auto *name =
-                    Fortran::parser::GetDesignatorNameIfDataRef(*designator)) {
+                    std::get_if<Fortran::parser::Name>(&base.u)) {
               newSym = name->symbol;
-            } else if (const auto *arrayElement = Fortran::parser::Unwrap<
-                           Fortran::parser::ArrayElement>(*designator)) {
-              const Fortran::parser::Name &name =
-                  Fortran::parser::GetLastName(arrayElement->Base());
-              newSym = name.symbol;
-            } else if (const auto *component = Fortran::parser::Unwrap<
-                           Fortran::parser::StructureComponent>(*designator)) {
-              const Fortran::parser::DataRef &base{component->Base()};
-              if (const auto *name =
-                      std::get_if<Fortran::parser::Name>(&base.u)) {
-                newSym = name->symbol;
-              }
             }
-          } else if (const auto *name =
-                         std::get_if<Fortran::parser::Name>(&accObject.u)) {
-            newSym = name->symbol;
-          }
-          if (newSym) {
-            const Fortran::semantics::Symbol *origSym =
-                localSymbols.lookupSymbolByName(newSym->name().ToString());
-            if (origSym)
-              localSymbols.copySymbolBinding(*origSym, *newSym);
           }
+        } else if (const auto *name =
+                       std::get_if<Fortran::parser::Name>(&accObject.u)) {
+          newSym = name->symbol;
+        }
+        if (newSym) {
+          const Fortran::semantics::Symbol *origSym =
+              localSymbols.lookupSymbolByName(newSym->name().ToString());
+          if (origSym && *origSym != *newSym)
+            localSymbols.copySymbolBinding(*origSym, *newSym);
         }
       }
       genDataOperandOperations<mlir::acc::UseDeviceOp>(

diff  --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index b6907cc792d76..7172eaf2aba36 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1400,8 +1400,6 @@ class ConstructVisitor : public virtual DeclarationVisitor {
 // Create scopes for OpenACC constructs
 class AccVisitor : public virtual DeclarationVisitor {
 public:
-  explicit AccVisitor(SemanticsContext &context) : context_{context} {}
-
   void AddAccSourceRange(const parser::CharBlock &);
 
   static bool NeedsScope(const parser::OpenACCBlockConstruct &);
@@ -1472,9 +1470,6 @@ class AccVisitor : public virtual DeclarationVisitor {
   }
 
   void CopySymbolWithDevice(const parser::Name *name);
-
-private:
-  SemanticsContext &context_;
 };
 
 bool AccVisitor::NeedsScope(const parser::OpenACCBlockConstruct &x) {
@@ -1505,12 +1500,10 @@ bool AccVisitor::Pre(const parser::OpenACCBlockConstruct &x) {
 }
 
 void AccVisitor::CopySymbolWithDevice(const parser::Name *name) {
-  // When CUDA Fortran is enabled together with OpenACC, new
-  // symbols are created for the one appearing in the use_device
-  // clause. These new symbols have the CUDA Fortran device
-  // attribute.
-  if (context_.languageFeatures().IsEnabled(common::LanguageFeature::CUDA) &&
-      name && name->symbol) {
+  // For CUDA Fortran interoperability, new symbols are created for the ones
+  // appearing in the use_device clause. These new symbols have the CUDA Fortran
+  // device attribute.
+  if (name && name->symbol) {
     if (Symbol * copy{currScope().CopySymbol(*name->symbol)}) {
       name->symbol = copy;
       if (auto *object{copy->detailsIf<ObjectEntityDetails>()}) {
@@ -2174,8 +2167,7 @@ class ResolveNamesVisitor : public virtual ScopeHandler,
 
   ResolveNamesVisitor(
       SemanticsContext &context, ImplicitRulesMap &rules, Scope &top)
-      : BaseVisitor{context, *this, rules}, AccVisitor(context),
-        topScope_{top} {
+      : BaseVisitor{context, *this, rules}, topScope_{top} {
     PushScope(top);
   }
 

diff  --git a/flang/test/Semantics/OpenACC/bug1583.f90 b/flang/test/Semantics/OpenACC/bug1583.f90
index 7778d4644a9ff..9fee2af44ef0d 100644
--- a/flang/test/Semantics/OpenACC/bug1583.f90
+++ b/flang/test/Semantics/OpenACC/bug1583.f90
@@ -15,7 +15,7 @@ subroutine sub (v)
   type(t) :: v
 !$acc host_data use_device(v%c)
   !DEF: /foo EXTERNAL (Subroutine) ProcEntity
-  !REF: /m/sub/v
+  !DEF: /m/sub/OpenACCConstruct1/v ObjectEntity TYPE(t)
   !REF: /m/t/c
   call foo(v%c)
 !$acc end host_data


        


More information about the flang-commits mailing list