[clang][OpenMP] Implement isOpenMPCapturingDirective (#97090)

Check if the given directive can capture variables, and thus needs a
captured statement.

Simplify some code using this function.
This commit is contained in:
Krzysztof Parzyszek
2024-07-01 15:46:04 -05:00
committed by GitHub
parent 781ba3c6b0
commit deda50fd79
3 changed files with 43 additions and 43 deletions

View File

@@ -376,6 +376,12 @@ bool checkFailClauseParameter(OpenMPClauseKind FailClauseParameter);
/// \return true - if the above condition is met for this directive
/// otherwise - false.
bool isOpenMPExecutableDirective(OpenMPDirectiveKind DKind);
/// Checks if the specified directive can capture variables.
/// \param DKind Specified directive.
/// \return true - if the above condition is met for this directive
/// otherwise - false.
bool isOpenMPCapturingDirective(OpenMPDirectiveKind DKind);
}
#endif

View File

@@ -709,10 +709,44 @@ bool clang::isOpenMPExecutableDirective(OpenMPDirectiveKind DKind) {
return Cat == Category::Executable || Cat == Category::Subsidiary;
}
bool clang::isOpenMPCapturingDirective(OpenMPDirectiveKind DKind) {
if (isOpenMPExecutableDirective(DKind)) {
switch (DKind) {
case OMPD_atomic:
case OMPD_barrier:
case OMPD_cancel:
case OMPD_cancellation_point:
case OMPD_critical:
case OMPD_depobj:
case OMPD_error:
case OMPD_flush:
case OMPD_masked:
case OMPD_master:
case OMPD_section:
case OMPD_taskwait:
case OMPD_taskyield:
return false;
default:
return !isOpenMPLoopTransformationDirective(DKind);
}
}
// Non-executable directives.
switch (DKind) {
case OMPD_metadirective:
case OMPD_nothing:
return true;
default:
break;
}
return false;
}
void clang::getOpenMPCaptureRegions(
SmallVectorImpl<OpenMPDirectiveKind> &CaptureRegions,
OpenMPDirectiveKind DKind) {
assert(unsigned(DKind) < llvm::omp::Directive_enumSize);
assert(isOpenMPCapturingDirective(DKind) && "Expecting capturing directive");
switch (DKind) {
case OMPD_metadirective:
CaptureRegions.push_back(OMPD_metadirective);
@@ -799,48 +833,18 @@ void clang::getOpenMPCaptureRegions(
case OMPD_for:
case OMPD_for_simd:
case OMPD_sections:
case OMPD_section:
case OMPD_single:
case OMPD_master:
case OMPD_critical:
case OMPD_taskgroup:
case OMPD_distribute:
case OMPD_ordered:
case OMPD_atomic:
case OMPD_target_data:
case OMPD_distribute_simd:
case OMPD_scope:
case OMPD_dispatch:
CaptureRegions.push_back(OMPD_unknown);
break;
case OMPD_tile:
case OMPD_unroll:
// loop transformations do not introduce captures.
break;
case OMPD_threadprivate:
case OMPD_allocate:
case OMPD_taskyield:
case OMPD_barrier:
case OMPD_error:
case OMPD_taskwait:
case OMPD_cancellation_point:
case OMPD_cancel:
case OMPD_flush:
case OMPD_depobj:
case OMPD_scan:
case OMPD_declare_reduction:
case OMPD_declare_mapper:
case OMPD_declare_simd:
case OMPD_declare_target:
case OMPD_end_declare_target:
case OMPD_requires:
case OMPD_declare_variant:
case OMPD_begin_declare_variant:
case OMPD_end_declare_variant:
llvm_unreachable("OpenMP Directive is not allowed");
case OMPD_unknown:
default:
llvm_unreachable("Unknown OpenMP directive");
llvm_unreachable("Unhandled OpenMP directive");
}
}

View File

@@ -4862,11 +4862,7 @@ StmtResult SemaOpenMP::ActOnOpenMPRegionEnd(StmtResult S,
ArrayRef<OMPClause *> Clauses) {
handleDeclareVariantConstructTrait(DSAStack, DSAStack->getCurrentDirective(),
/* ScopeEntry */ false);
if (DSAStack->getCurrentDirective() == OMPD_atomic ||
DSAStack->getCurrentDirective() == OMPD_critical ||
DSAStack->getCurrentDirective() == OMPD_section ||
DSAStack->getCurrentDirective() == OMPD_master ||
DSAStack->getCurrentDirective() == OMPD_masked)
if (!isOpenMPCapturingDirective(DSAStack->getCurrentDirective()))
return S;
bool ErrorFound = false;
@@ -4909,10 +4905,6 @@ StmtResult SemaOpenMP::ActOnOpenMPRegionEnd(StmtResult S,
}
}
DSAStack->setForceVarCapturing(/*V=*/false);
} else if (isOpenMPLoopTransformationDirective(
DSAStack->getCurrentDirective())) {
assert(CaptureRegions.empty() &&
"No captured regions in loop transformation directives.");
} else if (CaptureRegions.size() > 1 ||
CaptureRegions.back() != OMPD_unknown) {
if (auto *C = OMPClauseWithPreInit::get(Clause))
@@ -6396,9 +6388,7 @@ StmtResult SemaOpenMP::ActOnOpenMPExecutableDirective(
ClausesWithImplicit.append(Clauses.begin(), Clauses.end());
}
if (AStmt && !SemaRef.CurContext->isDependentContext() &&
Kind != OMPD_atomic && Kind != OMPD_critical && Kind != OMPD_section &&
Kind != OMPD_master && Kind != OMPD_masked &&
!isOpenMPLoopTransformationDirective(Kind)) {
isOpenMPCapturingDirective(Kind)) {
assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
// Check default data sharing attributes for referenced variables.