Skip to content

Commit 3ba0755

Browse files
authored
[clang][OpenMP] Simplify handling of implicit DSA/mapping information (llvm#106786)
Create `VariableImplicitInfo` to hold the data. Most of it is used all at once, so aggregating it seems like a good idea.
1 parent 056a167 commit 3ba0755

File tree

2 files changed

+52
-62
lines changed

2 files changed

+52
-62
lines changed

clang/include/clang/Basic/OpenMPKinds.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#define LLVM_CLANG_BASIC_OPENMPKINDS_H
1616

1717
#include "clang/Basic/LangOptions.h"
18+
#include "llvm/ADT/Sequence.h"
1819
#include "llvm/ADT/StringRef.h"
1920
#include "llvm/Frontend/OpenMP/OMPConstants.h"
2021

@@ -389,5 +390,9 @@ bool isOpenMPInformationalDirective(OpenMPDirectiveKind DKind);
389390
bool isOpenMPCapturingDirective(OpenMPDirectiveKind DKind);
390391
}
391392

393+
template <>
394+
struct llvm::enum_iteration_traits<clang::OpenMPDefaultmapClauseKind> {
395+
static constexpr bool is_iterable = true;
396+
};
392397
#endif
393398

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 47 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "llvm/ADT/PointerEmbeddedInt.h"
4343
#include "llvm/ADT/STLExtras.h"
4444
#include "llvm/ADT/Sequence.h"
45+
#include "llvm/ADT/SetVector.h"
4546
#include "llvm/ADT/SmallSet.h"
4647
#include "llvm/ADT/StringExtras.h"
4748
#include "llvm/Frontend/OpenMP/OMPAssume.h"
@@ -3707,19 +3708,26 @@ getMapClauseKindFromModifier(OpenMPDefaultmapClauseModifier M,
37073708
}
37083709

37093710
namespace {
3711+
struct VariableImplicitInfo {
3712+
static const unsigned MapKindNum = OMPC_MAP_unknown;
3713+
static const unsigned DefaultmapKindNum = OMPC_DEFAULTMAP_unknown + 1;
3714+
3715+
llvm::SetVector<Expr *> Privates;
3716+
llvm::SetVector<Expr *> Firstprivates;
3717+
llvm::SetVector<Expr *> Mappings[DefaultmapKindNum][MapKindNum];
3718+
llvm::SmallVector<OpenMPMapModifierKind, NumberOfOMPMapClauseModifiers>
3719+
MapModifiers[DefaultmapKindNum];
3720+
};
3721+
37103722
class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
37113723
DSAStackTy *Stack;
37123724
Sema &SemaRef;
37133725
OpenMPDirectiveKind DKind = OMPD_unknown;
37143726
bool ErrorFound = false;
37153727
bool TryCaptureCXXThisMembers = false;
37163728
CapturedStmt *CS = nullptr;
3717-
const static unsigned DefaultmapKindNum = OMPC_DEFAULTMAP_unknown + 1;
3718-
llvm::SmallVector<Expr *, 4> ImplicitFirstprivate;
3719-
llvm::SmallVector<Expr *, 4> ImplicitPrivate;
3720-
llvm::SmallVector<Expr *, 4> ImplicitMap[DefaultmapKindNum][OMPC_MAP_delete];
3721-
llvm::SmallVector<OpenMPMapModifierKind, NumberOfOMPMapClauseModifiers>
3722-
ImplicitMapModifier[DefaultmapKindNum];
3729+
3730+
VariableImplicitInfo ImpInfo;
37233731
SemaOpenMP::VarsWithInheritedDSAType VarsWithInheritedDSA;
37243732
llvm::SmallDenseSet<const ValueDecl *, 4> ImplicitDeclarations;
37253733

@@ -3871,9 +3879,9 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
38713879
bool IsModifierPresent = Stack->getDefaultmapModifier(ClauseKind) ==
38723880
OMPC_DEFAULTMAP_MODIFIER_present;
38733881
if (IsModifierPresent) {
3874-
if (!llvm::is_contained(ImplicitMapModifier[ClauseKind],
3882+
if (!llvm::is_contained(ImpInfo.MapModifiers[ClauseKind],
38753883
OMPC_MAP_MODIFIER_present)) {
3876-
ImplicitMapModifier[ClauseKind].push_back(
3884+
ImpInfo.MapModifiers[ClauseKind].push_back(
38773885
OMPC_MAP_MODIFIER_present);
38783886
}
38793887
}
@@ -3913,13 +3921,13 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
39133921
IsFirstprivate =
39143922
IsFirstprivate || (Stack->mustBeFirstprivate(ClauseKind) && !Res);
39153923
if (IsFirstprivate) {
3916-
ImplicitFirstprivate.emplace_back(E);
3924+
ImpInfo.Firstprivates.insert(E);
39173925
} else {
39183926
OpenMPDefaultmapClauseModifier M =
39193927
Stack->getDefaultmapModifier(ClauseKind);
39203928
OpenMPMapClauseKind Kind = getMapClauseKindFromModifier(
39213929
M, ClauseKind == OMPC_DEFAULTMAP_aggregate || Res);
3922-
ImplicitMap[ClauseKind][Kind].emplace_back(E);
3930+
ImpInfo.Mappings[ClauseKind][Kind].insert(E);
39233931
}
39243932
return;
39253933
}
@@ -3956,9 +3964,9 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
39563964
!DVar.RefExpr)) &&
39573965
!Stack->isLoopControlVariable(VD).first) {
39583966
if (Stack->getDefaultDSA() == DSA_private)
3959-
ImplicitPrivate.push_back(E);
3967+
ImpInfo.Privates.insert(E);
39603968
else
3961-
ImplicitFirstprivate.push_back(E);
3969+
ImpInfo.Firstprivates.insert(E);
39623970
return;
39633971
}
39643972

@@ -4015,7 +4023,7 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
40154023
getVariableCategoryFromDecl(SemaRef.getLangOpts(), FD);
40164024
OpenMPMapClauseKind Kind = getMapClauseKindFromModifier(
40174025
Modifier, /*IsAggregateOrDeclareTarget=*/true);
4018-
ImplicitMap[ClauseKind][Kind].emplace_back(E);
4026+
ImpInfo.Mappings[ClauseKind][Kind].insert(E);
40194027
return;
40204028
}
40214029

@@ -4050,7 +4058,7 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
40504058
// expression.
40514059
// TODO: try to make it firstprivate.
40524060
if (DVar.CKind != OMPC_unknown)
4053-
ImplicitFirstprivate.push_back(E);
4061+
ImpInfo.Firstprivates.insert(E);
40544062
}
40554063
return;
40564064
}
@@ -4172,18 +4180,7 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
41724180
}
41734181
}
41744182
bool isErrorFound() const { return ErrorFound; }
4175-
ArrayRef<Expr *> getImplicitFirstprivate() const {
4176-
return ImplicitFirstprivate;
4177-
}
4178-
ArrayRef<Expr *> getImplicitPrivate() const { return ImplicitPrivate; }
4179-
ArrayRef<Expr *> getImplicitMap(OpenMPDefaultmapClauseKind DK,
4180-
OpenMPMapClauseKind MK) const {
4181-
return ImplicitMap[DK][MK];
4182-
}
4183-
ArrayRef<OpenMPMapModifierKind>
4184-
getImplicitMapModifier(OpenMPDefaultmapClauseKind Kind) const {
4185-
return ImplicitMapModifier[Kind];
4186-
}
4183+
const VariableImplicitInfo &getImplicitInfo() const { return ImpInfo; }
41874184
const SemaOpenMP::VarsWithInheritedDSAType &getVarsWithInheritedDSA() const {
41884185
return VarsWithInheritedDSA;
41894186
}
@@ -6060,69 +6057,56 @@ StmtResult SemaOpenMP::ActOnOpenMPExecutableDirective(
60606057
return StmtError();
60616058
// Generate list of implicitly defined firstprivate variables.
60626059
VarsWithInheritedDSA = DSAChecker.getVarsWithInheritedDSA();
6060+
VariableImplicitInfo ImpInfo = DSAChecker.getImplicitInfo();
60636061

6064-
SmallVector<Expr *, 4> ImplicitFirstprivates(
6065-
DSAChecker.getImplicitFirstprivate());
6066-
SmallVector<Expr *, 4> ImplicitPrivates(DSAChecker.getImplicitPrivate());
6067-
const unsigned DefaultmapKindNum = OMPC_DEFAULTMAP_unknown + 1;
6068-
SmallVector<Expr *, 4> ImplicitMaps[DefaultmapKindNum][OMPC_MAP_delete];
6069-
SmallVector<OpenMPMapModifierKind, NumberOfOMPMapClauseModifiers>
6070-
ImplicitMapModifiers[DefaultmapKindNum];
60716062
SmallVector<SourceLocation, NumberOfOMPMapClauseModifiers>
6072-
ImplicitMapModifiersLoc[DefaultmapKindNum];
6063+
ImplicitMapModifiersLoc[VariableImplicitInfo::DefaultmapKindNum];
60736064
// Get the original location of present modifier from Defaultmap clause.
6074-
SourceLocation PresentModifierLocs[DefaultmapKindNum];
6065+
SourceLocation PresentModifierLocs[VariableImplicitInfo::DefaultmapKindNum];
60756066
for (OMPClause *C : Clauses) {
60766067
if (auto *DMC = dyn_cast<OMPDefaultmapClause>(C))
60776068
if (DMC->getDefaultmapModifier() == OMPC_DEFAULTMAP_MODIFIER_present)
60786069
PresentModifierLocs[DMC->getDefaultmapKind()] =
60796070
DMC->getDefaultmapModifierLoc();
60806071
}
6081-
for (unsigned VC = 0; VC < DefaultmapKindNum; ++VC) {
6082-
auto K = static_cast<OpenMPDefaultmapClauseKind>(VC);
6083-
for (unsigned I = 0; I < OMPC_MAP_delete; ++I) {
6084-
ArrayRef<Expr *> ImplicitMap =
6085-
DSAChecker.getImplicitMap(K, static_cast<OpenMPMapClauseKind>(I));
6086-
ImplicitMaps[VC][I].append(ImplicitMap.begin(), ImplicitMap.end());
6087-
}
6088-
ArrayRef<OpenMPMapModifierKind> ImplicitModifier =
6089-
DSAChecker.getImplicitMapModifier(K);
6090-
ImplicitMapModifiers[VC].append(ImplicitModifier.begin(),
6091-
ImplicitModifier.end());
6092-
std::fill_n(std::back_inserter(ImplicitMapModifiersLoc[VC]),
6093-
ImplicitModifier.size(), PresentModifierLocs[VC]);
6072+
6073+
for (OpenMPDefaultmapClauseKind K :
6074+
llvm::enum_seq_inclusive<OpenMPDefaultmapClauseKind>(
6075+
OpenMPDefaultmapClauseKind(), OMPC_DEFAULTMAP_unknown)) {
6076+
std::fill_n(std::back_inserter(ImplicitMapModifiersLoc[K]),
6077+
ImpInfo.MapModifiers[K].size(), PresentModifierLocs[K]);
60946078
}
60956079
// Mark taskgroup task_reduction descriptors as implicitly firstprivate.
60966080
for (OMPClause *C : Clauses) {
60976081
if (auto *IRC = dyn_cast<OMPInReductionClause>(C)) {
60986082
for (Expr *E : IRC->taskgroup_descriptors())
60996083
if (E)
6100-
ImplicitFirstprivates.emplace_back(E);
6084+
ImpInfo.Firstprivates.insert(E);
61016085
}
61026086
// OpenMP 5.0, 2.10.1 task Construct
61036087
// [detach clause]... The event-handle will be considered as if it was
61046088
// specified on a firstprivate clause.
61056089
if (auto *DC = dyn_cast<OMPDetachClause>(C))
6106-
ImplicitFirstprivates.push_back(DC->getEventHandler());
6090+
ImpInfo.Firstprivates.insert(DC->getEventHandler());
61076091
}
6108-
if (!ImplicitFirstprivates.empty()) {
6092+
if (!ImpInfo.Firstprivates.empty()) {
61096093
if (OMPClause *Implicit = ActOnOpenMPFirstprivateClause(
6110-
ImplicitFirstprivates, SourceLocation(), SourceLocation(),
6111-
SourceLocation())) {
6094+
ImpInfo.Firstprivates.getArrayRef(), SourceLocation(),
6095+
SourceLocation(), SourceLocation())) {
61126096
ClausesWithImplicit.push_back(Implicit);
61136097
ErrorFound = cast<OMPFirstprivateClause>(Implicit)->varlist_size() !=
6114-
ImplicitFirstprivates.size();
6098+
ImpInfo.Firstprivates.size();
61156099
} else {
61166100
ErrorFound = true;
61176101
}
61186102
}
6119-
if (!ImplicitPrivates.empty()) {
6120-
if (OMPClause *Implicit =
6121-
ActOnOpenMPPrivateClause(ImplicitPrivates, SourceLocation(),
6122-
SourceLocation(), SourceLocation())) {
6103+
if (!ImpInfo.Privates.empty()) {
6104+
if (OMPClause *Implicit = ActOnOpenMPPrivateClause(
6105+
ImpInfo.Privates.getArrayRef(), SourceLocation(),
6106+
SourceLocation(), SourceLocation())) {
61236107
ClausesWithImplicit.push_back(Implicit);
61246108
ErrorFound = cast<OMPPrivateClause>(Implicit)->varlist_size() !=
6125-
ImplicitPrivates.size();
6109+
ImpInfo.Privates.size();
61266110
} else {
61276111
ErrorFound = true;
61286112
}
@@ -6152,17 +6136,18 @@ StmtResult SemaOpenMP::ActOnOpenMPExecutableDirective(
61526136
ClausesWithImplicit.emplace_back(Implicit);
61536137
}
61546138
}
6155-
for (unsigned I = 0, E = DefaultmapKindNum; I < E; ++I) {
6139+
for (unsigned I = 0; I < VariableImplicitInfo::DefaultmapKindNum; ++I) {
61566140
int ClauseKindCnt = -1;
6157-
for (ArrayRef<Expr *> ImplicitMap : ImplicitMaps[I]) {
6141+
for (unsigned J = 0; J < VariableImplicitInfo::MapKindNum; ++J) {
6142+
ArrayRef<Expr *> ImplicitMap = ImpInfo.Mappings[I][J].getArrayRef();
61586143
++ClauseKindCnt;
61596144
if (ImplicitMap.empty())
61606145
continue;
61616146
CXXScopeSpec MapperIdScopeSpec;
61626147
DeclarationNameInfo MapperId;
61636148
auto K = static_cast<OpenMPMapClauseKind>(ClauseKindCnt);
61646149
if (OMPClause *Implicit = ActOnOpenMPMapClause(
6165-
nullptr, ImplicitMapModifiers[I], ImplicitMapModifiersLoc[I],
6150+
nullptr, ImpInfo.MapModifiers[I], ImplicitMapModifiersLoc[I],
61666151
MapperIdScopeSpec, MapperId, K, /*IsMapTypeImplicit=*/true,
61676152
SourceLocation(), SourceLocation(), ImplicitMap,
61686153
OMPVarListLocTy())) {

0 commit comments

Comments
 (0)