[flang-commits] [flang] [llvm] [flang][OpenMP] Add semantic check for target data (PR #71560)
via flang-commits
flang-commits at lists.llvm.org
Tue Nov 7 09:25:17 PST 2023
https://github.com/shraiysh created https://github.com/llvm/llvm-project/pull/71560
This patch adds the following semantic check on target data
```
At least one map, use_device_addr or use_device_ptr clause must appear
on the target data directive.
```
>From 47d08655bf48816d022cd605805b3564d71c8172 Mon Sep 17 00:00:00 2001
From: Shraiysh Vaishay <shraiysh.vaishay at amd.com>
Date: Tue, 7 Nov 2023 11:09:50 -0600
Subject: [PATCH] [flang][OpenMP] Add semantic check for target data
This patch adds the following semantic check on target data
```
At least one map, use_device_addr or use_device_ptr clause must appear
on the target data directive.
```
---
flang/lib/Semantics/check-omp-structure.cpp | 16 ++++++++++++++++
flang/lib/Semantics/check-omp-structure.h | 1 +
.../test/Semantics/OpenMP/device-constructs.f90 | 2 +-
llvm/include/llvm/Frontend/OpenMP/OMP.td | 6 ++----
4 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index d7a0681d1c3d476..1b6b38d0e972d0d 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -919,12 +919,28 @@ void OmpStructureChecker::ChecksOnOrderedAsBlock() {
}
}
+void OmpStructureChecker::CheckTargetData() {
+ const parser::OmpClause *mapClause = FindClause(llvm::omp::Clause::OMPC_map);
+ const parser::OmpClause *useDevicePtrClause =
+ FindClause(llvm::omp::Clause::OMPC_use_device_ptr);
+ const parser::OmpClause *useDeviceAddrClause =
+ FindClause(llvm::omp::OMPC_use_device_addr);
+ if (!mapClause && !useDevicePtrClause && !useDeviceAddrClause) {
+ context_.Say(GetContext().directiveSource,
+ "At least one MAP, USE_DEVICE_ADDR or USE_DEVICE_PTR clause must "
+ "appear on the TARGET DATA directive."_err_en_US);
+ }
+}
+
void OmpStructureChecker::Leave(const parser::OmpBeginBlockDirective &) {
switch (GetContext().directive) {
case llvm::omp::Directive::OMPD_ordered:
// [5.1] 2.19.9 Ordered Construct Restriction
ChecksOnOrderedAsBlock();
break;
+ case llvm::omp::Directive::OMPD_target_data:
+ CheckTargetData();
+ return;
default:
break;
}
diff --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h
index d35602cca75d549..5c80c1ea8a2d23e 100644
--- a/flang/lib/Semantics/check-omp-structure.h
+++ b/flang/lib/Semantics/check-omp-structure.h
@@ -184,6 +184,7 @@ class OmpStructureChecker
void CheckSIMDNest(const parser::OpenMPConstruct &x);
void CheckTargetNest(const parser::OpenMPConstruct &x);
void CheckTargetUpdate();
+ void CheckTargetData();
void CheckCancellationNest(
const parser::CharBlock &source, const parser::OmpCancelType::Type &type);
std::int64_t GetOrdCollapseLevel(const parser::OpenMPLoopConstruct &x);
diff --git a/flang/test/Semantics/OpenMP/device-constructs.f90 b/flang/test/Semantics/OpenMP/device-constructs.f90
index 51f00700b6daf74..a18d99d7c368b64 100644
--- a/flang/test/Semantics/OpenMP/device-constructs.f90
+++ b/flang/test/Semantics/OpenMP/device-constructs.f90
@@ -135,7 +135,7 @@ program main
enddo
!$omp end target data
- !ERROR: At least one of MAP clause must appear on the TARGET DATA directive
+ !ERROR: At least one MAP, USE_DEVICE_ADDR or USE_DEVICE_PTR clause must appear on the TARGET DATA directive.
!$omp target data device(0)
do i = 1, N
a = 3.14
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td
index f8b3b0c7524979b..79211976c0270c1 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -705,15 +705,13 @@ def OMP_Nothing : Directive<"nothing"> {}
def OMP_TargetData : Directive<"target data"> {
let allowedClauses = [
VersionedClause<OMPC_UseDevicePtr>,
- VersionedClause<OMPC_UseDeviceAddr, 50>
+ VersionedClause<OMPC_UseDeviceAddr, 50>,
+ VersionedClause<OMPC_Map>
];
let allowedOnceClauses = [
VersionedClause<OMPC_Device>,
VersionedClause<OMPC_If>
];
- let requiredClauses = [
- VersionedClause<OMPC_Map>
- ];
}
def OMP_TargetEnterData : Directive<"target enter data"> {
let allowedClauses = [
More information about the flang-commits
mailing list