[flang-commits] [flang] bfa6ded - [flang][cuda] Do managed array initialization on the device (#182171)

via flang-commits flang-commits at lists.llvm.org
Wed Feb 18 15:53:50 PST 2026


Author: Valentin Clement (バレンタイン クレメン)
Date: 2026-02-18T15:53:45-08:00
New Revision: bfa6ded81afc2e532b8e9a46e1927acf3ae484a9

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

LOG: [flang][cuda] Do managed array initialization on the device (#182171)

Added: 
    

Modified: 
    flang/include/flang/Evaluate/tools.h
    flang/test/Lower/CUDA/cuda-data-transfer.cuf

Removed: 
    


################################################################################
diff  --git a/flang/include/flang/Evaluate/tools.h b/flang/include/flang/Evaluate/tools.h
index 0776a0afb4d92..0fded08456bcf 100644
--- a/flang/include/flang/Evaluate/tools.h
+++ b/flang/include/flang/Evaluate/tools.h
@@ -1349,6 +1349,11 @@ inline bool IsCUDADataTransfer(const A &lhs, const B &rhs) {
   int rhsNbManagedSymbols{GetNbOfCUDAManagedOrUnifiedSymbols(rhs)};
   int rhsNbSymbols{GetNbOfCUDADeviceSymbols(rhs)};
 
+  if (lhsNbManagedSymbols >= 1 && lhs.Rank() > 0 && rhsNbSymbols == 0 &&
+      rhsNbManagedSymbols == 0 && (IsVariable(rhs) || IsConstantExpr(rhs))) {
+    return true; // Managed arrays initialization is performed on the device.
+  }
+
   // Special cases performed on the host:
   // - Only managed or unifed symbols are involved on RHS and LHS.
   // - LHS is managed or unified and the RHS is host only.

diff  --git a/flang/test/Lower/CUDA/cuda-data-transfer.cuf b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
index 4e96a350a61f3..9da766157f7ea 100644
--- a/flang/test/Lower/CUDA/cuda-data-transfer.cuf
+++ b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
@@ -604,3 +604,15 @@ end subroutine
 ! CHECK: cuf.alloc !fir.box<!fir.heap<!fir.array<?x!fir.type<_QFsub31Tt30{q:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>> 
 ! CHECK: hlfir.assign 
 ! CHECK-NOT: cuf.data_transfer
+
+subroutine sub32()
+  integer, managed :: adev(10)
+  integer :: a
+
+  adev = a
+
+  adev = 0
+end subroutine
+
+! CHECK-LABEL: func.func @_QPsub32() 
+! CHECK-COUNT-2: cuf.data_transfer


        


More information about the flang-commits mailing list