|
42 | 42 | #include "llvm/ADT/PointerEmbeddedInt.h"
|
43 | 43 | #include "llvm/ADT/STLExtras.h"
|
44 | 44 | #include "llvm/ADT/Sequence.h"
|
| 45 | +#include "llvm/ADT/SetVector.h" |
45 | 46 | #include "llvm/ADT/SmallSet.h"
|
46 | 47 | #include "llvm/ADT/StringExtras.h"
|
47 | 48 | #include "llvm/Frontend/OpenMP/OMPAssume.h"
|
@@ -3707,19 +3708,26 @@ getMapClauseKindFromModifier(OpenMPDefaultmapClauseModifier M,
|
3707 | 3708 | }
|
3708 | 3709 |
|
3709 | 3710 | 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 | + |
3710 | 3722 | class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
|
3711 | 3723 | DSAStackTy *Stack;
|
3712 | 3724 | Sema &SemaRef;
|
3713 | 3725 | OpenMPDirectiveKind DKind = OMPD_unknown;
|
3714 | 3726 | bool ErrorFound = false;
|
3715 | 3727 | bool TryCaptureCXXThisMembers = false;
|
3716 | 3728 | 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; |
3723 | 3731 | SemaOpenMP::VarsWithInheritedDSAType VarsWithInheritedDSA;
|
3724 | 3732 | llvm::SmallDenseSet<const ValueDecl *, 4> ImplicitDeclarations;
|
3725 | 3733 |
|
@@ -3871,9 +3879,9 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
|
3871 | 3879 | bool IsModifierPresent = Stack->getDefaultmapModifier(ClauseKind) ==
|
3872 | 3880 | OMPC_DEFAULTMAP_MODIFIER_present;
|
3873 | 3881 | if (IsModifierPresent) {
|
3874 |
| - if (!llvm::is_contained(ImplicitMapModifier[ClauseKind], |
| 3882 | + if (!llvm::is_contained(ImpInfo.MapModifiers[ClauseKind], |
3875 | 3883 | OMPC_MAP_MODIFIER_present)) {
|
3876 |
| - ImplicitMapModifier[ClauseKind].push_back( |
| 3884 | + ImpInfo.MapModifiers[ClauseKind].push_back( |
3877 | 3885 | OMPC_MAP_MODIFIER_present);
|
3878 | 3886 | }
|
3879 | 3887 | }
|
@@ -3913,13 +3921,13 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
|
3913 | 3921 | IsFirstprivate =
|
3914 | 3922 | IsFirstprivate || (Stack->mustBeFirstprivate(ClauseKind) && !Res);
|
3915 | 3923 | if (IsFirstprivate) {
|
3916 |
| - ImplicitFirstprivate.emplace_back(E); |
| 3924 | + ImpInfo.Firstprivates.insert(E); |
3917 | 3925 | } else {
|
3918 | 3926 | OpenMPDefaultmapClauseModifier M =
|
3919 | 3927 | Stack->getDefaultmapModifier(ClauseKind);
|
3920 | 3928 | OpenMPMapClauseKind Kind = getMapClauseKindFromModifier(
|
3921 | 3929 | M, ClauseKind == OMPC_DEFAULTMAP_aggregate || Res);
|
3922 |
| - ImplicitMap[ClauseKind][Kind].emplace_back(E); |
| 3930 | + ImpInfo.Mappings[ClauseKind][Kind].insert(E); |
3923 | 3931 | }
|
3924 | 3932 | return;
|
3925 | 3933 | }
|
@@ -3956,9 +3964,9 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
|
3956 | 3964 | !DVar.RefExpr)) &&
|
3957 | 3965 | !Stack->isLoopControlVariable(VD).first) {
|
3958 | 3966 | if (Stack->getDefaultDSA() == DSA_private)
|
3959 |
| - ImplicitPrivate.push_back(E); |
| 3967 | + ImpInfo.Privates.insert(E); |
3960 | 3968 | else
|
3961 |
| - ImplicitFirstprivate.push_back(E); |
| 3969 | + ImpInfo.Firstprivates.insert(E); |
3962 | 3970 | return;
|
3963 | 3971 | }
|
3964 | 3972 |
|
@@ -4015,7 +4023,7 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
|
4015 | 4023 | getVariableCategoryFromDecl(SemaRef.getLangOpts(), FD);
|
4016 | 4024 | OpenMPMapClauseKind Kind = getMapClauseKindFromModifier(
|
4017 | 4025 | Modifier, /*IsAggregateOrDeclareTarget=*/true);
|
4018 |
| - ImplicitMap[ClauseKind][Kind].emplace_back(E); |
| 4026 | + ImpInfo.Mappings[ClauseKind][Kind].insert(E); |
4019 | 4027 | return;
|
4020 | 4028 | }
|
4021 | 4029 |
|
@@ -4050,7 +4058,7 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
|
4050 | 4058 | // expression.
|
4051 | 4059 | // TODO: try to make it firstprivate.
|
4052 | 4060 | if (DVar.CKind != OMPC_unknown)
|
4053 |
| - ImplicitFirstprivate.push_back(E); |
| 4061 | + ImpInfo.Firstprivates.insert(E); |
4054 | 4062 | }
|
4055 | 4063 | return;
|
4056 | 4064 | }
|
@@ -4172,18 +4180,7 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
|
4172 | 4180 | }
|
4173 | 4181 | }
|
4174 | 4182 | 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; } |
4187 | 4184 | const SemaOpenMP::VarsWithInheritedDSAType &getVarsWithInheritedDSA() const {
|
4188 | 4185 | return VarsWithInheritedDSA;
|
4189 | 4186 | }
|
@@ -6060,69 +6057,56 @@ StmtResult SemaOpenMP::ActOnOpenMPExecutableDirective(
|
6060 | 6057 | return StmtError();
|
6061 | 6058 | // Generate list of implicitly defined firstprivate variables.
|
6062 | 6059 | VarsWithInheritedDSA = DSAChecker.getVarsWithInheritedDSA();
|
| 6060 | + VariableImplicitInfo ImpInfo = DSAChecker.getImplicitInfo(); |
6063 | 6061 |
|
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]; |
6071 | 6062 | SmallVector<SourceLocation, NumberOfOMPMapClauseModifiers>
|
6072 |
| - ImplicitMapModifiersLoc[DefaultmapKindNum]; |
| 6063 | + ImplicitMapModifiersLoc[VariableImplicitInfo::DefaultmapKindNum]; |
6073 | 6064 | // Get the original location of present modifier from Defaultmap clause.
|
6074 |
| - SourceLocation PresentModifierLocs[DefaultmapKindNum]; |
| 6065 | + SourceLocation PresentModifierLocs[VariableImplicitInfo::DefaultmapKindNum]; |
6075 | 6066 | for (OMPClause *C : Clauses) {
|
6076 | 6067 | if (auto *DMC = dyn_cast<OMPDefaultmapClause>(C))
|
6077 | 6068 | if (DMC->getDefaultmapModifier() == OMPC_DEFAULTMAP_MODIFIER_present)
|
6078 | 6069 | PresentModifierLocs[DMC->getDefaultmapKind()] =
|
6079 | 6070 | DMC->getDefaultmapModifierLoc();
|
6080 | 6071 | }
|
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]); |
6094 | 6078 | }
|
6095 | 6079 | // Mark taskgroup task_reduction descriptors as implicitly firstprivate.
|
6096 | 6080 | for (OMPClause *C : Clauses) {
|
6097 | 6081 | if (auto *IRC = dyn_cast<OMPInReductionClause>(C)) {
|
6098 | 6082 | for (Expr *E : IRC->taskgroup_descriptors())
|
6099 | 6083 | if (E)
|
6100 |
| - ImplicitFirstprivates.emplace_back(E); |
| 6084 | + ImpInfo.Firstprivates.insert(E); |
6101 | 6085 | }
|
6102 | 6086 | // OpenMP 5.0, 2.10.1 task Construct
|
6103 | 6087 | // [detach clause]... The event-handle will be considered as if it was
|
6104 | 6088 | // specified on a firstprivate clause.
|
6105 | 6089 | if (auto *DC = dyn_cast<OMPDetachClause>(C))
|
6106 |
| - ImplicitFirstprivates.push_back(DC->getEventHandler()); |
| 6090 | + ImpInfo.Firstprivates.insert(DC->getEventHandler()); |
6107 | 6091 | }
|
6108 |
| - if (!ImplicitFirstprivates.empty()) { |
| 6092 | + if (!ImpInfo.Firstprivates.empty()) { |
6109 | 6093 | if (OMPClause *Implicit = ActOnOpenMPFirstprivateClause(
|
6110 |
| - ImplicitFirstprivates, SourceLocation(), SourceLocation(), |
6111 |
| - SourceLocation())) { |
| 6094 | + ImpInfo.Firstprivates.getArrayRef(), SourceLocation(), |
| 6095 | + SourceLocation(), SourceLocation())) { |
6112 | 6096 | ClausesWithImplicit.push_back(Implicit);
|
6113 | 6097 | ErrorFound = cast<OMPFirstprivateClause>(Implicit)->varlist_size() !=
|
6114 |
| - ImplicitFirstprivates.size(); |
| 6098 | + ImpInfo.Firstprivates.size(); |
6115 | 6099 | } else {
|
6116 | 6100 | ErrorFound = true;
|
6117 | 6101 | }
|
6118 | 6102 | }
|
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())) { |
6123 | 6107 | ClausesWithImplicit.push_back(Implicit);
|
6124 | 6108 | ErrorFound = cast<OMPPrivateClause>(Implicit)->varlist_size() !=
|
6125 |
| - ImplicitPrivates.size(); |
| 6109 | + ImpInfo.Privates.size(); |
6126 | 6110 | } else {
|
6127 | 6111 | ErrorFound = true;
|
6128 | 6112 | }
|
@@ -6152,17 +6136,18 @@ StmtResult SemaOpenMP::ActOnOpenMPExecutableDirective(
|
6152 | 6136 | ClausesWithImplicit.emplace_back(Implicit);
|
6153 | 6137 | }
|
6154 | 6138 | }
|
6155 |
| - for (unsigned I = 0, E = DefaultmapKindNum; I < E; ++I) { |
| 6139 | + for (unsigned I = 0; I < VariableImplicitInfo::DefaultmapKindNum; ++I) { |
6156 | 6140 | 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(); |
6158 | 6143 | ++ClauseKindCnt;
|
6159 | 6144 | if (ImplicitMap.empty())
|
6160 | 6145 | continue;
|
6161 | 6146 | CXXScopeSpec MapperIdScopeSpec;
|
6162 | 6147 | DeclarationNameInfo MapperId;
|
6163 | 6148 | auto K = static_cast<OpenMPMapClauseKind>(ClauseKindCnt);
|
6164 | 6149 | if (OMPClause *Implicit = ActOnOpenMPMapClause(
|
6165 |
| - nullptr, ImplicitMapModifiers[I], ImplicitMapModifiersLoc[I], |
| 6150 | + nullptr, ImpInfo.MapModifiers[I], ImplicitMapModifiersLoc[I], |
6166 | 6151 | MapperIdScopeSpec, MapperId, K, /*IsMapTypeImplicit=*/true,
|
6167 | 6152 | SourceLocation(), SourceLocation(), ImplicitMap,
|
6168 | 6153 | OMPVarListLocTy())) {
|
|
0 commit comments