[flang-commits] [flang] a535078 - Revert "[flang][cuda] Allocate derived-type with CUDA componement in managed memory (#146797)"

Valentin Clement via flang-commits flang-commits at lists.llvm.org
Wed Jul 2 17:52:24 PDT 2025


Author: Valentin Clement
Date: 2025-07-02T17:51:45-07:00
New Revision: a5350785db62f2082bd700fc68bbab9781d03489

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

LOG: Revert "[flang][cuda] Allocate derived-type with CUDA componement in managed memory (#146797)"

This reverts commit 925588cd001a91d592b99e6e7c6bee9514f5a26e.

Added: 
    

Modified: 
    flang/lib/Lower/ConvertVariable.cpp
    flang/lib/Semantics/tools.cpp
    flang/test/Lower/CUDA/cuda-derived.cuf

Removed: 
    


################################################################################
diff  --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp
index 44f534e7d569a..7ab3c43016bd9 100644
--- a/flang/lib/Lower/ConvertVariable.cpp
+++ b/flang/lib/Lower/ConvertVariable.cpp
@@ -702,29 +702,6 @@ static void instantiateGlobal(Fortran::lower::AbstractConverter &converter,
   mapSymbolAttributes(converter, var, symMap, stmtCtx, cast);
 }
 
-bool needCUDAAlloc(const Fortran::semantics::Symbol &sym) {
-  if (Fortran::semantics::IsDummy(sym))
-    return false;
-  if (const auto *details{
-          sym.GetUltimate()
-              .detailsIf<Fortran::semantics::ObjectEntityDetails>()}) {
-    if (details->cudaDataAttr() &&
-        (*details->cudaDataAttr() == Fortran::common::CUDADataAttr::Device ||
-         *details->cudaDataAttr() == Fortran::common::CUDADataAttr::Managed ||
-         *details->cudaDataAttr() == Fortran::common::CUDADataAttr::Unified ||
-         *details->cudaDataAttr() == Fortran::common::CUDADataAttr::Shared ||
-         *details->cudaDataAttr() == Fortran::common::CUDADataAttr::Pinned))
-      return true;
-    const Fortran::semantics::DeclTypeSpec *type{details->type()};
-    const Fortran::semantics::DerivedTypeSpec *derived{type ? type->AsDerived()
-                                                            : nullptr};
-    if (derived)
-      if (FindCUDADeviceAllocatableUltimateComponent(*derived))
-        return true;
-  }
-  return false;
-}
-
 //===----------------------------------------------------------------===//
 // Local variables instantiation (not for alias)
 //===----------------------------------------------------------------===//
@@ -755,7 +732,7 @@ static mlir::Value createNewLocal(Fortran::lower::AbstractConverter &converter,
   if (ultimateSymbol.test(Fortran::semantics::Symbol::Flag::CrayPointee))
     return builder.create<fir::ZeroOp>(loc, fir::ReferenceType::get(ty));
 
-  if (needCUDAAlloc(ultimateSymbol)) {
+  if (Fortran::semantics::NeedCUDAAlloc(ultimateSymbol)) {
     cuf::DataAttributeAttr dataAttr =
         Fortran::lower::translateSymbolCUFDataAttribute(builder.getContext(),
                                                         ultimateSymbol);
@@ -1110,7 +1087,7 @@ static void instantiateLocal(Fortran::lower::AbstractConverter &converter,
     Fortran::lower::defaultInitializeAtRuntime(converter, var.getSymbol(),
                                                symMap);
   auto *builder = &converter.getFirOpBuilder();
-  if (needCUDAAlloc(var.getSymbol()) &&
+  if (Fortran::semantics::NeedCUDAAlloc(var.getSymbol()) &&
       !cuf::isCUDADeviceContext(builder->getRegion())) {
     cuf::DataAttributeAttr dataAttr =
         Fortran::lower::translateSymbolCUFDataAttribute(builder->getContext(),

diff  --git a/flang/lib/Semantics/tools.cpp b/flang/lib/Semantics/tools.cpp
index ea37316e78273..498bbc18709ab 100644
--- a/flang/lib/Semantics/tools.cpp
+++ b/flang/lib/Semantics/tools.cpp
@@ -1095,20 +1095,9 @@ bool IsDeviceAllocatable(const Symbol &symbol) {
 }
 
 std::optional<common::CUDADataAttr> GetCUDADataAttr(const Symbol *symbol) {
-  const auto *details{
+  const auto *object{
       symbol ? symbol->detailsIf<ObjectEntityDetails>() : nullptr};
-  if (details) {
-    const Fortran::semantics::DeclTypeSpec *type{details->type()};
-    const Fortran::semantics::DerivedTypeSpec *derived{
-        type ? type->AsDerived() : nullptr};
-    if (derived) {
-      if (FindCUDADeviceAllocatableUltimateComponent(*derived)) {
-        return common::CUDADataAttr::Managed;
-      }
-    }
-    return details->cudaDataAttr();
-  }
-  return std::nullopt;
+  return object ? object->cudaDataAttr() : std::nullopt;
 }
 
 bool IsAccessible(const Symbol &original, const Scope &scope) {

diff  --git a/flang/test/Lower/CUDA/cuda-derived.cuf b/flang/test/Lower/CUDA/cuda-derived.cuf
index 96250d88d81c4..d280ac722d08f 100644
--- a/flang/test/Lower/CUDA/cuda-derived.cuf
+++ b/flang/test/Lower/CUDA/cuda-derived.cuf
@@ -7,16 +7,6 @@ module m1
 
   type t1; real, device, allocatable :: a(:); end type
   type t2; type(t1) :: b; end type
-contains
-  subroutine sub1()
-    type(ty_device) :: a
-  end subroutine
-
-! CHECK-LABEL: func.func @_QMm1Psub1()
-! CHECK: %[[ALLOC:.*]] = cuf.alloc !fir.type<_QMm1Tty_device{x:!fir.box<!fir.heap<!fir.array<?xi32>>>}> {bindc_name = "a", data_attr = #cuf.cuda<managed>, uniq_name = "_QMm1Fsub1Ea"} -> !fir.ref<!fir.type<_QMm1Tty_device{x:!fir.box<!fir.heap<!fir.array<?xi32>>>}>>
-! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOC]] {data_attr = #cuf.cuda<managed>, uniq_name = "_QMm1Fsub1Ea"} : (!fir.ref<!fir.type<_QMm1Tty_device{x:!fir.box<!fir.heap<!fir.array<?xi32>>>}>>) -> (!fir.ref<!fir.type<_QMm1Tty_device{x:!fir.box<!fir.heap<!fir.array<?xi32>>>}>>, !fir.ref<!fir.type<_QMm1Tty_device{x:!fir.box<!fir.heap<!fir.array<?xi32>>>}>>)
-! CHECK: cuf.free %[[DECL]]#0 : !fir.ref<!fir.type<_QMm1Tty_device{x:!fir.box<!fir.heap<!fir.array<?xi32>>>}>> {data_attr = #cuf.cuda<managed>}
-
 end module
 
 program main
@@ -26,5 +16,5 @@ program main
 end
 
 ! CHECK-LABEL: func.func @_QQmain() attributes {fir.bindc_name = "main"}
-! CHECK: %{{.*}} = cuf.alloc !fir.type<_QMm1Tty_device{x:!fir.box<!fir.heap<!fir.array<?xi32>>>}> {bindc_name = "a", data_attr = #cuf.cuda<managed>, uniq_name = "_QFEa"}
-! CHECK: %{{.*}} = cuf.alloc !fir.type<_QMm1Tt2{b:!fir.type<_QMm1Tt1{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>}> {bindc_name = "b", data_attr = #cuf.cuda<managed>, uniq_name = "_QFEb"}
+! CHECK: %{{.*}} = fir.alloca !fir.type<_QMm1Tty_device{x:!fir.box<!fir.heap<!fir.array<?xi32>>>}> {bindc_name = "a", uniq_name = "_QFEa"}
+! CHECK: %{{.*}} = fir.alloca !fir.type<_QMm1Tt2{b:!fir.type<_QMm1Tt1{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>}> {bindc_name = "b", uniq_name = "_QFEb"}


        


More information about the flang-commits mailing list