[flang-commits] [flang] cfc0951 - [flang][cuda] Do not check assignment semantic in cuf kernel (#107512)

via flang-commits flang-commits at lists.llvm.org
Fri Sep 6 09:17:34 PDT 2024


Author: Valentin Clement (バレンタイン クレメン)
Date: 2024-09-06T09:17:31-07:00
New Revision: cfc095118c149d6d95a828139ed54fb34e99a3f3

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

LOG: [flang][cuda] Do not check assignment semantic in cuf kernel (#107512)

Added: 
    

Modified: 
    flang/lib/Semantics/check-cuda.cpp
    flang/lib/Semantics/check-cuda.h
    flang/test/Lower/CUDA/cuda-data-transfer.cuf

Removed: 
    


################################################################################
diff  --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp
index 60b8b3213fdb82..d8bd435bf09f38 100644
--- a/flang/lib/Semantics/check-cuda.cpp
+++ b/flang/lib/Semantics/check-cuda.cpp
@@ -565,13 +565,18 @@ void CUDAChecker::Enter(const parser::CUFKernelDoConstruct &x) {
       std::get<std::list<parser::CUFReduction>>(directive.t)) {
     CheckReduce(context_, reduce);
   }
+  inCUFKernelDoConstruct_ = true;
+}
+
+void CUDAChecker::Leave(const parser::CUFKernelDoConstruct &) {
+  inCUFKernelDoConstruct_ = false;
 }
 
 void CUDAChecker::Enter(const parser::AssignmentStmt &x) {
   auto lhsLoc{std::get<parser::Variable>(x.t).GetSource()};
   const auto &scope{context_.FindScope(lhsLoc)};
   const Scope &progUnit{GetProgramUnitContaining(scope)};
-  if (IsCUDADeviceContext(&progUnit)) {
+  if (IsCUDADeviceContext(&progUnit) || inCUFKernelDoConstruct_) {
     return; // Data transfer with assignment is only perform on host.
   }
 

diff  --git a/flang/lib/Semantics/check-cuda.h b/flang/lib/Semantics/check-cuda.h
index aa0cb46360bef5..222a2ee04b57c9 100644
--- a/flang/lib/Semantics/check-cuda.h
+++ b/flang/lib/Semantics/check-cuda.h
@@ -39,10 +39,12 @@ class CUDAChecker : public virtual BaseChecker {
   void Enter(const parser::FunctionSubprogram &);
   void Enter(const parser::SeparateModuleSubprogram &);
   void Enter(const parser::CUFKernelDoConstruct &);
+  void Leave(const parser::CUFKernelDoConstruct &);
   void Enter(const parser::AssignmentStmt &);
 
 private:
   SemanticsContext &context_;
+  bool inCUFKernelDoConstruct_ = false;
 };
 
 bool CanonicalizeCUDA(parser::Program &);

diff  --git a/flang/test/Lower/CUDA/cuda-data-transfer.cuf b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
index f189bf9b621082..bcbac9c3031423 100644
--- a/flang/test/Lower/CUDA/cuda-data-transfer.cuf
+++ b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
@@ -332,3 +332,24 @@ end subroutine
 ! CHECK: acc.serial
 ! CHECK-NOT: cuf.data_transfer
 ! CHECK: hlfir.assign
+
+! Check that cuf.data_transfer are not generated within cuf kernel and do not
+! trigger semantic error.
+subroutine sub17()
+  integer, parameter :: n = 10
+  real, device :: adev(n)
+  real, device :: bdev(n)
+  real :: ahost
+  real, managed :: b
+  integer :: i
+
+  adev = ahost
+  !$cuf kernel do <<<*,*>>>
+  do i = 1, n
+    ahost = adev(i) * bdev(i) + b
+  enddo
+end subroutine
+
+! CHECK-LABEL: func.func @_QPsub17()
+! CHECK: cuf.kernel<<<*, *>>>
+! CHECK-NOT: cuf.data_transfer


        


More information about the flang-commits mailing list