Skip to content

Commit f94d8ac

Browse files
committed
[clang][OpenMP] 6.0: Add default clause support for 'target' directive
Per OpenMP 6.0 specification, section 7.5.1, default Clause Page 224, lines 3-5 default Clause, Semantics If data-sharing-attribute is shared then the clause has no effect on a target construct; otherwise, its effect on a target construct is equivalent to specifying the defaultmap clause with the same data-sharing-attribute and variable-category. Testing: OpenMP LIT tests check-all
1 parent 6ad662d commit f94d8ac

File tree

4 files changed

+1605
-15
lines changed

4 files changed

+1605
-15
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,7 @@ OpenMP Support
635635
- Added support for ``defaultmap`` directive implicit-behavior ``private``.
636636
- Added parsing and semantic analysis support for ``groupprivate`` directive.
637637
- Added support for 'omp fuse' directive.
638+
- Added support for ``default`` clause on ``target`` directive.
638639

639640
Improvements
640641
^^^^^^^^^^^^

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 71 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17297,6 +17297,43 @@ OMPClause *SemaOpenMP::ActOnOpenMPSimpleClause(
1729717297
return Res;
1729817298
}
1729917299

17300+
static std::pair<OpenMPDefaultmapClauseModifier, OpenMPDefaultmapClauseKind>
17301+
getDefaultmapModifierAndKind(llvm::omp::DefaultKind M,
17302+
OpenMPDefaultClauseVariableCategory VCKind) {
17303+
OpenMPDefaultmapClauseModifier DefMapMod;
17304+
OpenMPDefaultmapClauseKind DefMapKind;
17305+
switch (M) {
17306+
case OMP_DEFAULT_none:
17307+
DefMapMod = OMPC_DEFAULTMAP_MODIFIER_none;
17308+
break;
17309+
case OMP_DEFAULT_firstprivate:
17310+
DefMapMod = OMPC_DEFAULTMAP_MODIFIER_firstprivate;
17311+
break;
17312+
case OMP_DEFAULT_private:
17313+
DefMapMod = OMPC_DEFAULTMAP_MODIFIER_private;
17314+
break;
17315+
default:
17316+
llvm_unreachable("unexpected DSA in OpenMP default clause");
17317+
}
17318+
switch (VCKind) {
17319+
case OMPC_DEFAULT_VC_aggregate:
17320+
DefMapKind = OMPC_DEFAULTMAP_aggregate;
17321+
break;
17322+
case OMPC_DEFAULT_VC_pointer:
17323+
DefMapKind = OMPC_DEFAULTMAP_pointer;
17324+
break;
17325+
case OMPC_DEFAULT_VC_scalar:
17326+
DefMapKind = OMPC_DEFAULTMAP_scalar;
17327+
break;
17328+
case OMPC_DEFAULT_VC_all:
17329+
DefMapKind = OMPC_DEFAULTMAP_all;
17330+
break;
17331+
default:
17332+
llvm_unreachable("unexpected variable category in OpenMP default clause");
17333+
}
17334+
return std::make_pair(DefMapMod, DefMapKind);
17335+
}
17336+
1730017337
OMPClause *SemaOpenMP::ActOnOpenMPDefaultClause(
1730117338
llvm::omp::DefaultKind M, SourceLocation MLoc,
1730217339
OpenMPDefaultClauseVariableCategory VCKind, SourceLocation VCKindLoc,
@@ -17309,21 +17346,40 @@ OMPClause *SemaOpenMP::ActOnOpenMPDefaultClause(
1730917346
return nullptr;
1731017347
}
1731117348

17312-
switch (M) {
17313-
case OMP_DEFAULT_none:
17314-
DSAStack->setDefaultDSANone(MLoc);
17315-
break;
17316-
case OMP_DEFAULT_shared:
17317-
DSAStack->setDefaultDSAShared(MLoc);
17318-
break;
17319-
case OMP_DEFAULT_firstprivate:
17320-
DSAStack->setDefaultDSAFirstPrivate(MLoc);
17321-
break;
17322-
case OMP_DEFAULT_private:
17323-
DSAStack->setDefaultDSAPrivate(MLoc);
17324-
break;
17325-
default:
17326-
llvm_unreachable("DSA unexpected in OpenMP default clause");
17349+
if (getLangOpts().OpenMP >= 60 &&
17350+
DSAStack->getCurrentDirective() == OMPD_target) {
17351+
// OpenMP 6.0 (see page 224, lines 3-5) default Clause, Semantics
17352+
// If data-sharing-attribute is shared then the clause has no effect
17353+
// on a target construct; otherwise, its effect on a target construct is
17354+
// equivalent to specifying the defaultmap clause with the same
17355+
// data-sharing-attribute and variable-category.
17356+
if (M != OMP_DEFAULT_shared) {
17357+
auto [DefMapMod, DefMapKind] = getDefaultmapModifierAndKind(M, VCKind);
17358+
if (DefMapKind == OMPC_DEFAULTMAP_all) {
17359+
DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_aggregate, MLoc);
17360+
DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_scalar, MLoc);
17361+
DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_pointer, MLoc);
17362+
} else {
17363+
DSAStack->setDefaultDMAAttr(DefMapMod, DefMapKind, MLoc);
17364+
}
17365+
}
17366+
} else {
17367+
switch (M) {
17368+
case OMP_DEFAULT_none:
17369+
DSAStack->setDefaultDSANone(MLoc);
17370+
break;
17371+
case OMP_DEFAULT_shared:
17372+
DSAStack->setDefaultDSAShared(MLoc);
17373+
break;
17374+
case OMP_DEFAULT_firstprivate:
17375+
DSAStack->setDefaultDSAFirstPrivate(MLoc);
17376+
break;
17377+
case OMP_DEFAULT_private:
17378+
DSAStack->setDefaultDSAPrivate(MLoc);
17379+
break;
17380+
default:
17381+
llvm_unreachable("DSA unexpected in OpenMP default clause");
17382+
}
1732717383
}
1732817384

1732917385
switch (VCKind) {

0 commit comments

Comments
 (0)