[flang-commits] [flang] [flang][cuf] Avoid generating data transfer when calling size intrinsic (PR #108081)
Valentin Clement バレンタイン クレメン via flang-commits
flang-commits at lists.llvm.org
Tue Sep 10 13:26:16 PDT 2024
https://github.com/clementval created https://github.com/llvm/llvm-project/pull/108081
cuf.data_transfer was wrongly generated when calling the `size` intrinsic on a device allocatable variable. Since the descriptor is available on the host, there is no transfer needed.
Add `DescriptorInquiry` in the `CollectCudaSymbolsHelper` to filter out symbols that are not needed for the transfer decision to be made.
>From 421f08b78a81f6345256d7c17febb39de6cf3516 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Tue, 10 Sep 2024 13:23:52 -0700
Subject: [PATCH] [flang][cuf] Avoid generating data transfer when calling size
intrinsic
---
flang/lib/Evaluate/tools.cpp | 3 +++
flang/test/Lower/CUDA/cuda-data-transfer.cuf | 10 ++++++++++
2 files changed, 13 insertions(+)
diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp
index 6b3db619c1e2f1..400f27aef98da6 100644
--- a/flang/lib/Evaluate/tools.cpp
+++ b/flang/lib/Evaluate/tools.cpp
@@ -1011,6 +1011,9 @@ struct CollectCudaSymbolsHelper : public SetTraverse<CollectCudaSymbolsHelper,
}
// Overload some of the operator() to filter out the symbols that are not
// of interest for CUDA data transfer logic.
+ semantics::UnorderedSymbolSet operator()(const DescriptorInquiry &) const {
+ return {};
+ }
semantics::UnorderedSymbolSet operator()(const Subscript &) const {
return {};
}
diff --git a/flang/test/Lower/CUDA/cuda-data-transfer.cuf b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
index bcbac9c3031423..11f1f33d7cb587 100644
--- a/flang/test/Lower/CUDA/cuda-data-transfer.cuf
+++ b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
@@ -353,3 +353,13 @@ end subroutine
! CHECK-LABEL: func.func @_QPsub17()
! CHECK: cuf.kernel<<<*, *>>>
! CHECK-NOT: cuf.data_transfer
+
+subroutine sub18()
+ integer, device, allocatable :: a(:)
+ integer :: isz
+
+ isz = size(a)
+end subroutine
+
+! CHECK-LABEL: func.func @_QPsub18()
+! CHECK-NOT: cuf.data_transfer
More information about the flang-commits
mailing list