Skip to content

Commit f4eab92

Browse files
authored
[clang][OpenMP] 6.0: Add defaultmap implicit-behavior 'storage' (#158336)
First of two patches split from original defaultmap PR: #157767 Per OpenMP 6.0 specification, section 7.9.9 Argument keywords, page 291, L17 Additional information, page 291, L24-25 24 The value alloc may also be specified as implicit-behavior with identical meaning to the value 25 storage. Testing: Updated 'defaultmap' error message and codegen LIT tests to verify behavior in OpenMP 6.0.
1 parent 063d8d7 commit f4eab92

File tree

7 files changed

+47
-21
lines changed

7 files changed

+47
-21
lines changed

clang/docs/OpenMPSupport.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,8 @@ implementation.
580580
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
581581
| Changes to omp_target_is_accessible | :part:`In Progress` | :part:`In Progress` | |
582582
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
583-
583+
| defaultmap implicit-behavior 'storage' | :good:`done` | :none:`unclaimed` | https://github.com/llvm/llvm-project/pull/158336 |
584+
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
584585

585586
.. _OpenMP 6.1 implementation details:
586587

clang/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,7 @@ OpenMP Support
532532
- Fixed non-contiguous strided update in the ``omp target update`` directive with the ``from`` clause.
533533
- Properly handle array section/assumed-size array privatization in C/C++.
534534
- Added support for ``variable-category`` modifier in ``default clause``.
535+
- Added support for ``defaultmap`` directive implicit-behavior ``storage``.
535536

536537
Improvements
537538
^^^^^^^^^^^^

clang/include/clang/Basic/OpenMPKinds.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ OPENMP_DEFAULTMAP_MODIFIER(firstprivate)
137137
OPENMP_DEFAULTMAP_MODIFIER(none)
138138
OPENMP_DEFAULTMAP_MODIFIER(default)
139139
OPENMP_DEFAULTMAP_MODIFIER(present)
140+
OPENMP_DEFAULTMAP_MODIFIER(storage)
140141

141142
// Static attributes for 'depend' clause.
142143
OPENMP_DEPEND_KIND(in)

clang/lib/Basic/OpenMPKinds.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,18 @@ unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, StringRef Str,
110110
#define OPENMP_DIST_SCHEDULE_KIND(Name) .Case(#Name, OMPC_DIST_SCHEDULE_##Name)
111111
#include "clang/Basic/OpenMPKinds.def"
112112
.Default(OMPC_DIST_SCHEDULE_unknown);
113-
case OMPC_defaultmap:
114-
return llvm::StringSwitch<unsigned>(Str)
113+
case OMPC_defaultmap: {
114+
unsigned Type = llvm::StringSwitch<unsigned>(Str)
115115
#define OPENMP_DEFAULTMAP_KIND(Name) \
116116
.Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_##Name))
117117
#define OPENMP_DEFAULTMAP_MODIFIER(Name) \
118118
.Case(#Name, static_cast<unsigned>(OMPC_DEFAULTMAP_MODIFIER_##Name))
119119
#include "clang/Basic/OpenMPKinds.def"
120-
.Default(OMPC_DEFAULTMAP_unknown);
120+
.Default(OMPC_DEFAULTMAP_unknown);
121+
if (LangOpts.OpenMP < 60 && Type == OMPC_DEFAULTMAP_MODIFIER_storage)
122+
return OMPC_DEFAULTMAP_MODIFIER_unknown;
123+
return Type;
124+
}
121125
case OMPC_atomic_default_mem_order:
122126
return llvm::StringSwitch<OpenMPAtomicDefaultMemOrderClauseKind>(Str)
123127
#define OPENMP_ATOMIC_DEFAULT_MEM_ORDER_KIND(Name) \

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,8 @@ class DSAStackTy {
843843
(M == OMPC_DEFAULTMAP_MODIFIER_to) ||
844844
(M == OMPC_DEFAULTMAP_MODIFIER_from) ||
845845
(M == OMPC_DEFAULTMAP_MODIFIER_tofrom) ||
846-
(M == OMPC_DEFAULTMAP_MODIFIER_present);
846+
(M == OMPC_DEFAULTMAP_MODIFIER_present) ||
847+
(M == OMPC_DEFAULTMAP_MODIFIER_storage);
847848
}
848849
return true;
849850
}
@@ -3748,6 +3749,7 @@ getMapClauseKindFromModifier(OpenMPDefaultmapClauseModifier M,
37483749
OpenMPMapClauseKind Kind = OMPC_MAP_unknown;
37493750
switch (M) {
37503751
case OMPC_DEFAULTMAP_MODIFIER_alloc:
3752+
case OMPC_DEFAULTMAP_MODIFIER_storage:
37513753
Kind = OMPC_MAP_alloc;
37523754
break;
37533755
case OMPC_DEFAULTMAP_MODIFIER_to:
@@ -23112,8 +23114,11 @@ OMPClause *SemaOpenMP::ActOnOpenMPDefaultmapClause(
2311223114
}
2311323115
} else {
2311423116
StringRef ModifierValue =
23115-
"'alloc', 'from', 'to', 'tofrom', "
23116-
"'firstprivate', 'none', 'default', 'present'";
23117+
getLangOpts().OpenMP < 60
23118+
? "'alloc', 'from', 'to', 'tofrom', "
23119+
"'firstprivate', 'none', 'default', 'present'"
23120+
: "'storage', 'from', 'to', 'tofrom', "
23121+
"'firstprivate', 'none', 'default', 'present'";
2311723122
if (!isDefaultmapKind && isDefaultmapModifier) {
2311823123
Diag(KindLoc, diag::err_omp_unexpected_clause_value)
2311923124
<< KindValue << getOpenMPClauseNameForDiag(OMPC_defaultmap);

clang/test/OpenMP/target_defaultmap_codegen_01.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
///==========================================================================///
88
// RUN: %clang_cc1 -no-enable-noundef-analysis -DCK1 -verify -Wno-vla -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CK1
9+
// Verify implicit-behavior 'storage' as alias for 'alloc' in OpenMP 6.0
10+
// RUN: %clang_cc1 -no-enable-noundef-analysis -DCK1 -DOMP6 -verify -Wno-vla -fopenmp -fopenmp-version=60 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CK1
911
// RUN: %clang_cc1 -no-enable-noundef-analysis -DCK1 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
1012
// RUN: %clang_cc1 -no-enable-noundef-analysis -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CK1
1113
// RUN: %clang_cc1 -no-enable-noundef-analysis -DCK1 -verify -Wno-vla -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CK1
@@ -43,8 +45,12 @@ void implicit_maps_double_complex (int a){
4345
// CK1-DAG: store ptr [[PTR]], ptr [[P1]]
4446

4547
// CK1: call void [[KERNEL:@.+]](ptr [[PTR]])
46-
#pragma omp target defaultmap(alloc \
47-
: scalar)
48+
#ifdef OMP6
49+
// 'storage' is an alias for 'alloc' in OpenMP 6.0
50+
#pragma omp target defaultmap(storage : scalar)
51+
#else
52+
#pragma omp target defaultmap(alloc : scalar)
53+
#endif // OMP6
4854
{
4955
dc *= dc;
5056
}
@@ -235,6 +241,8 @@ void implicit_maps_double (int a){
235241
#endif
236242
///==========================================================================///
237243
// RUN: %clang_cc1 -no-enable-noundef-analysis -DCK5 -verify -Wno-vla -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CK5
244+
// Verify implicit-behavior 'alloc' still accepted in OpenMP 6.0
245+
// RUN: %clang_cc1 -no-enable-noundef-analysis -DCK5 -verify -Wno-vla -fopenmp -fopenmp-version=60 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CK5
238246
// RUN: %clang_cc1 -no-enable-noundef-analysis -DCK5 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
239247
// RUN: %clang_cc1 -no-enable-noundef-analysis -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CK5
240248
// RUN: %clang_cc1 -no-enable-noundef-analysis -DCK5 -verify -Wno-vla -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CK5

0 commit comments

Comments
 (0)