[flang-commits] [flang] [flang][cuda] Fix crash in semantic (PR #88577)
Valentin Clement バレンタイン クレメン via flang-commits
flang-commits at lists.llvm.org
Fri Apr 12 14:02:02 PDT 2024
Valentin Clement =?utf-8?b?KOODkOODrOODsw=?Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/88577 at github.com>
https://github.com/clementval updated https://github.com/llvm/llvm-project/pull/88577
>From e1223e3ae18e78d506db16d76e1993e5068621cd Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Fri, 12 Apr 2024 13:56:06 -0700
Subject: [PATCH 1/2] [flang][cuda] Fix crash in semantic
---
flang/lib/Semantics/check-cuda.cpp | 7 ++++++-
flang/test/Semantics/cuf11.cuf | 12 ++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp
index e0a796972441ba..49679c1a9304f3 100644
--- a/flang/lib/Semantics/check-cuda.cpp
+++ b/flang/lib/Semantics/check-cuda.cpp
@@ -480,10 +480,15 @@ void CUDAChecker::Enter(const parser::CUFKernelDoConstruct &x) {
}
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))
+ return; // Data transfer with assignment is only perform on host.
+
const evaluate::Assignment *assign{semantics::GetAssignment(x)};
int nbLhs{evaluate::GetNbOfCUDASymbols(assign->lhs)};
int nbRhs{evaluate::GetNbOfCUDASymbols(assign->rhs)};
- auto lhsLoc{std::get<parser::Variable>(x.t).GetSource()};
// device to host transfer with more than one device object on the rhs is not
// legal.
diff --git a/flang/test/Semantics/cuf11.cuf b/flang/test/Semantics/cuf11.cuf
index 96108e2b245560..b915c7246ed947 100644
--- a/flang/test/Semantics/cuf11.cuf
+++ b/flang/test/Semantics/cuf11.cuf
@@ -1,5 +1,17 @@
! RUN: %python %S/test_errors.py %s %flang_fc1
+module mod1
+contains
+ attributes(global) subroutine sub1(adev)
+ real :: adev(10)
+ integer :: tid
+ tid = threadIdx%x
+! Use to crash the compiler. Make sure we have the proper semantic error.
+!ERROR: Actual argument for 'i=' has bad type 'REAL(4)'
+ adev(tid + 1) = scale(real(tid), 2.0)
+ end subroutine sub1
+end module
+
subroutine sub1()
real, device :: adev(10), bdev(10)
real :: ahost(10)
>From 5b9105c6e04a4d671e45b694bf9d0529ea5e3147 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Valentin=20Clement=20=28=E3=83=90=E3=83=AC=E3=83=B3?=
=?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=B3=20=E3=82=AF=E3=83=AC=E3=83=A1?=
=?UTF-8?q?=E3=83=B3=29?= <clementval at gmail.com>
Date: Fri, 12 Apr 2024 14:01:57 -0700
Subject: [PATCH 2/2] Add brace
---
flang/lib/Semantics/check-cuda.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp
index 49679c1a9304f3..2cb15437a235ae 100644
--- a/flang/lib/Semantics/check-cuda.cpp
+++ b/flang/lib/Semantics/check-cuda.cpp
@@ -483,8 +483,9 @@ 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)) {
return; // Data transfer with assignment is only perform on host.
+ }
const evaluate::Assignment *assign{semantics::GetAssignment(x)};
int nbLhs{evaluate::GetNbOfCUDASymbols(assign->lhs)};
More information about the flang-commits
mailing list