@@ -3658,14 +3658,18 @@ class OMPSharedClause final
36583658class 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 ());
0 commit comments