|
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