Skip to content

Commit 9fac225

Browse files
authored
[clang][OpenMP] 6.0: Add default clause support for 'target' directive (#162910)
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 4c3e032 commit 9fac225

File tree

5 files changed

+2115
-36
lines changed

5 files changed

+2115
-36
lines changed

clang/docs/OpenMPSupport.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,7 @@ implementation.
559559
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
560560
| Clarifications to Fortran map semantics | :none:`unclaimed` | :none:`unclaimed` | |
561561
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
562-
| default clause at target construct | :part:`In Progress` | :none:`unclaimed` | |
562+
| default clause at target construct | :good:`done` | :none:`unclaimed` | https://github.com/llvm/llvm-project/pull/162910 |
563563
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
564564
| ref count update use_device_{ptr, addr} | :none:`unclaimed` | :none:`unclaimed` | |
565565
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+

clang/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,7 @@ OpenMP Support
725725
- Added support for 'omp fuse' directive.
726726
- Updated parsing and semantic analysis support for ``nowait`` clause to accept
727727
optional argument in OpenMP >= 60.
728+
- Added support for ``default`` clause on ``target`` directive.
728729

729730
Improvements
730731
^^^^^^^^^^^^

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 91 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17319,45 +17319,101 @@ OMPClause *SemaOpenMP::ActOnOpenMPDefaultClause(
1731917319
<< getOpenMPClauseNameForDiag(OMPC_default);
1732017320
return nullptr;
1732117321
}
17322-
17323-
switch (M) {
17324-
case OMP_DEFAULT_none:
17325-
DSAStack->setDefaultDSANone(MLoc);
17326-
break;
17327-
case OMP_DEFAULT_shared:
17328-
DSAStack->setDefaultDSAShared(MLoc);
17329-
break;
17330-
case OMP_DEFAULT_firstprivate:
17331-
DSAStack->setDefaultDSAFirstPrivate(MLoc);
17332-
break;
17333-
case OMP_DEFAULT_private:
17334-
DSAStack->setDefaultDSAPrivate(MLoc);
17335-
break;
17336-
default:
17337-
llvm_unreachable("DSA unexpected in OpenMP default clause");
17338-
}
17339-
17340-
switch (VCKind) {
17341-
case OMPC_DEFAULT_VC_aggregate:
17342-
DSAStack->setDefaultDSAVCAggregate(VCKindLoc);
17343-
break;
17344-
case OMPC_DEFAULT_VC_all:
17345-
DSAStack->setDefaultDSAVCAll(VCKindLoc);
17346-
break;
17347-
case OMPC_DEFAULT_VC_allocatable:
17348-
DSAStack->setDefaultDSAVCAllocatable(VCKindLoc);
17349-
break;
17350-
case OMPC_DEFAULT_VC_pointer:
17351-
DSAStack->setDefaultDSAVCPointer(VCKindLoc);
17352-
break;
17353-
case OMPC_DEFAULT_VC_scalar:
17354-
DSAStack->setDefaultDSAVCScalar(VCKindLoc);
17355-
break;
17356-
default:
17322+
if (VCKind == OMPC_DEFAULT_VC_unknown) {
1735717323
Diag(VCKindLoc, diag::err_omp_default_vc)
1735817324
<< getOpenMPSimpleClauseTypeName(OMPC_default, unsigned(M));
17325+
return nullptr;
1735917326
}
1736017327

17328+
bool IsTargetDefault =
17329+
getLangOpts().OpenMP >= 60 &&
17330+
isOpenMPTargetExecutionDirective(DSAStack->getCurrentDirective());
17331+
17332+
// OpenMP 6.0, page 224, lines 3-4 default Clause, Semantics
17333+
// If data-sharing-attribute is shared then the clause has no effect
17334+
// on a target construct;
17335+
if (IsTargetDefault && M == OMP_DEFAULT_shared)
17336+
return nullptr;
17337+
17338+
auto SetDefaultClauseAttrs = [&](llvm::omp::DefaultKind M,
17339+
OpenMPDefaultClauseVariableCategory VCKind) {
17340+
OpenMPDefaultmapClauseModifier DefMapMod;
17341+
OpenMPDefaultmapClauseKind DefMapKind;
17342+
// default data-sharing-attribute
17343+
switch (M) {
17344+
case OMP_DEFAULT_none:
17345+
if (IsTargetDefault)
17346+
DefMapMod = OMPC_DEFAULTMAP_MODIFIER_none;
17347+
else
17348+
DSAStack->setDefaultDSANone(MLoc);
17349+
break;
17350+
case OMP_DEFAULT_firstprivate:
17351+
if (IsTargetDefault)
17352+
DefMapMod = OMPC_DEFAULTMAP_MODIFIER_firstprivate;
17353+
else
17354+
DSAStack->setDefaultDSAFirstPrivate(MLoc);
17355+
break;
17356+
case OMP_DEFAULT_private:
17357+
if (IsTargetDefault)
17358+
DefMapMod = OMPC_DEFAULTMAP_MODIFIER_private;
17359+
else
17360+
DSAStack->setDefaultDSAPrivate(MLoc);
17361+
break;
17362+
case OMP_DEFAULT_shared:
17363+
assert(!IsTargetDefault && "DSA shared invalid with target directive");
17364+
DSAStack->setDefaultDSAShared(MLoc);
17365+
break;
17366+
default:
17367+
llvm_unreachable("unexpected DSA in OpenMP default clause");
17368+
}
17369+
// default variable-category
17370+
switch (VCKind) {
17371+
case OMPC_DEFAULT_VC_aggregate:
17372+
if (IsTargetDefault)
17373+
DefMapKind = OMPC_DEFAULTMAP_aggregate;
17374+
else
17375+
DSAStack->setDefaultDSAVCAggregate(VCKindLoc);
17376+
break;
17377+
case OMPC_DEFAULT_VC_pointer:
17378+
if (IsTargetDefault)
17379+
DefMapKind = OMPC_DEFAULTMAP_pointer;
17380+
else
17381+
DSAStack->setDefaultDSAVCPointer(VCKindLoc);
17382+
break;
17383+
case OMPC_DEFAULT_VC_scalar:
17384+
if (IsTargetDefault)
17385+
DefMapKind = OMPC_DEFAULTMAP_scalar;
17386+
else
17387+
DSAStack->setDefaultDSAVCScalar(VCKindLoc);
17388+
break;
17389+
case OMPC_DEFAULT_VC_all:
17390+
if (IsTargetDefault)
17391+
DefMapKind = OMPC_DEFAULTMAP_all;
17392+
else
17393+
DSAStack->setDefaultDSAVCAll(VCKindLoc);
17394+
break;
17395+
default:
17396+
llvm_unreachable("unexpected variable category in OpenMP default clause");
17397+
}
17398+
// OpenMP 6.0, page 224, lines 4-5 default Clause, Semantics
17399+
// otherwise, its effect on a target construct is equivalent to
17400+
// specifying the defaultmap clause with the same data-sharing-attribute
17401+
// and variable-category.
17402+
//
17403+
// If earlier than OpenMP 6.0, or not a target directive, the default DSA
17404+
// is/was set as before.
17405+
if (IsTargetDefault) {
17406+
if (DefMapKind == OMPC_DEFAULTMAP_all) {
17407+
DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_aggregate, MLoc);
17408+
DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_scalar, MLoc);
17409+
DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_pointer, MLoc);
17410+
} else {
17411+
DSAStack->setDefaultDMAAttr(DefMapMod, DefMapKind, MLoc);
17412+
}
17413+
}
17414+
};
17415+
17416+
SetDefaultClauseAttrs(M, VCKind);
1736117417
return new (getASTContext())
1736217418
OMPDefaultClause(M, MLoc, VCKind, VCKindLoc, StartLoc, LParenLoc, EndLoc);
1736317419
}

0 commit comments

Comments
 (0)