[clang] ba29e3a - [clang][OpenMP] Add early exit to/unindent `ActOnOpenMPLoopInitialization`
Krzysztof Parzyszek via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 12 06:31:58 PDT 2024
Author: Krzysztof Parzyszek
Date: 2024-07-12T08:18:28-05:00
New Revision: ba29e3a58dcdf0012df9fdaa3e7ed10cee56d5c5
URL: https://github.com/llvm/llvm-project/commit/ba29e3a58dcdf0012df9fdaa3e7ed10cee56d5c5
DIFF: https://github.com/llvm/llvm-project/commit/ba29e3a58dcdf0012df9fdaa3e7ed10cee56d5c5.diff
LOG: [clang][OpenMP] Add early exit to/unindent `ActOnOpenMPLoopInitialization`
NFC
Added:
Modified:
clang/lib/Sema/SemaOpenMP.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index ef09e53077f47..bc03280aa8aaf 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -9056,84 +9056,81 @@ void SemaOpenMP::ActOnOpenMPLoopInitialization(SourceLocation ForLoc,
assert(getLangOpts().OpenMP && "OpenMP is not active.");
assert(Init && "Expected loop in canonical form.");
unsigned AssociatedLoops = DSAStack->getAssociatedLoops();
- if (AssociatedLoops > 0 &&
- isOpenMPLoopDirective(DSAStack->getCurrentDirective())) {
- DSAStack->loopStart();
- OpenMPIterationSpaceChecker ISC(SemaRef, /*SupportsNonRectangular=*/true,
- *DSAStack, ForLoc);
- if (!ISC.checkAndSetInit(Init, /*EmitDiags=*/false)) {
- if (ValueDecl *D = ISC.getLoopDecl()) {
- auto *VD = dyn_cast<VarDecl>(D);
- DeclRefExpr *PrivateRef = nullptr;
- if (!VD) {
- if (VarDecl *Private = isOpenMPCapturedDecl(D)) {
- VD = Private;
- } else {
- PrivateRef = buildCapture(SemaRef, D, ISC.getLoopDeclRefExpr(),
- /*WithInit=*/false);
- VD = cast<VarDecl>(PrivateRef->getDecl());
- }
- }
- DSAStack->addLoopControlVariable(D, VD);
- const Decl *LD = DSAStack->getPossiblyLoopCounter();
- if (LD != D->getCanonicalDecl()) {
- DSAStack->resetPossibleLoopCounter();
- if (auto *Var = dyn_cast_or_null<VarDecl>(LD))
- SemaRef.MarkDeclarationsReferencedInExpr(buildDeclRefExpr(
- SemaRef, const_cast<VarDecl *>(Var),
- Var->getType().getNonLValueExprType(getASTContext()), ForLoc,
- /*RefersToCapture=*/true));
- }
- OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
- // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables
- // Referenced in a Construct, C/C++]. The loop iteration variable in the
- // associated for-loop of a simd construct with just one associated
- // for-loop may be listed in a linear clause with a constant-linear-step
- // that is the increment of the associated for-loop. The loop iteration
- // variable(s) in the associated for-loop(s) of a for or parallel for
- // construct may be listed in a private or lastprivate clause.
- DSAStackTy::DSAVarData DVar =
- DSAStack->getTopDSA(D, /*FromParent=*/false);
- // If LoopVarRefExpr is nullptr it means the corresponding loop variable
- // is declared in the loop and it is predetermined as a private.
- Expr *LoopDeclRefExpr = ISC.getLoopDeclRefExpr();
- OpenMPClauseKind PredeterminedCKind =
- isOpenMPSimdDirective(DKind)
- ? (DSAStack->hasMutipleLoops() ? OMPC_lastprivate : OMPC_linear)
- : OMPC_private;
- 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 ||
- isOpenMPDistributeDirective(DKind)) &&
- !isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
- DVar.CKind != OMPC_private && DVar.CKind != OMPC_lastprivate)) &&
- (DVar.CKind != OMPC_private || DVar.RefExpr)) {
- Diag(Init->getBeginLoc(), diag::err_omp_loop_var_dsa)
- << getOpenMPClauseName(DVar.CKind)
- << getOpenMPDirectiveName(DKind)
- << getOpenMPClauseName(PredeterminedCKind);
- if (DVar.RefExpr == nullptr)
- DVar.CKind = PredeterminedCKind;
- reportOriginalDsa(SemaRef, DSAStack, D, DVar,
- /*IsLoopIterVar=*/true);
- } else if (LoopDeclRefExpr) {
- // Make the loop iteration variable private (for worksharing
- // constructs), linear (for simd directives with the only one
- // associated loop) or lastprivate (for simd directives with several
- // collapsed or ordered loops).
- if (DVar.CKind == OMPC_unknown)
- DSAStack->addDSA(D, LoopDeclRefExpr, PredeterminedCKind,
- PrivateRef);
+ OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
+ if (AssociatedLoops == 0 || !isOpenMPLoopDirective(DKind))
+ return;
+
+ DSAStack->loopStart();
+ OpenMPIterationSpaceChecker ISC(SemaRef, /*SupportsNonRectangular=*/true,
+ *DSAStack, ForLoc);
+ if (!ISC.checkAndSetInit(Init, /*EmitDiags=*/false)) {
+ if (ValueDecl *D = ISC.getLoopDecl()) {
+ auto *VD = dyn_cast<VarDecl>(D);
+ DeclRefExpr *PrivateRef = nullptr;
+ if (!VD) {
+ if (VarDecl *Private = isOpenMPCapturedDecl(D)) {
+ VD = Private;
+ } else {
+ PrivateRef = buildCapture(SemaRef, D, ISC.getLoopDeclRefExpr(),
+ /*WithInit=*/false);
+ VD = cast<VarDecl>(PrivateRef->getDecl());
}
}
+ DSAStack->addLoopControlVariable(D, VD);
+ const Decl *LD = DSAStack->getPossiblyLoopCounter();
+ if (LD != D->getCanonicalDecl()) {
+ DSAStack->resetPossibleLoopCounter();
+ if (auto *Var = dyn_cast_or_null<VarDecl>(LD))
+ SemaRef.MarkDeclarationsReferencedInExpr(buildDeclRefExpr(
+ SemaRef, const_cast<VarDecl *>(Var),
+ Var->getType().getNonLValueExprType(getASTContext()), ForLoc,
+ /*RefersToCapture=*/true));
+ }
+ // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables
+ // Referenced in a Construct, C/C++]. The loop iteration variable in the
+ // associated for-loop of a simd construct with just one associated
+ // for-loop may be listed in a linear clause with a constant-linear-step
+ // that is the increment of the associated for-loop. The loop iteration
+ // variable(s) in the associated for-loop(s) of a for or parallel for
+ // construct may be listed in a private or lastprivate clause.
+ DSAStackTy::DSAVarData DVar =
+ DSAStack->getTopDSA(D, /*FromParent=*/false);
+ // If LoopVarRefExpr is nullptr it means the corresponding loop variable
+ // is declared in the loop and it is predetermined as a private.
+ Expr *LoopDeclRefExpr = ISC.getLoopDeclRefExpr();
+ OpenMPClauseKind PredeterminedCKind =
+ isOpenMPSimdDirective(DKind)
+ ? (DSAStack->hasMutipleLoops() ? OMPC_lastprivate : OMPC_linear)
+ : OMPC_private;
+ 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 ||
+ isOpenMPDistributeDirective(DKind)) &&
+ !isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
+ DVar.CKind != OMPC_private && DVar.CKind != OMPC_lastprivate)) &&
+ (DVar.CKind != OMPC_private || DVar.RefExpr)) {
+ Diag(Init->getBeginLoc(), diag::err_omp_loop_var_dsa)
+ << getOpenMPClauseName(DVar.CKind) << getOpenMPDirectiveName(DKind)
+ << getOpenMPClauseName(PredeterminedCKind);
+ if (DVar.RefExpr == nullptr)
+ DVar.CKind = PredeterminedCKind;
+ reportOriginalDsa(SemaRef, DSAStack, D, DVar, /*IsLoopIterVar=*/true);
+ } else if (LoopDeclRefExpr) {
+ // Make the loop iteration variable private (for worksharing
+ // constructs), linear (for simd directives with the only one
+ // associated loop) or lastprivate (for simd directives with several
+ // collapsed or ordered loops).
+ if (DVar.CKind == OMPC_unknown)
+ DSAStack->addDSA(D, LoopDeclRefExpr, PredeterminedCKind, PrivateRef);
+ }
}
- DSAStack->setAssociatedLoops(AssociatedLoops - 1);
}
+ DSAStack->setAssociatedLoops(AssociatedLoops - 1);
}
namespace {
More information about the cfe-commits
mailing list