aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhen Wang <37195552+wangzpgi@users.noreply.github.com>2025-05-21 10:55:52 -0700
committerGitHub <noreply@github.com>2025-05-21 10:55:52 -0700
commit4042a002cea6dc6f12e32953c820f6eae1ac1817 (patch)
tree76b48086b445c470d5bef7f663843f6e217c4e5a
parent0954c9d487e7cb30673df9f0ac125f71320d2936 (diff)
downloadllvm-4042a002cea6dc6f12e32953c820f6eae1ac1817.zip
llvm-4042a002cea6dc6f12e32953c820f6eae1ac1817.tar.gz
llvm-4042a002cea6dc6f12e32953c820f6eae1ac1817.tar.bz2
[flang] [cuda] implicitly set DEVICE attribute to scalars in device routines (#140834)
Scalars inside device routines also need to implicitly set the DEVICE attribute, except for function results.
-rw-r--r--flang/lib/Semantics/resolve-names.cpp2
-rw-r--r--flang/test/Lower/CUDA/cuda-shared.cuf1
-rw-r--r--flang/test/Semantics/cuf21.cuf27
3 files changed, 29 insertions, 1 deletions
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 92a3277..3f4a064 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -9376,7 +9376,7 @@ static void SetImplicitCUDADevice(bool inDeviceSubprogram, Symbol &symbol) {
if (inDeviceSubprogram && symbol.has<ObjectEntityDetails>()) {
auto *object{symbol.detailsIf<ObjectEntityDetails>()};
if (!object->cudaDataAttr() && !IsValue(symbol) &&
- (IsDummy(symbol) || object->IsArray())) {
+ !IsFunctionResult(symbol)) {
// Implicitly set device attribute if none is set in device context.
object->set_cudaDataAttr(common::CUDADataAttr::Device);
}
diff --git a/flang/test/Lower/CUDA/cuda-shared.cuf b/flang/test/Lower/CUDA/cuda-shared.cuf
index f41011d..565857f 100644
--- a/flang/test/Lower/CUDA/cuda-shared.cuf
+++ b/flang/test/Lower/CUDA/cuda-shared.cuf
@@ -9,4 +9,5 @@ end subroutine
! CHECK-LABEL: func.func @_QPsharedmem() attributes {cuf.proc_attr = #cuf.cuda_proc<global>}
! CHECK: %{{.*}} = cuf.shared_memory !fir.array<32xf32> {bindc_name = "s", uniq_name = "_QFsharedmemEs"} -> !fir.ref<!fir.array<32xf32>>
+! CHECK: cuf.free %{{.*}}#0 : !fir.ref<i32> {data_attr = #cuf.cuda<device>}
! CHECK-NOT: cuf.free
diff --git a/flang/test/Semantics/cuf21.cuf b/flang/test/Semantics/cuf21.cuf
new file mode 100644
index 0000000..b8b99a8
--- /dev/null
+++ b/flang/test/Semantics/cuf21.cuf
@@ -0,0 +1,27 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+! Test generic matching with scalars argument without device attr
+
+module mlocModule
+ interface maxlocUpdate
+ module procedure :: &
+ maxlocUpdateR_32F, &
+ maxlocUpdateR_64F
+ end interface maxlocUpdate
+contains
+
+ attributes(global) subroutine maxlocPartialMaskR_32F1D()
+ implicit none
+ real(4) :: mval
+
+ call maxlocUpdate(mval)
+
+ end subroutine maxlocPartialMaskR_32F1D
+
+ attributes(device) subroutine maxlocUpdateR_32F(mval)
+ real(4) :: mval
+ end subroutine maxlocUpdateR_32F
+
+ attributes(device) subroutine maxlocUpdateR_64F(mval)
+ real(8) :: mval
+ end subroutine maxlocUpdateR_64F
+end module