[clang] [clang][OpenMP] Place some common code in functions (PR #96811)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 26 12:08:38 PDT 2024
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
More information about the cfe-commits
mailing list