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 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits