-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang][OpenMP] Simplify check for taskloop in `ActOnOpenMPLoopInitia… #98633
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
The previous check was inconsistent. For example, it would allow ``` #pragma omp target #pragma omp parallel for for (...) { #pragma omp scan } ``` but not ``` #pragma omp target parallel for for (...) { #pragma omp scan } ``` Make the check conform to the wording on the specification.
Express the constraints via constituent directives.
Follow-up to 81cdf94 (check for `scan` nesting). Also, it eliminates the mentions of combined directives in `ActOnOpenMPReductionClause`.
…ysz/spr/c08-reduction-inscan
…lization` Replace the explicit list of compound directives ending with taskloop with checking for the last leaf construct.
@llvm/pr-subscribers-clang Author: Krzysztof Parzyszek (kparzysz) Changes…lization` Replace the explicit list of compound directives ending with taskloop with checking for the last leaf construct. Full diff: https://github.com/llvm/llvm-project/pull/98633.diff 1 Files Affected:
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 2340873c8fdd9..118cda253a437 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -9090,14 +9090,15 @@ void SemaOpenMP::ActOnOpenMPLoopInitialization(SourceLocation ForLoc,
isOpenMPSimdDirective(DKind)
? (DSAStack->hasMutipleLoops() ? OMPC_lastprivate : OMPC_linear)
: OMPC_private;
+ auto isOpenMPTaskloopDirective = [](OpenMPDirectiveKind DK) {
+ return getLeafConstructsOrSelf(DK).back() == OMPD_taskloop;
+ };
if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
DVar.CKind != PredeterminedCKind && DVar.RefExpr &&
(getLangOpts().OpenMP <= 45 ||
(DVar.CKind != OMPC_lastprivate && DVar.CKind != OMPC_private))) ||
- ((isOpenMPWorksharingDirective(DKind) || DKind == OMPD_taskloop ||
- DKind == OMPD_master_taskloop || DKind == OMPD_masked_taskloop ||
- DKind == OMPD_parallel_master_taskloop ||
- DKind == OMPD_parallel_masked_taskloop ||
+ ((isOpenMPWorksharingDirective(DKind) ||
+ isOpenMPTaskloopDirective(DKind) ||
isOpenMPDistributeDirective(DKind)) &&
!isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
DVar.CKind != OMPC_private && DVar.CKind != OMPC_lastprivate)) &&
|
clang/lib/Sema/SemaOpenMP.cpp
Outdated
@@ -9090,14 +9090,15 @@ void SemaOpenMP::ActOnOpenMPLoopInitialization(SourceLocation ForLoc, | |||
isOpenMPSimdDirective(DKind) | |||
? (DSAStack->hasMutipleLoops() ? OMPC_lastprivate : OMPC_linear) | |||
: OMPC_private; | |||
auto isOpenMPTaskloopDirective = [](OpenMPDirectiveKind DK) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IsOpenMPTaskloopDirective
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LG
…lization`
Replace the explicit list of compound directives ending with taskloop with checking for the last leaf construct.