llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Krzysztof Parzyszek (kparzysz) <details> <summary>Changes</summary> There are chunks of code repeated in a number of functions. This patch moves some of that code into individual functions. --- Patch is 75.04 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/96811.diff 2 Files Affected: - (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+2-6) - (modified) clang/lib/Sema/SemaOpenMP.cpp (+162-898) ``````````diff diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 79cc9c61f7fd3..14b59d7ed63ae 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11173,16 +11173,12 @@ def err_omp_several_directives_in_region : Error< def note_omp_previous_directive : Note< "previous '%0' directive used here">; def err_omp_sections_not_compound_stmt : Error< - "the statement for '#pragma omp sections' must be a compound statement">; -def err_omp_parallel_sections_not_compound_stmt : Error< - "the statement for '#pragma omp parallel sections' must be a compound statement">; + "the statement for '#pragma omp %0' must be a compound statement">; def err_omp_orphaned_section_directive : Error< "%select{orphaned 'omp section' directives are prohibited, it|'omp section' directive}0" " must be closely nested to a sections region%select{|, not a %1 region}0">; def err_omp_sections_substmt_not_section : Error< - "statement in 'omp sections' directive must be enclosed into a section region">; -def err_omp_parallel_sections_substmt_not_section : Error< - "statement in 'omp parallel sections' directive must be enclosed into a section region">; + "statement in 'omp %0' directive must be enclosed into a section region">; def err_omp_parallel_reduction_in_task_firstprivate : Error< "argument of a reduction clause of a %0 construct must not appear in a firstprivate clause on a task construct">; def err_omp_atomic_read_not_expression_statement : Error< diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 7697246ea5e59..ce4e7a1a4cb49 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -3010,6 +3010,28 @@ static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV, Expr *NumIterations, Sema &SemaRef, Scope *S, DSAStackTy *Stack); +static bool finishLinearClauses(Sema &SemaRef, ArrayRef<OMPClause *> Clauses, + OMPLoopBasedDirective::HelperExprs &B, + DSAStackTy *Stack) { + assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && + "loop exprs were not built"); + + if (SemaRef.CurContext->isDependentContext()) + return false; + + // Finalize the clauses that need pre-built expressions for CodeGen. + for (OMPClause *C : Clauses) { + if (auto *LC = dyn_cast<OMPLinearClause>(C)) { + if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), + B.NumIterations, SemaRef, + SemaRef.getCurScope(), Stack)) + return true; + } + } + + return false; +} + namespace { class VarDeclFilterCCC final : public CorrectionCandidateCallback { @@ -7994,13 +8016,9 @@ void SemaOpenMP::ActOnOpenMPDeclareVariantDirective( FD->addAttr(NewAttr); } -StmtResult -SemaOpenMP::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses, - Stmt *AStmt, SourceLocation StartLoc, - SourceLocation EndLoc) { - if (!AStmt) - return StmtError(); - +static CapturedStmt * +setBranchProtectedScope(Sema &SemaRef, OpenMPDirectiveKind DKind, Stmt *AStmt) { + assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); auto *CS = cast<CapturedStmt>(AStmt); // 1.2.2 OpenMP Language Terminology // Structured block - An executable statement with a single entry at the @@ -8009,7 +8027,28 @@ SemaOpenMP::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses, // longjmp() and throw() must not violate the entry/exit criteria. CS->getCapturedDecl()->setNothrow(); + for (int ThisCaptureLevel = SemaRef.OpenMP().getOpenMPCaptureLevels(DKind); + ThisCaptureLevel > 1; --ThisCaptureLevel) { + CS = cast<CapturedStmt>(CS->getCapturedStmt()); + // 1.2.2 OpenMP Language Terminology + // Structured block - An executable statement with a single entry at the + // top and a single exit at the bottom. + // The point of exit cannot be a branch out of the structured block. + // longjmp() and throw() must not violate the entry/exit criteria. + CS->getCapturedDecl()->setNothrow(); + } SemaRef.setFunctionHasBranchProtectedScope(); + return CS; +} + +StmtResult +SemaOpenMP::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses, + Stmt *AStmt, SourceLocation StartLoc, + SourceLocation EndLoc) { + if (!AStmt) + return StmtError(); + + setBranchProtectedScope(SemaRef, OMPD_parallel, AStmt); return OMPParallelDirective::Create( getASTContext(), StartLoc, EndLoc, Clauses, AStmt, @@ -10678,19 +10717,8 @@ StmtResult SemaOpenMP::ActOnOpenMPSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp simd loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); @@ -10721,19 +10749,8 @@ StmtResult SemaOpenMP::ActOnOpenMPForDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); auto *ForDirective = OMPForDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, @@ -10759,19 +10776,8 @@ StmtResult SemaOpenMP::ActOnOpenMPForSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for simd loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); @@ -10781,12 +10787,10 @@ StmtResult SemaOpenMP::ActOnOpenMPForSimdDirective( NestedLoopCount, Clauses, AStmt, B); } -StmtResult -SemaOpenMP::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses, - Stmt *AStmt, SourceLocation StartLoc, - SourceLocation EndLoc) { +static bool checkSectionsDirective(Sema &SemaRef, OpenMPDirectiveKind DKind, + Stmt *AStmt, DSAStackTy *Stack) { if (!AStmt) - return StmtError(); + return true; assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); auto BaseStmt = AStmt; @@ -10795,23 +10799,34 @@ SemaOpenMP::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses, if (auto *C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) { auto S = C->children(); if (S.begin() == S.end()) - return StmtError(); + return true; // All associated statements must be '#pragma omp section' except for // the first one. for (Stmt *SectionStmt : llvm::drop_begin(S)) { if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) { if (SectionStmt) - Diag(SectionStmt->getBeginLoc(), - diag::err_omp_sections_substmt_not_section); - return StmtError(); + SemaRef.Diag(SectionStmt->getBeginLoc(), + diag::err_omp_sections_substmt_not_section) + << getOpenMPDirectiveName(DKind); + return true; } cast<OMPSectionDirective>(SectionStmt) - ->setHasCancel(DSAStack->isCancelRegion()); + ->setHasCancel(Stack->isCancelRegion()); } } else { - Diag(AStmt->getBeginLoc(), diag::err_omp_sections_not_compound_stmt); - return StmtError(); + SemaRef.Diag(AStmt->getBeginLoc(), diag::err_omp_sections_not_compound_stmt) + << getOpenMPDirectiveName(DKind); + return true; } + return false; +} + +StmtResult +SemaOpenMP::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses, + Stmt *AStmt, SourceLocation StartLoc, + SourceLocation EndLoc) { + if (checkSectionsDirective(SemaRef, OMPD_sections, AStmt, DSAStack)) + return StmtError(); SemaRef.setFunctionHasBranchProtectedScope(); @@ -10928,13 +10943,7 @@ StmtResult SemaOpenMP::ActOnOpenMPGenericLoopDirective( if (checkGenericLoopLastprivate(SemaRef, Clauses, OMPD_loop, DSAStack)) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); + setBranchProtectedScope(SemaRef, OMPD_loop, AStmt); OMPLoopDirective::HelperExprs B; // In presence of clause 'collapse', it will define the nested loops number. @@ -10947,7 +10956,6 @@ StmtResult SemaOpenMP::ActOnOpenMPGenericLoopDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPGenericLoopDirective::Create(getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -10964,23 +10972,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsGenericLoopDirective( if (checkGenericLoopLastprivate(SemaRef, Clauses, OMPD_teams_loop, DSAStack)) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_teams_loop); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope(SemaRef, OMPD_teams_loop, AStmt); OMPLoopDirective::HelperExprs B; // In presence of clause 'collapse', it will define the nested loops number. @@ -10994,7 +10986,6 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsGenericLoopDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); DSAStack->setParentTeamsRegionLoc(StartLoc); return OMPTeamsGenericLoopDirective::Create( @@ -11014,23 +11005,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsGenericLoopDirective( DSAStack)) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_teams_loop); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_target_teams_loop, AStmt); OMPLoopDirective::HelperExprs B; // In presence of clause 'collapse', it will define the nested loops number. @@ -11044,8 +11020,6 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsGenericLoopDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); - return OMPTargetTeamsGenericLoopDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, teamsLoopCanBeParallelFor(AStmt, SemaRef)); @@ -11064,23 +11038,7 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelGenericLoopDirective( DSAStack)) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_parallel_loop); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope(SemaRef, OMPD_parallel_loop, AStmt); OMPLoopDirective::HelperExprs B; // In presence of clause 'collapse', it will define the nested loops number. @@ -11094,8 +11052,6 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelGenericLoopDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); - return OMPParallelGenericLoopDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -11113,23 +11069,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetParallelGenericLoopDirective( DSAStack)) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_parallel_loop); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_target_parallel_loop, AStmt); OMPLoopDirective::HelperExprs B; // In presence of clause 'collapse', it will define the nested loops number. @@ -11143,8 +11084,6 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetParallelGenericLoopDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); - return OMPTargetParallelGenericLoopDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -11268,13 +11207,7 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelForDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); + setBranchProtectedScope(SemaRef, OMPD_parallel_for, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' or 'ordered' with number of loops, it will @@ -11286,21 +11219,9 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelForDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp parallel for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPParallelForDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->getTaskgroupReductionRef(), DSAStack->isCancelRegion()); @@ -11312,13 +11233,7 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelForSimdDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); + setBranchProtectedScope(SemaRef, OMPD_parallel_for_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' or 'ordered' with number of loops, it will @@ -11330,21 +11245,12 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelForSimdDirective( if (NestedLoop... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/96811 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits