[flang-commits] [flang] [flang][cuda] Fix detection of implicit data transfer with a global (PR #152604)
via flang-commits
flang-commits at lists.llvm.org
Thu Aug 7 15:14:31 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: Valentin Clement (バレンタイン クレメン) (clementval)
<details>
<summary>Changes</summary>
The implicit data transfer detection is using `CollectCudaSymbols` and `GetSymbolVector` to process the symbols present in the rhs expression. `CollectCudaSymbolsHelper` utility was not using the returning ultimate symbol where `GetSymbolVector` was. Make the `CollectCudaSymbolsHelper` similar to `GetSymbolVector` so the comparison of symbols works as expected.
---
Full diff: https://github.com/llvm/llvm-project/pull/152604.diff
2 Files Affected:
- (modified) flang/lib/Evaluate/tools.cpp (+1-1)
- (modified) flang/test/Lower/CUDA/cuda-data-transfer.cuf (+18)
``````````diff
diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp
index 9c059b08dd41c..3b2c4f9f56016 100644
--- a/flang/lib/Evaluate/tools.cpp
+++ b/flang/lib/Evaluate/tools.cpp
@@ -1129,7 +1129,7 @@ struct CollectCudaSymbolsHelper : public SetTraverse<CollectCudaSymbolsHelper,
CollectCudaSymbolsHelper() : Base{*this} {}
using Base::operator();
semantics::UnorderedSymbolSet operator()(const Symbol &symbol) const {
- return {symbol};
+ return {symbol.GetUltimate()};
}
// Overload some of the operator() to filter out the symbols that are not
// of interest for CUDA data transfer logic.
diff --git a/flang/test/Lower/CUDA/cuda-data-transfer.cuf b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
index 9abf19b778690..8f8bd9b67737f 100644
--- a/flang/test/Lower/CUDA/cuda-data-transfer.cuf
+++ b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
@@ -13,6 +13,8 @@ module mod1
integer, device, dimension(11:20) :: cdev
+ real(kind=8), device, allocatable, dimension(:) :: p
+
contains
function dev1(a)
integer, device :: a(:)
@@ -456,3 +458,19 @@ end
! CHECK: %[[M:.*]]:2 = hlfir.declare %4 {data_attr = #cuf.cuda<managed>, uniq_name = "_QFsub24Em"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
! CHECK: %[[D1:.*]] = hlfir.designate %[[D]]#0 (%c1{{.*}}) : (!fir.ref<!fir.array<4xf32>>, index) -> !fir.ref<f32>
! CHECK: cuf.data_transfer %[[D1]] to %[[M]]#0 {transfer_kind = #cuf.cuda_transfer<device_device>} : !fir.ref<f32>, !fir.ref<f32>
+
+subroutine sub25()
+ use mod1
+ integer :: i
+ real(8) :: c
+
+ do i = 1, 10
+ c = c + p(i)
+ end do
+end
+
+! CHECK-LABEL: func.func @_QPsub25()
+! CHECK: fir.allocmem !fir.array<?xf64>, %15#1 {bindc_name = ".tmp", uniq_name = ""}
+! CHECK: cuf.data_transfer %{{.*}} to %{{.*}} {transfer_kind = #cuf.cuda_transfer<device_host>} : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf64>>>>, !fir.box<!fir.array<?xf64>>
+! CHECK: hlfir.assign %{{.*}} to %{{.*}} : f64, !fir.ref<f64>
+! CHECK: fir.freemem %{{.*}} : !fir.heap<!fir.array<?xf64>>
``````````
</details>
https://github.com/llvm/llvm-project/pull/152604
More information about the flang-commits
mailing list