[flang-commits] [flang] [flang][openacc] Do not check for unlabelled CYCLE branching (PR #73839)
Valentin Clement バレンタイン クレメン via flang-commits
flang-commits at lists.llvm.org
Wed Nov 29 10:22:53 PST 2023
https://github.com/clementval created https://github.com/llvm/llvm-project/pull/73839
There is no such restriction for any OpenACC construct. This patch adds a constexpr condition on the type of Directive.
>From 44f3fa43d50fd17b5e6d60407bac9cda9e155544 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Wed, 29 Nov 2023 10:21:41 -0800
Subject: [PATCH] [flang][openacc] Do not check for unlabelled CYCLE branching
---
.../lib/Semantics/check-directive-structure.h | 33 +++++++++++--------
.../Semantics/OpenACC/acc-kernels-loop.f90 | 5 +++
flang/test/Semantics/OpenACC/acc-loop.f90 | 7 ++++
.../OpenACC/acc-parallel-loop-validity.f90 | 5 +++
.../Semantics/OpenACC/acc-serial-loop.f90 | 5 +++
5 files changed, 41 insertions(+), 14 deletions(-)
diff --git a/flang/lib/Semantics/check-directive-structure.h b/flang/lib/Semantics/check-directive-structure.h
index fec677500722e4c..b6a6b25764fa277 100644
--- a/flang/lib/Semantics/check-directive-structure.h
+++ b/flang/lib/Semantics/check-directive-structure.h
@@ -15,6 +15,7 @@
#include "flang/Common/enum-set.h"
#include "flang/Semantics/semantics.h"
#include "flang/Semantics/tools.h"
+#include <type_traits>
#include <unordered_map>
namespace Fortran::semantics {
@@ -62,20 +63,24 @@ template <typename D> class NoBranchingEnforce {
if (const auto &cycleName{cycleStmt.v}) {
CheckConstructNameBranching("CYCLE", cycleName.value());
} else {
- switch ((llvm::omp::Directive)currentDirective_) {
- // exclude directives which do not need a check for unlabelled CYCLES
- case llvm::omp::Directive::OMPD_do:
- case llvm::omp::Directive::OMPD_simd:
- case llvm::omp::Directive::OMPD_parallel_do:
- case llvm::omp::Directive::OMPD_parallel_do_simd:
- case llvm::omp::Directive::OMPD_distribute_parallel_do:
- case llvm::omp::Directive::OMPD_distribute_parallel_do_simd:
- case llvm::omp::Directive::OMPD_distribute_parallel_for:
- case llvm::omp::Directive::OMPD_distribute_simd:
- case llvm::omp::Directive::OMPD_distribute_parallel_for_simd:
- return;
- default:
- break;
+ if constexpr (std::is_same_v<D, llvm::omp::Directive>) {
+ switch ((llvm::omp::Directive)currentDirective_) {
+ // exclude directives which do not need a check for unlabelled CYCLES
+ case llvm::omp::Directive::OMPD_do:
+ case llvm::omp::Directive::OMPD_simd:
+ case llvm::omp::Directive::OMPD_parallel_do:
+ case llvm::omp::Directive::OMPD_parallel_do_simd:
+ case llvm::omp::Directive::OMPD_distribute_parallel_do:
+ case llvm::omp::Directive::OMPD_distribute_parallel_do_simd:
+ case llvm::omp::Directive::OMPD_distribute_parallel_for:
+ case llvm::omp::Directive::OMPD_distribute_simd:
+ case llvm::omp::Directive::OMPD_distribute_parallel_for_simd:
+ return;
+ default:
+ break;
+ }
+ } else if constexpr (std::is_same_v<D, llvm::acc::Directive>) {
+ return; // OpenACC construct do not need check for unlabelled CYCLES
}
CheckConstructNameBranching("CYCLE");
}
diff --git a/flang/test/Semantics/OpenACC/acc-kernels-loop.f90 b/flang/test/Semantics/OpenACC/acc-kernels-loop.f90
index 1a280f7c54f5cd3..8653978fb6249db 100644
--- a/flang/test/Semantics/OpenACC/acc-kernels-loop.f90
+++ b/flang/test/Semantics/OpenACC/acc-kernels-loop.f90
@@ -290,4 +290,9 @@ program openacc_kernels_loop_validity
a(i) = 3.14
end do
+ !$acc parallel loop
+ do i = 1, N
+ if(i == 10) cycle
+ end do
+
end program openacc_kernels_loop_validity
diff --git a/flang/test/Semantics/OpenACC/acc-loop.f90 b/flang/test/Semantics/OpenACC/acc-loop.f90
index ee1e6e0cce09740..f5d1e501a2b329d 100644
--- a/flang/test/Semantics/OpenACC/acc-loop.f90
+++ b/flang/test/Semantics/OpenACC/acc-loop.f90
@@ -276,4 +276,11 @@ program openacc_loop_validity
end do
end do
+ !$acc parallel
+ !$acc loop
+ do i = 1, n
+ if(i == 10) cycle
+ end do
+ !$acc end parallel
+
end program openacc_loop_validity
diff --git a/flang/test/Semantics/OpenACC/acc-parallel-loop-validity.f90 b/flang/test/Semantics/OpenACC/acc-parallel-loop-validity.f90
index b0be7d31e4426da..7f33f9e145110c4 100644
--- a/flang/test/Semantics/OpenACC/acc-parallel-loop-validity.f90
+++ b/flang/test/Semantics/OpenACC/acc-parallel-loop-validity.f90
@@ -136,4 +136,9 @@ program openacc_parallel_loop_validity
reduction_l = d(i) .neqv. e(i)
end do
+ !$acc parallel loop
+ do i = 1, N
+ if(i == 10) cycle
+ end do
+
end program openacc_parallel_loop_validity
diff --git a/flang/test/Semantics/OpenACC/acc-serial-loop.f90 b/flang/test/Semantics/OpenACC/acc-serial-loop.f90
index bef117b71f9312f..2832274680eca38 100644
--- a/flang/test/Semantics/OpenACC/acc-serial-loop.f90
+++ b/flang/test/Semantics/OpenACC/acc-serial-loop.f90
@@ -106,4 +106,9 @@ program openacc_serial_loop_validity
end do
!$acc end serial
+ !$acc serial loop
+ do i = 1, n
+ if(i == 10) cycle
+ end do
+
end program openacc_serial_loop_validity
More information about the flang-commits
mailing list