[flang-commits] [flang] e3dafa8 - [flang][cuda] Allow GOTO, EXIT, CYCLE and SELECT CASE in device procedures (#121612)
via flang-commits
flang-commits at lists.llvm.org
Fri Jan 3 17:35:45 PST 2025
Author: Valentin Clement (バレンタイン クレメン)
Date: 2025-01-03T17:35:41-08:00
New Revision: e3dafa88a8f651825ac65aad9b273983598279dd
URL: https://github.com/llvm/llvm-project/commit/e3dafa88a8f651825ac65aad9b273983598279dd
DIFF: https://github.com/llvm/llvm-project/commit/e3dafa88a8f651825ac65aad9b273983598279dd.diff
LOG: [flang][cuda] Allow GOTO, EXIT, CYCLE and SELECT CASE in device procedures (#121612)
Added:
Modified:
flang/lib/Semantics/check-cuda.cpp
flang/test/Semantics/cuf09.cuf
Removed:
################################################################################
diff --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp
index d497ac20e7017b..d8a5639227648f 100644
--- a/flang/lib/Semantics/check-cuda.cpp
+++ b/flang/lib/Semantics/check-cuda.cpp
@@ -302,6 +302,14 @@ template <bool IsCUFKernelDo> class DeviceContextChecker {
[&](const common::Indirection<parser::IfConstruct> &x) {
Check(x.value());
},
+ [&](const common::Indirection<parser::CaseConstruct> &x) {
+ const auto &caseList{
+ std::get<std::list<parser::CaseConstruct::Case>>(
+ x.value().t)};
+ for (const parser::CaseConstruct::Case &c : caseList) {
+ Check(std::get<parser::Block>(c.t));
+ }
+ },
[&](const auto &x) {
if (auto source{parser::GetSource(x)}) {
context_.Say(*source,
@@ -347,9 +355,24 @@ template <bool IsCUFKernelDo> class DeviceContextChecker {
hostArray->name());
}
}
+ void ErrorInCUFKernel(parser::CharBlock source) {
+ if (IsCUFKernelDo) {
+ context_.Say(
+ source, "Statement may not appear in cuf kernel code"_err_en_US);
+ }
+ }
void Check(const parser::ActionStmt &stmt, const parser::CharBlock &source) {
common::visit(
common::visitors{
+ [&](const common::Indirection<parser::CycleStmt> &) {
+ ErrorInCUFKernel(source);
+ },
+ [&](const common::Indirection<parser::ExitStmt> &) {
+ ErrorInCUFKernel(source);
+ },
+ [&](const common::Indirection<parser::GotoStmt> &) {
+ ErrorInCUFKernel(source);
+ },
[&](const common::Indirection<parser::StopStmt> &) { return; },
[&](const common::Indirection<parser::PrintStmt> &) {},
[&](const common::Indirection<parser::WriteStmt> &x) {
diff --git a/flang/test/Semantics/cuf09.cuf b/flang/test/Semantics/cuf09.cuf
index 3307e2a8626729..06c9070fcbcd00 100644
--- a/flang/test/Semantics/cuf09.cuf
+++ b/flang/test/Semantics/cuf09.cuf
@@ -54,6 +54,59 @@ module m
print*,threadIdx%x
stop ! ok
end subroutine
+
+ attributes(global) subroutine cycletest()
+ integer :: i
+ do i = 1, 10
+ cycle ! ok
+ end do
+ end subroutine
+
+ attributes(global) subroutine gototest()
+ integer :: i
+ goto 10
+ 10 print *, "X is negative!"
+ end subroutine
+
+ attributes(global) subroutine exittest()
+ integer :: i
+ do i = 1, 10
+ if (i == 1) then
+ exit ! ok
+ end if
+ end do
+ end subroutine
+
+ attributes(global) subroutine selectcasetest()
+ integer :: i
+ select case(i)
+ case (1)
+ print*,'main'
+ case default
+ print*, 'default'
+ end select
+ end subroutine
+
+ subroutine host()
+ integer :: i
+ !$cuf kernel do
+ do i = 1, 10
+ !ERROR: Statement may not appear in cuf kernel code
+ cycle
+ end do
+
+ !$cuf kernel do
+ do i = 1, 10
+ if (i == 1) then
+ !ERROR: Statement may not appear in cuf kernel code
+ exit ! ok
+ end if
+
+ !ERROR: Statement may not appear in cuf kernel code
+ goto 10
+ 10 print *, "X is negative!"
+ end do
+ end subroutine
end
program main
More information about the flang-commits
mailing list