From cbdf63428ba3d29e2087b6e234815e0b07e614da Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Wed, 15 Oct 2025 17:46:50 -0700 Subject: [PATCH 1/2] [flang][cuda] Handle associated variables in data transfer --- flang/include/flang/Evaluate/tools.h | 11 +--------- flang/lib/Evaluate/tools.cpp | 12 +++++++++++ .../CUDA/cuda-associate-data-transfer.cuf | 21 +++++++++++++++++++ 3 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 flang/test/Lower/CUDA/cuda-associate-data-transfer.cuf diff --git a/flang/include/flang/Evaluate/tools.h b/flang/include/flang/Evaluate/tools.h index d8d0956369e40..20a091918dc56 100644 --- a/flang/include/flang/Evaluate/tools.h +++ b/flang/include/flang/Evaluate/tools.h @@ -1289,16 +1289,7 @@ bool CheckForCoindexedObject(parser::ContextualMessages &, const std::optional &, const std::string &procName, const std::string &argName); -inline bool IsCUDADeviceSymbol(const Symbol &sym) { - if (const auto *details = - sym.GetUltimate().detailsIf()) { - if (details->cudaDataAttr() && - *details->cudaDataAttr() != common::CUDADataAttr::Pinned) { - return true; - } - } - return false; -} +bool IsCUDADeviceSymbol(const Symbol &sym); inline bool IsCUDAManagedOrUnifiedSymbol(const Symbol &sym) { if (const auto *details = diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp index b927fa3cc7ed7..bd06acc21e47f 100644 --- a/flang/lib/Evaluate/tools.cpp +++ b/flang/lib/Evaluate/tools.cpp @@ -1153,6 +1153,18 @@ bool HasCUDAImplicitTransfer(const Expr &expr) { return (hasConstant || (hostSymbols.size() > 0)) && deviceSymbols.size() > 0; } +bool IsCUDADeviceSymbol(const Symbol &sym) { + if (const auto *details = + sym.GetUltimate().detailsIf()) { + return details->cudaDataAttr() && + *details->cudaDataAttr() != common::CUDADataAttr::Pinned; + } else if (const auto *details = + sym.GetUltimate().detailsIf()) { + return GetNbOfCUDADeviceSymbols(details->expr()) > 0; + } + return false; +} + // HasVectorSubscript() struct HasVectorSubscriptHelper : public AnyTraverse d) + d1 = 0.0 + !@CUF end associate +end subroutine + +! CHECK-LABEL: func.func @_QPfoo() +! CHECK: %[[D:.*]] = fir.address_of(@_QMmEd) : !fir.ref> +! CHECK: %[[D_DECL:.*]]:2 = hlfir.declare %[[D]](%{{.*}}) {data_attr = #cuf.cuda, uniq_name = "_QMmEd"} : (!fir.ref>, !fir.shape<3>) -> (!fir.ref>, !fir.ref>) +! CHECK: %[[D1_DECL:.*]]:2 = hlfir.declare %[[D_DECL]]#0(%4) {uniq_name = "_QFfooEd1"} : (!fir.ref>, !fir.shape<3>) -> (!fir.ref>, !fir.ref>) +! CHECK: cuf.data_transfer %{{.*}} to %[[D1_DECL]]#0 {transfer_kind = #cuf.cuda_transfer} : f64, !fir.ref> From 86c4e13e683594db7a413593b9a91c4c0c3fe5e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Clement=20=28=E3=83=90=E3=83=AC=E3=83=B3?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=B3=20=E3=82=AF=E3=83=AC=E3=83=A1?= =?UTF-8?q?=E3=83=B3=29?= Date: Wed, 15 Oct 2025 20:58:58 -0700 Subject: [PATCH 2/2] Update flang/test/Lower/CUDA/cuda-associate-data-transfer.cuf --- flang/test/Lower/CUDA/cuda-associate-data-transfer.cuf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flang/test/Lower/CUDA/cuda-associate-data-transfer.cuf b/flang/test/Lower/CUDA/cuda-associate-data-transfer.cuf index 2b25e55e5df35..af850d5842443 100644 --- a/flang/test/Lower/CUDA/cuda-associate-data-transfer.cuf +++ b/flang/test/Lower/CUDA/cuda-associate-data-transfer.cuf @@ -1,4 +1,4 @@ -! RUN: bbc -emit-hlfir -fopenacc -fcuda %s -o - | FileCheck %s +! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s ! Test detection of CUDA Fortran data transfer in presence of associuate ! statement.