Skip to content

Commit 4499a73

Browse files
author
Chandra Ghale
committed
Addressed review comments and made necessary modifications
1 parent 48e4564 commit 4499a73

File tree

9 files changed

+191
-46
lines changed

9 files changed

+191
-46
lines changed

clang/docs/OpenMPSupport.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -405,8 +405,8 @@ implementation.
405405
| Extensions to depobj construct | :none:`unclaimed` | :none:`unclaimed` | |
406406
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
407407
| Extensions to atomic construct | :none:`unclaimed` | :none:`unclaimed` | |
408-
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
409-
| Private reductions | :none:`unclaimed` | :none:`unclaimed` | |
408+
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
409+
| Private reductions | :part:`partial` | :none:`unclaimed` | Parse/Sema:https://github.com/llvm/llvm-project/pull/129938 |
410410
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
411411
| Self maps | :none:`unclaimed` | :none:`unclaimed` | |
412412
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+

clang/include/clang/AST/OpenMPClause.h

Lines changed: 61 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3658,14 +3658,18 @@ class OMPSharedClause final
36583658
class OMPReductionClause final
36593659
: public OMPVarListClause<OMPReductionClause>,
36603660
public OMPClauseWithPostUpdate,
3661-
private llvm::TrailingObjects<OMPReductionClause, Expr *> {
3661+
private llvm::TrailingObjects<OMPReductionClause, Expr *, bool> {
36623662
friend class OMPClauseReader;
36633663
friend OMPVarListClause;
36643664
friend TrailingObjects;
36653665

36663666
/// Reduction modifier.
36673667
OpenMPReductionClauseModifier Modifier = OMPC_REDUCTION_unknown;
36683668

3669+
/// Original Sharing modifier.
3670+
OpenMPOriginalSharingModifier OriginalSharingModifier =
3671+
OMPC_ORIGINAL_SHARING_default;
3672+
36693673
/// Reduction modifier location.
36703674
SourceLocation ModifierLoc;
36713675

@@ -3678,9 +3682,6 @@ class OMPReductionClause final
36783682
/// Name of custom operator.
36793683
DeclarationNameInfo NameInfo;
36803684

3681-
/// Private variable reduction flag
3682-
llvm::SmallVector<bool, 8> IsPrivateVarReductionFlags;
3683-
36843685
/// Build clause with number of variables \a N.
36853686
///
36863687
/// \param StartLoc Starting location of the clause.
@@ -3694,12 +3695,14 @@ class OMPReductionClause final
36943695
OMPReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
36953696
SourceLocation ModifierLoc, SourceLocation ColonLoc,
36963697
SourceLocation EndLoc,
3697-
OpenMPReductionClauseModifier Modifier, unsigned N,
3698-
NestedNameSpecifierLoc QualifierLoc,
3698+
OpenMPReductionClauseModifier Modifier,
3699+
OpenMPOriginalSharingModifier OriginalSharingModifier,
3700+
unsigned N, NestedNameSpecifierLoc QualifierLoc,
36993701
const DeclarationNameInfo &NameInfo)
37003702
: OMPVarListClause<OMPReductionClause>(llvm::omp::OMPC_reduction,
37013703
StartLoc, LParenLoc, EndLoc, N),
37023704
OMPClauseWithPostUpdate(this), Modifier(Modifier),
3705+
OriginalSharingModifier(OriginalSharingModifier),
37033706
ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
37043707
QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
37053708

@@ -3715,6 +3718,11 @@ class OMPReductionClause final
37153718
/// Sets reduction modifier.
37163719
void setModifier(OpenMPReductionClauseModifier M) { Modifier = M; }
37173720

3721+
/// Sets Original Sharing modifier.
3722+
void setOriginalSharingModifier(OpenMPOriginalSharingModifier M) {
3723+
OriginalSharingModifier = M;
3724+
}
3725+
37183726
/// Sets location of the modifier.
37193727
void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
37203728

@@ -3760,6 +3768,31 @@ class OMPReductionClause final
37603768
/// reduction copies.
37613769
void setRHSExprs(ArrayRef<Expr *> RHSExprs);
37623770

3771+
/// Set the list private reduction flags
3772+
void setPrivateVariableReductionFlags(ArrayRef<bool> Flags) {
3773+
assert(Flags.size() == varlist_size() &&
3774+
"Number of private flags does not match vars");
3775+
std::copy(Flags.begin(), Flags.end(), getTrailingObjects<bool>());
3776+
}
3777+
3778+
/// Get the list of help private variable reduction flags
3779+
MutableArrayRef<bool> getPrivateVariableReductionFlags() {
3780+
return MutableArrayRef<bool>(getTrailingObjects<bool>(), varlist_size());
3781+
}
3782+
ArrayRef<bool> getPrivateVariableReductionFlags() const {
3783+
return ArrayRef<bool>(getTrailingObjects<bool>(), varlist_size());
3784+
}
3785+
3786+
/// Returns the number of Expr* objects in trailing storage
3787+
size_t numTrailingObjects(OverloadToken<Expr *>) const {
3788+
return varlist_size() * (Modifier == OMPC_REDUCTION_inscan ? 8 : 5);
3789+
}
3790+
3791+
/// Returns the number of bool flags in trailing storage
3792+
size_t numTrailingObjects(OverloadToken<bool>) const {
3793+
return varlist_size();
3794+
}
3795+
37633796
/// Get the list of helper destination expressions.
37643797
MutableArrayRef<Expr *> getRHSExprs() {
37653798
return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
@@ -3867,7 +3900,8 @@ class OMPReductionClause final
38673900
ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
38683901
ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> CopyOps,
38693902
ArrayRef<Expr *> CopyArrayTemps, ArrayRef<Expr *> CopyArrayElems,
3870-
Stmt *PreInit, Expr *PostUpdate, ArrayRef<bool> IsPrivateVarReduction);
3903+
Stmt *PreInit, Expr *PostUpdate, ArrayRef<bool> IsPrivateVarReduction,
3904+
OpenMPOriginalSharingModifier OriginalSharingModifier);
38713905

38723906
/// Creates an empty clause with the place for \a N variables.
38733907
///
@@ -3881,6 +3915,11 @@ class OMPReductionClause final
38813915
/// Returns modifier.
38823916
OpenMPReductionClauseModifier getModifier() const { return Modifier; }
38833917

3918+
/// Returns Original Sharing Modifier.
3919+
OpenMPOriginalSharingModifier getOriginalSharingModifier() const {
3920+
return OriginalSharingModifier;
3921+
}
3922+
38843923
/// Returns modifier location.
38853924
SourceLocation getModifierLoc() const { return ModifierLoc; }
38863925

@@ -3893,21 +3932,16 @@ class OMPReductionClause final
38933932
/// Gets the nested name specifier.
38943933
NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
38953934

3896-
/// Get all private variable reduction flags
3897-
ArrayRef<bool> getPrivateVariableReductionFlags() const {
3898-
return IsPrivateVarReductionFlags;
3899-
}
3900-
3901-
//// Set private variable reduction flags
3902-
void setPrivateVariableReductionFlags(ArrayRef<bool> Flags) {
3903-
std::copy(Flags.begin(), Flags.end(), IsPrivateVarReductionFlags.begin());
3904-
}
3905-
39063935
using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
39073936
using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
39083937
using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
39093938
using helper_expr_const_range =
39103939
llvm::iterator_range<helper_expr_const_iterator>;
3940+
using helper_flag_iterator = MutableArrayRef<bool>::iterator;
3941+
using helper_flag_const_iterator = ArrayRef<bool>::iterator;
3942+
using helper_flag_range = llvm::iterator_range<helper_flag_iterator>;
3943+
using helper_flag_const_range =
3944+
llvm::iterator_range<helper_flag_const_iterator>;
39113945

39123946
helper_expr_const_range privates() const {
39133947
return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
@@ -3933,6 +3967,16 @@ class OMPReductionClause final
39333967
return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
39343968
}
39353969

3970+
helper_flag_const_range private_var_reduction_flags() const {
3971+
return helper_flag_const_range(getPrivateVariableReductionFlags().begin(),
3972+
getPrivateVariableReductionFlags().end());
3973+
}
3974+
3975+
helper_flag_range private_var_reduction_flags() {
3976+
return helper_flag_range(getPrivateVariableReductionFlags().begin(),
3977+
getPrivateVariableReductionFlags().end());
3978+
}
3979+
39363980
helper_expr_const_range reduction_ops() const {
39373981
return helper_expr_const_range(getReductionOps().begin(),
39383982
getReductionOps().end());

clang/include/clang/Sema/SemaOpenMP.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,6 +1162,12 @@ class SemaOpenMP : public SemaBase {
11621162
SmallVector<SourceLocation, NumberOfOMPAllocateClauseModifiers>
11631163
AllocClauseModifiersLoc;
11641164
Expr *AllocateAlignment = nullptr;
1165+
struct OpenMPReductionClauseModifiers {
1166+
int ExtraModifier;
1167+
int OriginalSharingModifier;
1168+
OpenMPReductionClauseModifiers(int extra, int original)
1169+
: ExtraModifier(extra), OriginalSharingModifier(original) {}
1170+
};
11651171
};
11661172

11671173
OMPClause *ActOnOpenMPVarListClause(OpenMPClauseKind Kind,
@@ -1210,14 +1216,13 @@ class SemaOpenMP : public SemaBase {
12101216
SourceLocation EndLoc);
12111217
/// Called on well-formed 'reduction' clause.
12121218
OMPClause *ActOnOpenMPReductionClause(
1213-
ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1219+
ArrayRef<Expr *> VarList,
1220+
OpenMPVarListDataTy::OpenMPReductionClauseModifiers Modifiers,
12141221
SourceLocation StartLoc, SourceLocation LParenLoc,
12151222
SourceLocation ModifierLoc, SourceLocation ColonLoc,
12161223
SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
12171224
const DeclarationNameInfo &ReductionId,
1218-
ArrayRef<Expr *> UnresolvedReductions = {},
1219-
OpenMPOriginalSharingModifier OriginalShareModifier =
1220-
OMPC_ORIGINAL_SHARING_default);
1225+
ArrayRef<Expr *> UnresolvedReductions = {});
12211226
/// Called on well-formed 'task_reduction' clause.
12221227
OMPClause *ActOnOpenMPTaskReductionClause(
12231228
ArrayRef<Expr *> VarList, SourceLocation StartLoc,

clang/lib/AST/OpenMPClause.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -798,12 +798,13 @@ OMPReductionClause *OMPReductionClause::Create(
798798
ArrayRef<Expr *> RHSExprs, ArrayRef<Expr *> ReductionOps,
799799
ArrayRef<Expr *> CopyOps, ArrayRef<Expr *> CopyArrayTemps,
800800
ArrayRef<Expr *> CopyArrayElems, Stmt *PreInit, Expr *PostUpdate,
801-
ArrayRef<bool> IsPrivateVarReduction) {
802-
void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(
803-
(Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * VL.size()));
804-
auto *Clause = new (Mem)
805-
OMPReductionClause(StartLoc, LParenLoc, ModifierLoc, EndLoc, ColonLoc,
806-
Modifier, VL.size(), QualifierLoc, NameInfo);
801+
ArrayRef<bool> IsPrivateVarReduction,
802+
OpenMPOriginalSharingModifier OrignalSharingModifier) {
803+
void *Mem = C.Allocate(totalSizeToAlloc<Expr *, bool>(
804+
(Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * VL.size(), VL.size()));
805+
auto *Clause = new (Mem) OMPReductionClause(
806+
StartLoc, LParenLoc, ModifierLoc, EndLoc, ColonLoc, Modifier,
807+
OrignalSharingModifier, VL.size(), QualifierLoc, NameInfo);
807808
Clause->setVarRefs(VL);
808809
Clause->setPrivates(Privates);
809810
Clause->setLHSExprs(LHSExprs);
@@ -830,8 +831,8 @@ OMPReductionClause *OMPReductionClause::Create(
830831
OMPReductionClause *
831832
OMPReductionClause::CreateEmpty(const ASTContext &C, unsigned N,
832833
OpenMPReductionClauseModifier Modifier) {
833-
void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(
834-
(Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * N));
834+
void *Mem = C.Allocate(totalSizeToAlloc<Expr *, bool>(
835+
(Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * N, N));
835836
auto *Clause = new (Mem) OMPReductionClause(N);
836837
Clause->setModifier(Modifier);
837838
return Clause;

clang/lib/Parse/ParseOpenMP.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4693,7 +4693,10 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
46934693
return false;
46944694
}
46954695
ParenT.consumeClose();
4696-
assert(Tok.is(tok::comma) && "Expected comma.");
4696+
if (!Tok.is(tok::comma)) {
4697+
Diag(Tok.getLocation(), diag::err_expected) << "',' (comma)";
4698+
return false;
4699+
}
46974700
(void)ConsumeToken();
46984701
}
46994702
ColonProtectionRAIIObject ColonRAII(*this);

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17390,10 +17390,11 @@ OMPClause *SemaOpenMP::ActOnOpenMPVarListClause(OpenMPClauseKind Kind,
1739017390
assert(0 <= ExtraModifier && ExtraModifier <= OMPC_REDUCTION_unknown &&
1739117391
"Unexpected lastprivate modifier.");
1739217392
Res = ActOnOpenMPReductionClause(
17393-
VarList, static_cast<OpenMPReductionClauseModifier>(ExtraModifier),
17393+
VarList,
17394+
OpenMPVarListDataTy::OpenMPReductionClauseModifiers(
17395+
ExtraModifier, OriginalSharingModifier),
1739417396
StartLoc, LParenLoc, ExtraModifierLoc, ColonLoc, EndLoc,
17395-
Data.ReductionOrMapperIdScopeSpec, Data.ReductionOrMapperId, {},
17396-
static_cast<OpenMPOriginalSharingModifier>(OriginalSharingModifier));
17397+
Data.ReductionOrMapperIdScopeSpec, Data.ReductionOrMapperId);
1739717398
break;
1739817399
case OMPC_task_reduction:
1739917400
Res = ActOnOpenMPTaskReductionClause(
@@ -19474,12 +19475,17 @@ static bool actOnOMPReductionKindClause(
1947419475
}
1947519476

1947619477
OMPClause *SemaOpenMP::ActOnOpenMPReductionClause(
19477-
ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
19478+
ArrayRef<Expr *> VarList,
19479+
OpenMPVarListDataTy::OpenMPReductionClauseModifiers Modifiers,
1947819480
SourceLocation StartLoc, SourceLocation LParenLoc,
1947919481
SourceLocation ModifierLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1948019482
CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId,
19481-
ArrayRef<Expr *> UnresolvedReductions,
19482-
OpenMPOriginalSharingModifier OriginalSharingMod) {
19483+
ArrayRef<Expr *> UnresolvedReductions) {
19484+
OpenMPReductionClauseModifier Modifier =
19485+
static_cast<OpenMPReductionClauseModifier>(Modifiers.ExtraModifier);
19486+
OpenMPOriginalSharingModifier OriginalSharingModifier =
19487+
static_cast<OpenMPOriginalSharingModifier>(
19488+
Modifiers.OriginalSharingModifier);
1948319489
if (ModifierLoc.isValid() && Modifier == OMPC_REDUCTION_unknown) {
1948419490
Diag(LParenLoc, diag::err_omp_unexpected_clause_value)
1948519491
<< getListOfPossibleValues(OMPC_reduction, /*First=*/0,
@@ -19501,7 +19507,7 @@ OMPClause *SemaOpenMP::ActOnOpenMPReductionClause(
1950119507
Diag(ModifierLoc, diag::err_omp_wrong_inscan_reduction);
1950219508
return nullptr;
1950319509
}
19504-
ReductionData RD(VarList.size(), Modifier, OriginalSharingMod);
19510+
ReductionData RD(VarList.size(), Modifier, OriginalSharingModifier);
1950519511
if (actOnOMPReductionKindClause(SemaRef, DSAStack, OMPC_reduction, VarList,
1950619512
StartLoc, LParenLoc, ColonLoc, EndLoc,
1950719513
ReductionIdScopeSpec, ReductionId,
@@ -19515,7 +19521,8 @@ OMPClause *SemaOpenMP::ActOnOpenMPReductionClause(
1951519521
RD.Privates, RD.LHSs, RD.RHSs, RD.ReductionOps, RD.InscanCopyOps,
1951619522
RD.InscanCopyArrayTemps, RD.InscanCopyArrayElems,
1951719523
buildPreInits(getASTContext(), RD.ExprCaptures),
19518-
buildPostUpdate(SemaRef, RD.ExprPostUpdates), RD.IsPrivateVarReduction);
19524+
buildPostUpdate(SemaRef, RD.ExprPostUpdates), RD.IsPrivateVarReduction,
19525+
OriginalSharingModifier);
1951919526
}
1952019527

1952119528
OMPClause *SemaOpenMP::ActOnOpenMPTaskReductionClause(

clang/lib/Sema/TreeTransform.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1913,14 +1913,16 @@ class TreeTransform {
19131913
/// Subclasses may override this routine to provide different behavior.
19141914
OMPClause *RebuildOMPReductionClause(
19151915
ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1916+
OpenMPOriginalSharingModifier OriginalSharingModifier,
19161917
SourceLocation StartLoc, SourceLocation LParenLoc,
19171918
SourceLocation ModifierLoc, SourceLocation ColonLoc,
19181919
SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
19191920
const DeclarationNameInfo &ReductionId,
19201921
ArrayRef<Expr *> UnresolvedReductions) {
19211922
return getSema().OpenMP().ActOnOpenMPReductionClause(
1922-
VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1923-
ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1923+
VarList, {Modifier, OriginalSharingModifier}, StartLoc, LParenLoc,
1924+
ModifierLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, ReductionId,
1925+
UnresolvedReductions);
19241926
}
19251927

19261928
/// Build a new OpenMP 'task_reduction' clause.
@@ -10946,8 +10948,8 @@ TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
1094610948
UnresolvedReductions.push_back(nullptr);
1094710949
}
1094810950
return getDerived().RebuildOMPReductionClause(
10949-
Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
10950-
C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
10951+
Vars, C->getModifier(), C->getOriginalSharingModifier(), C->getBeginLoc(),
10952+
C->getLParenLoc(), C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
1095110953
ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
1095210954
}
1095310955

clang/lib/Serialization/ASTWriter.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8020,8 +8020,9 @@ void OMPClauseWriter::VisitOMPReductionClause(OMPReductionClause *C) {
80208020
for (auto *E : C->copy_array_elems())
80218021
Record.AddStmt(E);
80228022
}
8023-
ArrayRef<bool> PrivateFlags = C->getPrivateVariableReductionFlags();
8024-
Record.push_back(PrivateFlags.size());
8023+
auto PrivateFlags = C->private_var_reduction_flags();
8024+
Record.push_back(std::distance(PrivateFlags.begin(), PrivateFlags.end()));
8025+
// Record.push_back(PrivateFlags.size());
80258026
for (bool Flag : PrivateFlags)
80268027
Record.push_back(Flag);
80278028
}

0 commit comments

Comments
 (0)