https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/97110
>From 789ec614d285e3fe632aae6280f6c4cf01746cdf Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Fri, 28 Jun 2024 12:27:10 -0500 Subject: [PATCH 01/10] [clang][OpenMP] Implement `isOpenMPExecutableDirective` What is considered "executable" in clang differs slightly from the OpenMP's "executable" category. In addition to the executable category, subsidiary directives, and OMPD_error are considered executable. Implement a function that performs that check. --- clang/include/clang/Basic/OpenMPKinds.h | 8 ++++++++ clang/lib/Basic/OpenMPKinds.cpp | 7 +++++++ clang/lib/Parse/ParseOpenMP.cpp | 6 ++---- clang/lib/Sema/SemaOpenMP.cpp | 2 ++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/Basic/OpenMPKinds.h b/clang/include/clang/Basic/OpenMPKinds.h index d127498774c7f..6d9d6ebc58e2c 100644 --- a/clang/include/clang/Basic/OpenMPKinds.h +++ b/clang/include/clang/Basic/OpenMPKinds.h @@ -368,6 +368,14 @@ bool needsTaskBasedThreadLimit(OpenMPDirectiveKind DKind); /// is restricted only to memory order clauses of "OMPC_acquire", /// "OMPC_relaxed" and "OMPC_seq_cst". bool checkFailClauseParameter(OpenMPClauseKind FailClauseParameter); + +/// Checks if the specified directive is considered as "executable". This +/// combines the OpenMP categories of "executable" and "subsidiary", plus +/// any other directives that are should be treated as executable. +/// \param DKind Specified directive. +/// \return true - if the above condition is met for this directive +/// otherwise - false. +bool isOpenMPExecutableDirective(OpenMPDirectiveKind DKind); } #endif diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index b3e9affbb3e58..7c8990880fae3 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -702,6 +702,13 @@ bool clang::needsTaskBasedThreadLimit(OpenMPDirectiveKind DKind) { DKind == OMPD_target_parallel_loop; } +bool clang::isOpenMPExecutableDirective(OpenMPDirectiveKind DKind) { + if (DKind == OMPD_error) + return true; + Category Cat = getDirectiveCategory(DKind); + return Cat == Category::Executable || Cat == Category::Subsidiary; +} + void clang::getOpenMPCaptureRegions( SmallVectorImpl<OpenMPDirectiveKind> &CaptureRegions, OpenMPDirectiveKind DKind) { diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 00f9ebb65d876..326cd22ff9005 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -2397,10 +2397,8 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl( StmtResult Parser::ParseOpenMPExecutableDirective( ParsedStmtContext StmtCtx, OpenMPDirectiveKind DKind, SourceLocation Loc, bool ReadDirectiveWithinMetadirective) { - assert((DKind == OMPD_error || - getDirectiveCategory(DKind) == Category::Executable || - getDirectiveCategory(DKind) == Category::Subsidiary) && - "Directive with an unexpected category"); + assert(isOpenMPExecutableDirective(DKind) && "Unexpected directive category"); + bool HasAssociatedStatement = true; Association Assoc = getDirectiveAssociation(DKind); diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 29104b2c0de94..b17c7e2be968e 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -6357,6 +6357,8 @@ StmtResult SemaOpenMP::ActOnOpenMPExecutableDirective( OpenMPDirectiveKind CancelRegion, ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc, OpenMPDirectiveKind PrevMappedDirective) { + assert(isOpenMPExecutableDirective(Kind) && "Unexpected directive category"); + StmtResult Res = StmtError(); OpenMPBindClauseKind BindKind = OMPC_BIND_unknown; llvm::SmallVector<OMPClause *> ClausesWithoutBind; >From 0ee7c0154dee86e25c05f09828637eaf9bb8ec27 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Fri, 28 Jun 2024 12:31:35 -0500 Subject: [PATCH 02/10] [clang][OpenMP] Implement `isOpenMPCapturingDirective` Check if the given directive can capture variables, and thus needs a captured statement. Simplify some code using this function. --- clang/include/clang/Basic/OpenMPKinds.h | 6 +++ clang/lib/Basic/OpenMPKinds.cpp | 66 +++++++++++++------------ clang/lib/Sema/SemaOpenMP.cpp | 14 +----- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/clang/include/clang/Basic/OpenMPKinds.h b/clang/include/clang/Basic/OpenMPKinds.h index 6d9d6ebc58e2c..3f21766f392cf 100644 --- a/clang/include/clang/Basic/OpenMPKinds.h +++ b/clang/include/clang/Basic/OpenMPKinds.h @@ -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 need to capture variables. +/// \param DKind Specified directive. +/// \return true - if the above condition is met for this directive +/// otherwise - false. +bool isOpenMPCapturingDirective(OpenMPDirectiveKind DKind); } #endif diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index 7c8990880fae3..30c34c207ae23 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -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)); + 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"); } } diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index b17c7e2be968e..a741339a7d669 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -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)) @@ -6400,9 +6392,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. >From c9015325dcf0444907fa5b94cb37c5f7f42020a7 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Fri, 28 Jun 2024 13:00:41 -0500 Subject: [PATCH 03/10] fix typo --- clang/include/clang/Basic/OpenMPKinds.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/OpenMPKinds.h b/clang/include/clang/Basic/OpenMPKinds.h index 3f21766f392cf..123f8fe9f2d1c 100644 --- a/clang/include/clang/Basic/OpenMPKinds.h +++ b/clang/include/clang/Basic/OpenMPKinds.h @@ -377,7 +377,7 @@ bool checkFailClauseParameter(OpenMPClauseKind FailClauseParameter); /// otherwise - false. bool isOpenMPExecutableDirective(OpenMPDirectiveKind DKind); -/// Checks if the specified directive need to capture variables. +/// 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. >From 1d5ca2e5309924bc9d4e1bf1f382b08ad6b20805 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Fri, 28 Jun 2024 13:22:11 -0500 Subject: [PATCH 04/10] Fix wording --- clang/include/clang/Basic/OpenMPKinds.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/OpenMPKinds.h b/clang/include/clang/Basic/OpenMPKinds.h index 6d9d6ebc58e2c..29a852d666511 100644 --- a/clang/include/clang/Basic/OpenMPKinds.h +++ b/clang/include/clang/Basic/OpenMPKinds.h @@ -371,7 +371,7 @@ bool checkFailClauseParameter(OpenMPClauseKind FailClauseParameter); /// Checks if the specified directive is considered as "executable". This /// combines the OpenMP categories of "executable" and "subsidiary", plus -/// any other directives that are should be treated as executable. +/// any other directives that should be treated as executable. /// \param DKind Specified directive. /// \return true - if the above condition is met for this directive /// otherwise - false. >From 2d25e0d32672ecae3dc3ad42c50446e651eceb06 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Fri, 28 Jun 2024 15:27:42 -0500 Subject: [PATCH 05/10] [clang][OpenMP] Rewrite `getOpenMPCaptureRegions` in term of leafs Replace the switch in `getOpenMPCaptureRegions` with a loop collecting capture regions based on the constituent directives. --- clang/lib/Basic/OpenMPKinds.cpp | 170 ++++++++++++++------------------ 1 file changed, 72 insertions(+), 98 deletions(-) diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index 30c34c207ae23..152891dfa27dc 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -747,105 +747,79 @@ void clang::getOpenMPCaptureRegions( assert(unsigned(DKind) < llvm::omp::Directive_enumSize); assert(isOpenMPCapturingDirective(DKind)); - switch (DKind) { - case OMPD_metadirective: - CaptureRegions.push_back(OMPD_metadirective); - break; - case OMPD_parallel: - case OMPD_parallel_for: - case OMPD_parallel_for_simd: - case OMPD_parallel_master: - case OMPD_parallel_masked: - case OMPD_parallel_sections: - case OMPD_distribute_parallel_for: - case OMPD_distribute_parallel_for_simd: - case OMPD_parallel_loop: - CaptureRegions.push_back(OMPD_parallel); - break; - case OMPD_target_teams: - case OMPD_target_teams_distribute: - case OMPD_target_teams_distribute_simd: - CaptureRegions.push_back(OMPD_task); - CaptureRegions.push_back(OMPD_target); - CaptureRegions.push_back(OMPD_teams); - break; - case OMPD_teams: - case OMPD_teams_distribute: - case OMPD_teams_distribute_simd: - CaptureRegions.push_back(OMPD_teams); - break; - case OMPD_target: - case OMPD_target_simd: - CaptureRegions.push_back(OMPD_task); - CaptureRegions.push_back(OMPD_target); - break; - case OMPD_teams_loop: - case OMPD_teams_distribute_parallel_for: - case OMPD_teams_distribute_parallel_for_simd: - CaptureRegions.push_back(OMPD_teams); - CaptureRegions.push_back(OMPD_parallel); - break; - case OMPD_target_parallel: - case OMPD_target_parallel_for: - case OMPD_target_parallel_for_simd: - case OMPD_target_parallel_loop: - CaptureRegions.push_back(OMPD_task); - CaptureRegions.push_back(OMPD_target); - CaptureRegions.push_back(OMPD_parallel); - break; - case OMPD_task: - case OMPD_target_enter_data: - case OMPD_target_exit_data: - case OMPD_target_update: - CaptureRegions.push_back(OMPD_task); - break; - case OMPD_taskloop: - case OMPD_taskloop_simd: - case OMPD_master_taskloop: - case OMPD_master_taskloop_simd: - case OMPD_masked_taskloop: - case OMPD_masked_taskloop_simd: - CaptureRegions.push_back(OMPD_taskloop); - break; - case OMPD_parallel_masked_taskloop: - case OMPD_parallel_masked_taskloop_simd: - case OMPD_parallel_master_taskloop: - case OMPD_parallel_master_taskloop_simd: - CaptureRegions.push_back(OMPD_parallel); - CaptureRegions.push_back(OMPD_taskloop); - break; - case OMPD_target_teams_loop: - case OMPD_target_teams_distribute_parallel_for: - case OMPD_target_teams_distribute_parallel_for_simd: - CaptureRegions.push_back(OMPD_task); - CaptureRegions.push_back(OMPD_target); - CaptureRegions.push_back(OMPD_teams); - CaptureRegions.push_back(OMPD_parallel); - break; - case OMPD_nothing: - CaptureRegions.push_back(OMPD_nothing); - break; - case OMPD_loop: - // TODO: 'loop' may require different capture regions depending on the bind - // clause or the parent directive when there is no bind clause. Use - // OMPD_unknown for now. - case OMPD_simd: - case OMPD_for: - case OMPD_for_simd: - case OMPD_sections: - case OMPD_single: - case OMPD_taskgroup: - case OMPD_distribute: - case OMPD_ordered: - case OMPD_target_data: - case OMPD_distribute_simd: - case OMPD_scope: - case OMPD_dispatch: + auto getRegionsForLeaf = [&](OpenMPDirectiveKind LKind) { + assert(isLeafConstruct(LKind) && "Epecting leaf directive"); + switch (LKind) { + case OMPD_metadirective: + CaptureRegions.push_back(OMPD_metadirective); + break; + case OMPD_nothing: + CaptureRegions.push_back(OMPD_nothing); + break; + case OMPD_parallel: + CaptureRegions.push_back(OMPD_parallel); + break; + case OMPD_target: + CaptureRegions.push_back(OMPD_task); + CaptureRegions.push_back(OMPD_target); + break; + case OMPD_task: + case OMPD_target_enter_data: + case OMPD_target_exit_data: + case OMPD_target_update: + CaptureRegions.push_back(OMPD_task); + break; + case OMPD_teams: + CaptureRegions.push_back(OMPD_teams); + break; + case OMPD_taskloop: + CaptureRegions.push_back(OMPD_taskloop); + break; + case OMPD_loop: + // TODO: 'loop' may require different capture regions depending on the + // bind clause or the parent directive when there is no bind clause. + // If any of the directives that push regions here are parents of 'loop', + // assume 'parallel'. Otherwise do nothing. + if (!CaptureRegions.empty() && + !llvm::is_contained(CaptureRegions, OMPD_parallel)) + CaptureRegions.push_back(OMPD_parallel); + break; + case OMPD_dispatch: + case OMPD_distribute: + case OMPD_for: + case OMPD_masked: + case OMPD_master: + case OMPD_ordered: + case OMPD_scope: + case OMPD_sections: + case OMPD_simd: + case OMPD_single: + case OMPD_target_data: + case OMPD_taskgroup: + // These directives (when standalone) use OMPD_unknown as the region, + // but when they're constituents of a compound directive, and other + // leafs from that directive have specific regions, then these directives + // add no additional regions. + break; + default: + llvm::errs() << getOpenMPDirectiveName(LKind) << '\n'; + llvm_unreachable("Unexpected directive"); + } + }; + + for (OpenMPDirectiveKind L : getLeafConstructsOrSelf(DKind)) + getRegionsForLeaf(L); + + // If no regions were added, then only the leafs using "unknown" were + // present. Push a single OMPD_unknown as the capture region. + if (CaptureRegions.empty()) CaptureRegions.push_back(OMPD_unknown); - break; - default: - llvm_unreachable("Unhandled OpenMP directive"); - } + + // OMPD_unknown is only expected as the only region. If other regions + // are present OMPD_unknown should not be present. + assert((CaptureRegions[0] == OMPD_unknown || + !llvm::is_contained(CaptureRegions, OMPD_unknown)) && + "Misplaced OMPD_unknown"); } bool clang::checkFailClauseParameter(OpenMPClauseKind FailClauseParameter) { >From 3753e4cdf8e2aa9b1af2ba7a88cfecae842d2e7f Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Mon, 1 Jul 2024 08:17:30 -0500 Subject: [PATCH 06/10] Add assertion message --- clang/lib/Basic/OpenMPKinds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index 30c34c207ae23..df172dce30058 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -745,7 +745,7 @@ void clang::getOpenMPCaptureRegions( SmallVectorImpl<OpenMPDirectiveKind> &CaptureRegions, OpenMPDirectiveKind DKind) { assert(unsigned(DKind) < llvm::omp::Directive_enumSize); - assert(isOpenMPCapturingDirective(DKind)); + assert(isOpenMPCapturingDirective(DKind) && "Expecting capturing directive"); switch (DKind) { case OMPD_metadirective: >From 338ba0bfb464b14b9e184e0abed6050b6de8136e Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Mon, 1 Jul 2024 15:43:06 -0500 Subject: [PATCH 07/10] Capitalize name, add explicit check for the need of OMPD_unknown --- clang/lib/Basic/OpenMPKinds.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index 8e15f69bde5b0..6c596425aca2f 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -747,8 +747,10 @@ void clang::getOpenMPCaptureRegions( assert(unsigned(DKind) < llvm::omp::Directive_enumSize); assert(isOpenMPCapturingDirective(DKind) && "Expecting capturing directive"); - auto getRegionsForLeaf = [&](OpenMPDirectiveKind LKind) { + auto GetRegionsForLeaf = [&](OpenMPDirectiveKind LKind) { assert(isLeafConstruct(LKind) && "Epecting leaf directive"); + // Whether a leaf would require OMPD_unknown if it occured on its own. + bool MayNeedUnknownRegion = false; switch (LKind) { case OMPD_metadirective: CaptureRegions.push_back(OMPD_metadirective); @@ -783,6 +785,8 @@ void clang::getOpenMPCaptureRegions( if (!CaptureRegions.empty() && !llvm::is_contained(CaptureRegions, OMPD_parallel)) CaptureRegions.push_back(OMPD_parallel); + else + MayNeedUnknownRegion = true; break; case OMPD_dispatch: case OMPD_distribute: @@ -800,19 +804,23 @@ void clang::getOpenMPCaptureRegions( // but when they're constituents of a compound directive, and other // leafs from that directive have specific regions, then these directives // add no additional regions. + MayNeedUnknownRegion = true; break; default: llvm::errs() << getOpenMPDirectiveName(LKind) << '\n'; llvm_unreachable("Unexpected directive"); } + return MayNeedUnknownRegion; }; + bool MayNeedUnknownRegion = false; for (OpenMPDirectiveKind L : getLeafConstructsOrSelf(DKind)) - getRegionsForLeaf(L); + MayNeedUnknownRegion |= GetRegionsForLeaf(L); - // If no regions were added, then only the leafs using "unknown" were - // present. Push a single OMPD_unknown as the capture region. - if (CaptureRegions.empty()) + // We need OMPD_unknown when no regions were added, and specific leaf + // constructs were present. Push a single OMPD_unknown as the capture + /// region. + if (CaptureRegions.empty() && MayNeedUnknownRegion) CaptureRegions.push_back(OMPD_unknown); // OMPD_unknown is only expected as the only region. If other regions >From 4c167a2211f2959a0f3aa34151285ff5e14d8a61 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Mon, 1 Jul 2024 16:05:59 -0500 Subject: [PATCH 08/10] Update clang/lib/Basic/OpenMPKinds.cpp Co-authored-by: Alexey Bataev <a.bat...@outlook.com> --- clang/lib/Basic/OpenMPKinds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index 6c596425aca2f..c5f6ab2254aa5 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -786,7 +786,7 @@ void clang::getOpenMPCaptureRegions( !llvm::is_contained(CaptureRegions, OMPD_parallel)) CaptureRegions.push_back(OMPD_parallel); else - MayNeedUnknownRegion = true; + return true; break; case OMPD_dispatch: case OMPD_distribute: >From f6297d01a4159f14c4137713d3aa815dc5095096 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Mon, 1 Jul 2024 16:06:12 -0500 Subject: [PATCH 09/10] Update clang/lib/Basic/OpenMPKinds.cpp Co-authored-by: Alexey Bataev <a.bat...@outlook.com> --- clang/lib/Basic/OpenMPKinds.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index c5f6ab2254aa5..6628fa6a78430 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -804,8 +804,7 @@ void clang::getOpenMPCaptureRegions( // but when they're constituents of a compound directive, and other // leafs from that directive have specific regions, then these directives // add no additional regions. - MayNeedUnknownRegion = true; - break; + return true; default: llvm::errs() << getOpenMPDirectiveName(LKind) << '\n'; llvm_unreachable("Unexpected directive"); >From 73b712ea0b2df7019b27ec3fe0cea0c8d19bb72b Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Mon, 1 Jul 2024 16:06:22 -0500 Subject: [PATCH 10/10] Update clang/lib/Basic/OpenMPKinds.cpp Co-authored-by: Alexey Bataev <a.bat...@outlook.com> --- clang/lib/Basic/OpenMPKinds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index 6628fa6a78430..56070d621d07f 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -809,7 +809,7 @@ void clang::getOpenMPCaptureRegions( llvm::errs() << getOpenMPDirectiveName(LKind) << '\n'; llvm_unreachable("Unexpected directive"); } - return MayNeedUnknownRegion; + return false; }; bool MayNeedUnknownRegion = false; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits