[clang] [clang][OpenMP] Use leaf constructs in `mapLoopConstruct` (PR #97446)

Krzysztof Parzyszek via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 2 13:01:50 PDT 2024


https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/97446

>From 316d5a11bd7f6afb99cd7d25baf43ec2679561dc Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Mon, 1 Jul 2024 15:18:07 -0500
Subject: [PATCH 1/2] [clang][OpenMP] Use leaf constructs in `mapLoopConstruct`

This removes mentions of specific combined directives.

Also, add a quote from the OpenMP spec to explain the code dealing
with the `bind` clause.
---
 clang/lib/Sema/SemaOpenMP.cpp | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 86666f064f35d..ca7e8acd1c15a 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -6270,16 +6270,20 @@ bool SemaOpenMP::mapLoopConstruct(
     if (BindKind == OMPC_BIND_unknown) {
       // Setting the enclosing teams or parallel construct for the loop
       // directive without bind clause.
+      // [5.0:129:25-28] If the bind clause is not present on the construct and
+      // the loop construct is closely nested inside a teams or parallel
+      // construct, the binding region is the corresponding teams or parallel
+      // region. If none of those conditions hold, the binding region is not
+      // defined.
       BindKind = OMPC_BIND_thread; // Default bind(thread) if binding is unknown
+      auto ParentLeafs = getLeafConstructsOrSelf(ParentDirective);
 
       if (ParentDirective == OMPD_unknown) {
         Diag(DSAStack->getDefaultDSALocation(),
              diag::err_omp_bind_required_on_loop);
-      } else if (ParentDirective == OMPD_parallel ||
-                 ParentDirective == OMPD_target_parallel) {
+      } else if (ParentLeafs.back() == OMPD_parallel) {
         BindKind = OMPC_BIND_parallel;
-      } else if (ParentDirective == OMPD_teams ||
-                 ParentDirective == OMPD_target_teams) {
+      } else if (ParentLeafs.back() == OMPD_teams) {
         BindKind = OMPC_BIND_teams;
       }
     } else {

>From c238054d3dbb3a9c5d6d737e3f8f10f3f67f4548 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Tue, 2 Jul 2024 15:01:25 -0500
Subject: [PATCH 2/2] Expand auto

---
 clang/lib/Sema/SemaOpenMP.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index ca7e8acd1c15a..5fde4f67b4fd9 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -6276,7 +6276,8 @@ bool SemaOpenMP::mapLoopConstruct(
       // region. If none of those conditions hold, the binding region is not
       // defined.
       BindKind = OMPC_BIND_thread; // Default bind(thread) if binding is unknown
-      auto ParentLeafs = getLeafConstructsOrSelf(ParentDirective);
+      ArrayRef<OpenMPDirectiveKind> ParentLeafs =
+          getLeafConstructsOrSelf(ParentDirective);
 
       if (ParentDirective == OMPD_unknown) {
         Diag(DSAStack->getDefaultDSALocation(),



More information about the cfe-commits mailing list