Skip to content

Commit 6da8f56

Browse files
chandraghaleChandra Ghale
andauthored
[OpenMP 6.0] Parse/Sema support for reduction over private variable with reduction clause. (#129938)
Initial Parse/Sema support for reduction over private variable with reduction clause. Section 7.6.10 in in OpenMP 6.0 spec. - list item in a reduction clause can now be private in the enclosing context. - Added support for _original-sharing-modifier_ with reduction clause. --------- Co-authored-by: Chandra Ghale <[email protected]>
1 parent 0355716 commit 6da8f56

15 files changed

+299
-30
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 | :part:`partial` | :none:`unclaimed` | parsing/sema done: https://github.com/llvm/llvm-project/pull/129888 |
412412
+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+

clang/include/clang/AST/OpenMPClause.h

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3701,14 +3701,18 @@ class OMPSharedClause final
37013701
class OMPReductionClause final
37023702
: public OMPVarListClause<OMPReductionClause>,
37033703
public OMPClauseWithPostUpdate,
3704-
private llvm::TrailingObjects<OMPReductionClause, Expr *> {
3704+
private llvm::TrailingObjects<OMPReductionClause, Expr *, bool> {
37053705
friend class OMPClauseReader;
37063706
friend OMPVarListClause;
37073707
friend TrailingObjects;
37083708

37093709
/// Reduction modifier.
37103710
OpenMPReductionClauseModifier Modifier = OMPC_REDUCTION_unknown;
37113711

3712+
/// Original Sharing modifier.
3713+
OpenMPOriginalSharingModifier OriginalSharingModifier =
3714+
OMPC_ORIGINAL_SHARING_default;
3715+
37123716
/// Reduction modifier location.
37133717
SourceLocation ModifierLoc;
37143718

@@ -3734,12 +3738,14 @@ class OMPReductionClause final
37343738
OMPReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
37353739
SourceLocation ModifierLoc, SourceLocation ColonLoc,
37363740
SourceLocation EndLoc,
3737-
OpenMPReductionClauseModifier Modifier, unsigned N,
3738-
NestedNameSpecifierLoc QualifierLoc,
3741+
OpenMPReductionClauseModifier Modifier,
3742+
OpenMPOriginalSharingModifier OriginalSharingModifier,
3743+
unsigned N, NestedNameSpecifierLoc QualifierLoc,
37393744
const DeclarationNameInfo &NameInfo)
37403745
: OMPVarListClause<OMPReductionClause>(llvm::omp::OMPC_reduction,
37413746
StartLoc, LParenLoc, EndLoc, N),
37423747
OMPClauseWithPostUpdate(this), Modifier(Modifier),
3748+
OriginalSharingModifier(OriginalSharingModifier),
37433749
ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
37443750
QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
37453751

@@ -3755,6 +3761,11 @@ class OMPReductionClause final
37553761
/// Sets reduction modifier.
37563762
void setModifier(OpenMPReductionClauseModifier M) { Modifier = M; }
37573763

3764+
/// Sets Original Sharing modifier.
3765+
void setOriginalSharingModifier(OpenMPOriginalSharingModifier M) {
3766+
OriginalSharingModifier = M;
3767+
}
3768+
37583769
/// Sets location of the modifier.
37593770
void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
37603771

@@ -3800,6 +3811,31 @@ class OMPReductionClause final
38003811
/// reduction copies.
38013812
void setRHSExprs(ArrayRef<Expr *> RHSExprs);
38023813

3814+
/// Set the list private reduction flags
3815+
void setPrivateVariableReductionFlags(ArrayRef<bool> Flags) {
3816+
assert(Flags.size() == varlist_size() &&
3817+
"Number of private flags does not match vars");
3818+
llvm::copy(Flags, getTrailingObjects<bool>());
3819+
}
3820+
3821+
/// Get the list of help private variable reduction flags
3822+
MutableArrayRef<bool> getPrivateVariableReductionFlags() {
3823+
return MutableArrayRef(getTrailingObjects<bool>(), varlist_size());
3824+
}
3825+
ArrayRef<bool> getPrivateVariableReductionFlags() const {
3826+
return ArrayRef(getTrailingObjects<bool>(), varlist_size());
3827+
}
3828+
3829+
/// Returns the number of Expr* objects in trailing storage
3830+
size_t numTrailingObjects(OverloadToken<Expr *>) const {
3831+
return varlist_size() * (Modifier == OMPC_REDUCTION_inscan ? 8 : 5);
3832+
}
3833+
3834+
/// Returns the number of bool flags in trailing storage
3835+
size_t numTrailingObjects(OverloadToken<bool>) const {
3836+
return varlist_size();
3837+
}
3838+
38033839
/// Get the list of helper destination expressions.
38043840
MutableArrayRef<Expr *> getRHSExprs() {
38053841
return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
@@ -3897,6 +3933,7 @@ class OMPReductionClause final
38973933
/// region with this clause.
38983934
/// \param PostUpdate Expression that must be executed after exit from the
38993935
/// OpenMP region with this clause.
3936+
/// \param IsPrivateVarReduction array for private variable reduction flags
39003937
static OMPReductionClause *
39013938
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
39023939
SourceLocation ModifierLoc, SourceLocation ColonLoc,
@@ -3906,7 +3943,8 @@ class OMPReductionClause final
39063943
ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
39073944
ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> CopyOps,
39083945
ArrayRef<Expr *> CopyArrayTemps, ArrayRef<Expr *> CopyArrayElems,
3909-
Stmt *PreInit, Expr *PostUpdate);
3946+
Stmt *PreInit, Expr *PostUpdate, ArrayRef<bool> IsPrivateVarReduction,
3947+
OpenMPOriginalSharingModifier OriginalSharingModifier);
39103948

39113949
/// Creates an empty clause with the place for \a N variables.
39123950
///
@@ -3920,6 +3958,11 @@ class OMPReductionClause final
39203958
/// Returns modifier.
39213959
OpenMPReductionClauseModifier getModifier() const { return Modifier; }
39223960

3961+
/// Returns Original Sharing Modifier.
3962+
OpenMPOriginalSharingModifier getOriginalSharingModifier() const {
3963+
return OriginalSharingModifier;
3964+
}
3965+
39233966
/// Returns modifier location.
39243967
SourceLocation getModifierLoc() const { return ModifierLoc; }
39253968

@@ -3937,6 +3980,11 @@ class OMPReductionClause final
39373980
using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
39383981
using helper_expr_const_range =
39393982
llvm::iterator_range<helper_expr_const_iterator>;
3983+
using helper_flag_iterator = MutableArrayRef<bool>::iterator;
3984+
using helper_flag_const_iterator = ArrayRef<bool>::iterator;
3985+
using helper_flag_range = llvm::iterator_range<helper_flag_iterator>;
3986+
using helper_flag_const_range =
3987+
llvm::iterator_range<helper_flag_const_iterator>;
39403988

39413989
helper_expr_const_range privates() const {
39423990
return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
@@ -3962,6 +4010,16 @@ class OMPReductionClause final
39624010
return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
39634011
}
39644012

4013+
helper_flag_const_range private_var_reduction_flags() const {
4014+
return helper_flag_const_range(getPrivateVariableReductionFlags().begin(),
4015+
getPrivateVariableReductionFlags().end());
4016+
}
4017+
4018+
helper_flag_range private_var_reduction_flags() {
4019+
return helper_flag_range(getPrivateVariableReductionFlags().begin(),
4020+
getPrivateVariableReductionFlags().end());
4021+
}
4022+
39654023
helper_expr_const_range reduction_ops() const {
39664024
return helper_expr_const_range(getReductionOps().begin(),
39674025
getReductionOps().end());

clang/include/clang/Basic/OpenMPKinds.def

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@
7171
#ifndef OPENMP_REDUCTION_MODIFIER
7272
#define OPENMP_REDUCTION_MODIFIER(Name)
7373
#endif
74+
#ifndef OPENMP_ORIGINAL_SHARING_MODIFIER
75+
#define OPENMP_ORIGINAL_SHARING_MODIFIER(Name)
76+
#endif
7477
#ifndef OPENMP_ADJUST_ARGS_KIND
7578
#define OPENMP_ADJUST_ARGS_KIND(Name)
7679
#endif
@@ -203,6 +206,11 @@ OPENMP_REDUCTION_MODIFIER(default)
203206
OPENMP_REDUCTION_MODIFIER(inscan)
204207
OPENMP_REDUCTION_MODIFIER(task)
205208

209+
// OpenMP 6.0 modifiers for 'reduction' clause.
210+
OPENMP_ORIGINAL_SHARING_MODIFIER(shared)
211+
OPENMP_ORIGINAL_SHARING_MODIFIER(private)
212+
OPENMP_ORIGINAL_SHARING_MODIFIER(default)
213+
206214
// Adjust-op kinds for the 'adjust_args' clause.
207215
OPENMP_ADJUST_ARGS_KIND(nothing)
208216
OPENMP_ADJUST_ARGS_KIND(need_device_ptr)
@@ -234,6 +242,7 @@ OPENMP_DOACROSS_MODIFIER(source_omp_cur_iteration)
234242
#undef OPENMP_ADJUST_ARGS_KIND
235243
#undef OPENMP_REDUCTION_MODIFIER
236244
#undef OPENMP_DEVICE_MODIFIER
245+
#undef OPENMP_ORIGINAL_SHARING_MODIFIER
237246
#undef OPENMP_ORDER_KIND
238247
#undef OPENMP_ORDER_MODIFIER
239248
#undef OPENMP_LASTPRIVATE_KIND

clang/include/clang/Basic/OpenMPKinds.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,13 @@ enum OpenMPReductionClauseModifier {
190190
OMPC_REDUCTION_unknown,
191191
};
192192

193+
/// OpenMP 6.0 original sharing modifiers
194+
enum OpenMPOriginalSharingModifier {
195+
#define OPENMP_ORIGINAL_SHARING_MODIFIER(Name) OMPC_ORIGINAL_SHARING_##Name,
196+
#include "clang/Basic/OpenMPKinds.def"
197+
OMPC_ORIGINAL_SHARING_unknown,
198+
};
199+
193200
/// OpenMP adjust-op kinds for 'adjust_args' clause.
194201
enum OpenMPAdjustArgsOpKind {
195202
#define OPENMP_ADJUST_ARGS_KIND(Name) OMPC_ADJUST_ARGS_##Name,

clang/include/clang/Sema/SemaOpenMP.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1146,6 +1146,7 @@ class SemaOpenMP : public SemaBase {
11461146
DeclarationNameInfo ReductionOrMapperId;
11471147
int ExtraModifier = -1; ///< Additional modifier for linear, map, depend or
11481148
///< lastprivate clause.
1149+
int OriginalSharingModifier = 0; // Default is shared
11491150
SmallVector<OpenMPMapModifierKind, NumberOfOMPMapClauseModifiers>
11501151
MapTypeModifiers;
11511152
SmallVector<SourceLocation, NumberOfOMPMapClauseModifiers>
@@ -1155,6 +1156,7 @@ class SemaOpenMP : public SemaBase {
11551156
SmallVector<SourceLocation, NumberOfOMPMotionModifiers> MotionModifiersLoc;
11561157
bool IsMapTypeImplicit = false;
11571158
SourceLocation ExtraModifierLoc;
1159+
SourceLocation OriginalSharingModifierLoc;
11581160
SourceLocation OmpAllMemoryLoc;
11591161
SourceLocation
11601162
StepModifierLoc; /// 'step' modifier location for linear clause
@@ -1164,6 +1166,12 @@ class SemaOpenMP : public SemaBase {
11641166
SmallVector<SourceLocation, NumberOfOMPAllocateClauseModifiers>
11651167
AllocClauseModifiersLoc;
11661168
Expr *AllocateAlignment = nullptr;
1169+
struct OpenMPReductionClauseModifiers {
1170+
int ExtraModifier;
1171+
int OriginalSharingModifier;
1172+
OpenMPReductionClauseModifiers(int Extra, int Original)
1173+
: ExtraModifier(Extra), OriginalSharingModifier(Original) {}
1174+
};
11671175
};
11681176

11691177
OMPClause *ActOnOpenMPVarListClause(OpenMPClauseKind Kind,
@@ -1212,7 +1220,8 @@ class SemaOpenMP : public SemaBase {
12121220
SourceLocation EndLoc);
12131221
/// Called on well-formed 'reduction' clause.
12141222
OMPClause *ActOnOpenMPReductionClause(
1215-
ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1223+
ArrayRef<Expr *> VarList,
1224+
OpenMPVarListDataTy::OpenMPReductionClauseModifiers Modifiers,
12161225
SourceLocation StartLoc, SourceLocation LParenLoc,
12171226
SourceLocation ModifierLoc, SourceLocation ColonLoc,
12181227
SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,

clang/lib/AST/OpenMPClause.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -799,19 +799,22 @@ OMPReductionClause *OMPReductionClause::Create(
799799
ArrayRef<Expr *> Privates, ArrayRef<Expr *> LHSExprs,
800800
ArrayRef<Expr *> RHSExprs, ArrayRef<Expr *> ReductionOps,
801801
ArrayRef<Expr *> CopyOps, ArrayRef<Expr *> CopyArrayTemps,
802-
ArrayRef<Expr *> CopyArrayElems, Stmt *PreInit, Expr *PostUpdate) {
803-
void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(
804-
(Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * VL.size()));
805-
auto *Clause = new (Mem)
806-
OMPReductionClause(StartLoc, LParenLoc, ModifierLoc, EndLoc, ColonLoc,
807-
Modifier, VL.size(), QualifierLoc, NameInfo);
802+
ArrayRef<Expr *> CopyArrayElems, Stmt *PreInit, Expr *PostUpdate,
803+
ArrayRef<bool> IsPrivateVarReduction,
804+
OpenMPOriginalSharingModifier OrignalSharingModifier) {
805+
void *Mem = C.Allocate(totalSizeToAlloc<Expr *, bool>(
806+
(Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * VL.size(), VL.size()));
807+
auto *Clause = new (Mem) OMPReductionClause(
808+
StartLoc, LParenLoc, ModifierLoc, EndLoc, ColonLoc, Modifier,
809+
OrignalSharingModifier, VL.size(), QualifierLoc, NameInfo);
808810
Clause->setVarRefs(VL);
809811
Clause->setPrivates(Privates);
810812
Clause->setLHSExprs(LHSExprs);
811813
Clause->setRHSExprs(RHSExprs);
812814
Clause->setReductionOps(ReductionOps);
813815
Clause->setPreInitStmt(PreInit);
814816
Clause->setPostUpdateExpr(PostUpdate);
817+
Clause->setPrivateVariableReductionFlags(IsPrivateVarReduction);
815818
if (Modifier == OMPC_REDUCTION_inscan) {
816819
Clause->setInscanCopyOps(CopyOps);
817820
Clause->setInscanCopyArrayTemps(CopyArrayTemps);
@@ -830,8 +833,8 @@ OMPReductionClause *OMPReductionClause::Create(
830833
OMPReductionClause *
831834
OMPReductionClause::CreateEmpty(const ASTContext &C, unsigned N,
832835
OpenMPReductionClauseModifier Modifier) {
833-
void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(
834-
(Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * N));
836+
void *Mem = C.Allocate(totalSizeToAlloc<Expr *, bool>(
837+
(Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * N, N));
835838
auto *Clause = new (Mem) OMPReductionClause(N);
836839
Clause->setModifier(Modifier);
837840
return Clause;

clang/lib/Parse/ParseOpenMP.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4706,6 +4706,37 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
47064706
assert(Tok.is(tok::comma) && "Expected comma.");
47074707
(void)ConsumeToken();
47084708
}
4709+
// Handle original(private / shared) Modifier
4710+
if (Kind == OMPC_reduction && getLangOpts().OpenMP >= 60 &&
4711+
Tok.is(tok::identifier) && PP.getSpelling(Tok) == "original" &&
4712+
NextToken().is(tok::l_paren)) {
4713+
// Parse original(private) modifier.
4714+
ConsumeToken();
4715+
BalancedDelimiterTracker ParenT(*this, tok::l_paren, tok::r_paren);
4716+
ParenT.consumeOpen();
4717+
if (Tok.is(tok::kw_private)) {
4718+
Data.OriginalSharingModifier = OMPC_ORIGINAL_SHARING_private;
4719+
Data.OriginalSharingModifierLoc = Tok.getLocation();
4720+
ConsumeToken();
4721+
} else if (Tok.is(tok::identifier) &&
4722+
(PP.getSpelling(Tok) == "shared" ||
4723+
PP.getSpelling(Tok) == "default")) {
4724+
Data.OriginalSharingModifier = OMPC_ORIGINAL_SHARING_shared;
4725+
Data.OriginalSharingModifierLoc = Tok.getLocation();
4726+
ConsumeToken();
4727+
} else {
4728+
Diag(Tok.getLocation(), diag::err_expected)
4729+
<< "'private or shared or default'";
4730+
SkipUntil(tok::r_paren);
4731+
return false;
4732+
}
4733+
ParenT.consumeClose();
4734+
if (!Tok.is(tok::comma)) {
4735+
Diag(Tok.getLocation(), diag::err_expected) << "',' (comma)";
4736+
return false;
4737+
}
4738+
(void)ConsumeToken();
4739+
}
47094740
ColonProtectionRAIIObject ColonRAII(*this);
47104741
if (getLangOpts().CPlusPlus)
47114742
ParseOptionalCXXScopeSpecifier(Data.ReductionOrMapperIdScopeSpec,

0 commit comments

Comments
 (0)