[flang-commits] [flang] [flang][cuda] Fix false positive on unsupported CUDA data transfer (PR #148295)

Valentin Clement バレンタイン クレメン via flang-commits flang-commits at lists.llvm.org
Fri Jul 11 13:50:16 PDT 2025


https://github.com/clementval created https://github.com/llvm/llvm-project/pull/148295

The switch to `GetSymbolVector` introduced a regression on detecting implicit data transfer when the rhs is a function call.
Make sure the symbol we are looking at are of interest to detect data transfer. 

>From 53de6e50fdc22123fec4516dc597557c9848fc62 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Fri, 11 Jul 2025 13:47:03 -0700
Subject: [PATCH] [flang][cuda] Fix false positive on unsupported CUDA data
 transfer

---
 flang/lib/Evaluate/tools.cpp                 | 25 ++++++++++++--------
 flang/test/Lower/CUDA/cuda-data-transfer.cuf |  8 +++++++
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp
index 3d9f06308d8c1..21e6b3c3dd50d 100644
--- a/flang/lib/Evaluate/tools.cpp
+++ b/flang/lib/Evaluate/tools.cpp
@@ -1157,23 +1157,28 @@ template semantics::UnorderedSymbolSet CollectCudaSymbols(
 bool HasCUDAImplicitTransfer(const Expr<SomeType> &expr) {
   semantics::UnorderedSymbolSet hostSymbols;
   semantics::UnorderedSymbolSet deviceSymbols;
+  semantics::UnorderedSymbolSet cudaSymbols{CollectCudaSymbols(expr)};
 
   SymbolVector symbols{GetSymbolVector(expr)};
   std::reverse(symbols.begin(), symbols.end());
   bool skipNext{false};
   for (const Symbol &sym : symbols) {
-    bool isComponent{sym.owner().IsDerivedType()};
-    bool skipComponent{false};
-    if (!skipNext) {
-      if (IsCUDADeviceSymbol(sym)) {
-        deviceSymbols.insert(sym);
-      } else if (isComponent) {
-        skipComponent = true; // Component is not device. Look on the base.
-      } else {
-        hostSymbols.insert(sym);
+    if (cudaSymbols.find(sym) != cudaSymbols.end()) {
+      bool isComponent{sym.owner().IsDerivedType()};
+      bool skipComponent{false};
+      if (!skipNext) {
+        if (IsCUDADeviceSymbol(sym)) {
+          deviceSymbols.insert(sym);
+        } else if (isComponent) {
+          skipComponent = true; // Component is not device. Look on the base.
+        } else {
+          hostSymbols.insert(sym);
+        }
       }
+      skipNext = isComponent && !skipComponent;
+    } else {
+      skipNext = false;
     }
-    skipNext = isComponent && !skipComponent;
   }
   bool hasConstant{HasConstant(expr)};
   return (hasConstant || (hostSymbols.size() > 0)) && deviceSymbols.size() > 0;
diff --git a/flang/test/Lower/CUDA/cuda-data-transfer.cuf b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
index 3a9b55996d9b1..3a4aff977b7a5 100644
--- a/flang/test/Lower/CUDA/cuda-data-transfer.cuf
+++ b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
@@ -436,3 +436,11 @@ end subroutine
 
 ! CHECK-LABEL: func.func @_QPsub22()
 ! CHECK: cuf.data_transfer
+
+subroutine sub23(n)
+  integer :: n
+  real(8), device :: d(n,n), x(n)
+  x = sum(d,dim=2) ! Was triggering Unsupported CUDA data transfer
+end subroutine
+
+! CHECK-LABEL: func.func @_QPsub23



More information about the flang-commits mailing list