[clang] [clang][OpenMP] Simplify handling of implicit DSA/mapping information (PR #106786)
Krzysztof Parzyszek via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 2 06:19:40 PDT 2024
https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/106786
>From 92e82b249836b4f17d1e13a927ca3e8300f671ee Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Fri, 30 Aug 2024 13:57:13 -0500
Subject: [PATCH] [clang][OpenMP] Simplify handling of implicit DSA/mapping
information
Create `VariableImplicitInfo` to hold the data. Most of it is used all
at once, so aggregating it seems like a good idea.
---
clang/lib/Sema/SemaOpenMP.cpp | 104 ++++++++++++++--------------------
1 file changed, 44 insertions(+), 60 deletions(-)
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 23c4903ec15855..476df19b4c10eb 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -42,6 +42,7 @@
#include "llvm/ADT/PointerEmbeddedInt.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/Sequence.h"
+#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Frontend/OpenMP/OMPAssume.h"
@@ -3707,6 +3708,17 @@ getMapClauseKindFromModifier(OpenMPDefaultmapClauseModifier M,
}
namespace {
+struct VariableImplicitInfo {
+ static const unsigned MapKindNum = OMPC_MAP_unknown;
+ static const unsigned DefaultmapKindNum = OMPC_DEFAULTMAP_unknown + 1;
+
+ llvm::SetVector<Expr *> Privates;
+ llvm::SetVector<Expr *> Firstprivates;
+ llvm::SetVector<Expr *> Mappings[DefaultmapKindNum][MapKindNum];
+ llvm::SmallVector<OpenMPMapModifierKind, NumberOfOMPMapClauseModifiers>
+ MapModifiers[DefaultmapKindNum];
+};
+
class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
DSAStackTy *Stack;
Sema &SemaRef;
@@ -3714,12 +3726,8 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
bool ErrorFound = false;
bool TryCaptureCXXThisMembers = false;
CapturedStmt *CS = nullptr;
- const static unsigned DefaultmapKindNum = OMPC_DEFAULTMAP_unknown + 1;
- llvm::SmallVector<Expr *, 4> ImplicitFirstprivate;
- llvm::SmallVector<Expr *, 4> ImplicitPrivate;
- llvm::SmallVector<Expr *, 4> ImplicitMap[DefaultmapKindNum][OMPC_MAP_delete];
- llvm::SmallVector<OpenMPMapModifierKind, NumberOfOMPMapClauseModifiers>
- ImplicitMapModifier[DefaultmapKindNum];
+
+ VariableImplicitInfo ImpInfo;
SemaOpenMP::VarsWithInheritedDSAType VarsWithInheritedDSA;
llvm::SmallDenseSet<const ValueDecl *, 4> ImplicitDeclarations;
@@ -3871,9 +3879,9 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
bool IsModifierPresent = Stack->getDefaultmapModifier(ClauseKind) ==
OMPC_DEFAULTMAP_MODIFIER_present;
if (IsModifierPresent) {
- if (!llvm::is_contained(ImplicitMapModifier[ClauseKind],
+ if (!llvm::is_contained(ImpInfo.MapModifiers[ClauseKind],
OMPC_MAP_MODIFIER_present)) {
- ImplicitMapModifier[ClauseKind].push_back(
+ ImpInfo.MapModifiers[ClauseKind].push_back(
OMPC_MAP_MODIFIER_present);
}
}
@@ -3913,13 +3921,13 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
IsFirstprivate =
IsFirstprivate || (Stack->mustBeFirstprivate(ClauseKind) && !Res);
if (IsFirstprivate) {
- ImplicitFirstprivate.emplace_back(E);
+ ImpInfo.Firstprivates.insert(E);
} else {
OpenMPDefaultmapClauseModifier M =
Stack->getDefaultmapModifier(ClauseKind);
OpenMPMapClauseKind Kind = getMapClauseKindFromModifier(
M, ClauseKind == OMPC_DEFAULTMAP_aggregate || Res);
- ImplicitMap[ClauseKind][Kind].emplace_back(E);
+ ImpInfo.Mappings[ClauseKind][Kind].insert(E);
}
return;
}
@@ -3956,9 +3964,9 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
!DVar.RefExpr)) &&
!Stack->isLoopControlVariable(VD).first) {
if (Stack->getDefaultDSA() == DSA_private)
- ImplicitPrivate.push_back(E);
+ ImpInfo.Privates.insert(E);
else
- ImplicitFirstprivate.push_back(E);
+ ImpInfo.Firstprivates.insert(E);
return;
}
@@ -4015,7 +4023,7 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
getVariableCategoryFromDecl(SemaRef.getLangOpts(), FD);
OpenMPMapClauseKind Kind = getMapClauseKindFromModifier(
Modifier, /*IsAggregateOrDeclareTarget=*/true);
- ImplicitMap[ClauseKind][Kind].emplace_back(E);
+ ImpInfo.Mappings[ClauseKind][Kind].insert(E);
return;
}
@@ -4050,7 +4058,7 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
// expression.
// TODO: try to make it firstprivate.
if (DVar.CKind != OMPC_unknown)
- ImplicitFirstprivate.push_back(E);
+ ImpInfo.Firstprivates.insert(E);
}
return;
}
@@ -4172,18 +4180,7 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
}
}
bool isErrorFound() const { return ErrorFound; }
- ArrayRef<Expr *> getImplicitFirstprivate() const {
- return ImplicitFirstprivate;
- }
- ArrayRef<Expr *> getImplicitPrivate() const { return ImplicitPrivate; }
- ArrayRef<Expr *> getImplicitMap(OpenMPDefaultmapClauseKind DK,
- OpenMPMapClauseKind MK) const {
- return ImplicitMap[DK][MK];
- }
- ArrayRef<OpenMPMapModifierKind>
- getImplicitMapModifier(OpenMPDefaultmapClauseKind Kind) const {
- return ImplicitMapModifier[Kind];
- }
+ const VariableImplicitInfo &getImplicitInfo() const { return ImpInfo; }
const SemaOpenMP::VarsWithInheritedDSAType &getVarsWithInheritedDSA() const {
return VarsWithInheritedDSA;
}
@@ -6060,69 +6057,55 @@ StmtResult SemaOpenMP::ActOnOpenMPExecutableDirective(
return StmtError();
// Generate list of implicitly defined firstprivate variables.
VarsWithInheritedDSA = DSAChecker.getVarsWithInheritedDSA();
+ VariableImplicitInfo ImpInfo = DSAChecker.getImplicitInfo();
- SmallVector<Expr *, 4> ImplicitFirstprivates(
- DSAChecker.getImplicitFirstprivate());
- SmallVector<Expr *, 4> ImplicitPrivates(DSAChecker.getImplicitPrivate());
- const unsigned DefaultmapKindNum = OMPC_DEFAULTMAP_unknown + 1;
- SmallVector<Expr *, 4> ImplicitMaps[DefaultmapKindNum][OMPC_MAP_delete];
- SmallVector<OpenMPMapModifierKind, NumberOfOMPMapClauseModifiers>
- ImplicitMapModifiers[DefaultmapKindNum];
SmallVector<SourceLocation, NumberOfOMPMapClauseModifiers>
- ImplicitMapModifiersLoc[DefaultmapKindNum];
+ ImplicitMapModifiersLoc[VariableImplicitInfo::DefaultmapKindNum];
// Get the original location of present modifier from Defaultmap clause.
- SourceLocation PresentModifierLocs[DefaultmapKindNum];
+ SourceLocation PresentModifierLocs[VariableImplicitInfo::DefaultmapKindNum];
for (OMPClause *C : Clauses) {
if (auto *DMC = dyn_cast<OMPDefaultmapClause>(C))
if (DMC->getDefaultmapModifier() == OMPC_DEFAULTMAP_MODIFIER_present)
PresentModifierLocs[DMC->getDefaultmapKind()] =
DMC->getDefaultmapModifierLoc();
}
- for (unsigned VC = 0; VC < DefaultmapKindNum; ++VC) {
+
+ for (unsigned VC = 0; VC < VariableImplicitInfo::DefaultmapKindNum; ++VC) {
auto K = static_cast<OpenMPDefaultmapClauseKind>(VC);
- for (unsigned I = 0; I < OMPC_MAP_delete; ++I) {
- ArrayRef<Expr *> ImplicitMap =
- DSAChecker.getImplicitMap(K, static_cast<OpenMPMapClauseKind>(I));
- ImplicitMaps[VC][I].append(ImplicitMap.begin(), ImplicitMap.end());
- }
- ArrayRef<OpenMPMapModifierKind> ImplicitModifier =
- DSAChecker.getImplicitMapModifier(K);
- ImplicitMapModifiers[VC].append(ImplicitModifier.begin(),
- ImplicitModifier.end());
std::fill_n(std::back_inserter(ImplicitMapModifiersLoc[VC]),
- ImplicitModifier.size(), PresentModifierLocs[VC]);
+ ImpInfo.MapModifiers[K].size(), PresentModifierLocs[VC]);
}
// Mark taskgroup task_reduction descriptors as implicitly firstprivate.
for (OMPClause *C : Clauses) {
if (auto *IRC = dyn_cast<OMPInReductionClause>(C)) {
for (Expr *E : IRC->taskgroup_descriptors())
if (E)
- ImplicitFirstprivates.emplace_back(E);
+ ImpInfo.Firstprivates.insert(E);
}
// OpenMP 5.0, 2.10.1 task Construct
// [detach clause]... The event-handle will be considered as if it was
// specified on a firstprivate clause.
if (auto *DC = dyn_cast<OMPDetachClause>(C))
- ImplicitFirstprivates.push_back(DC->getEventHandler());
+ ImpInfo.Firstprivates.insert(DC->getEventHandler());
}
- if (!ImplicitFirstprivates.empty()) {
+ if (!ImpInfo.Firstprivates.empty()) {
if (OMPClause *Implicit = ActOnOpenMPFirstprivateClause(
- ImplicitFirstprivates, SourceLocation(), SourceLocation(),
- SourceLocation())) {
+ ImpInfo.Firstprivates.getArrayRef(), SourceLocation(),
+ SourceLocation(), SourceLocation())) {
ClausesWithImplicit.push_back(Implicit);
ErrorFound = cast<OMPFirstprivateClause>(Implicit)->varlist_size() !=
- ImplicitFirstprivates.size();
+ ImpInfo.Firstprivates.size();
} else {
ErrorFound = true;
}
}
- if (!ImplicitPrivates.empty()) {
- if (OMPClause *Implicit =
- ActOnOpenMPPrivateClause(ImplicitPrivates, SourceLocation(),
- SourceLocation(), SourceLocation())) {
+ if (!ImpInfo.Privates.empty()) {
+ if (OMPClause *Implicit = ActOnOpenMPPrivateClause(
+ ImpInfo.Privates.getArrayRef(), SourceLocation(),
+ SourceLocation(), SourceLocation())) {
ClausesWithImplicit.push_back(Implicit);
ErrorFound = cast<OMPPrivateClause>(Implicit)->varlist_size() !=
- ImplicitPrivates.size();
+ ImpInfo.Privates.size();
} else {
ErrorFound = true;
}
@@ -6152,9 +6135,10 @@ StmtResult SemaOpenMP::ActOnOpenMPExecutableDirective(
ClausesWithImplicit.emplace_back(Implicit);
}
}
- for (unsigned I = 0, E = DefaultmapKindNum; I < E; ++I) {
+ for (unsigned I = 0; I < VariableImplicitInfo::DefaultmapKindNum; ++I) {
int ClauseKindCnt = -1;
- for (ArrayRef<Expr *> ImplicitMap : ImplicitMaps[I]) {
+ for (unsigned J = 0; J < VariableImplicitInfo::MapKindNum; ++J) {
+ ArrayRef<Expr *> ImplicitMap = ImpInfo.Mappings[I][J].getArrayRef();
++ClauseKindCnt;
if (ImplicitMap.empty())
continue;
@@ -6162,7 +6146,7 @@ StmtResult SemaOpenMP::ActOnOpenMPExecutableDirective(
DeclarationNameInfo MapperId;
auto K = static_cast<OpenMPMapClauseKind>(ClauseKindCnt);
if (OMPClause *Implicit = ActOnOpenMPMapClause(
- nullptr, ImplicitMapModifiers[I], ImplicitMapModifiersLoc[I],
+ nullptr, ImpInfo.MapModifiers[I], ImplicitMapModifiersLoc[I],
MapperIdScopeSpec, MapperId, K, /*IsMapTypeImplicit=*/true,
SourceLocation(), SourceLocation(), ImplicitMap,
OMPVarListLocTy())) {
More information about the cfe-commits
mailing list