Author: Chi Chun Chen Date: 2023-10-26T16:57:36-05:00 New Revision: 391181062f8d1b9277a9068a7edf41be721ca5cf
URL: https://github.com/llvm/llvm-project/commit/391181062f8d1b9277a9068a7edf41be721ca5cf DIFF: https://github.com/llvm/llvm-project/commit/391181062f8d1b9277a9068a7edf41be721ca5cf.diff LOG: Revert "[OpenMP] Patch for Support to loop bind clause : Checking Parent Region" This reverts commit 85f6b2fac9a367337e43ca288c45ea783981cc16. Added: Modified: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/loop_bind_messages.cpp clang/test/PCH/pragma-loop.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 18ac85011aa752a..1e9752345ffd173 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -11307,7 +11307,6 @@ class Sema final { /// on the parameter of the bind clause. In the methods for the /// mapped directives, check the parameters of the lastprivate clause. bool checkLastPrivateForMappedDirectives(ArrayRef<OMPClause *> Clauses); - /// Depending on the bind clause of OMPD_loop map the directive to new /// directives. /// 1) loop bind(parallel) --> OMPD_for @@ -11317,12 +11316,9 @@ class Sema final { /// rigorous semantic checking in the new mapped directives. bool mapLoopConstruct(llvm::SmallVector<OMPClause *> &ClausesWithoutBind, ArrayRef<OMPClause *> Clauses, - OpenMPBindClauseKind &BindKind, + OpenMPBindClauseKind BindKind, OpenMPDirectiveKind &Kind, - OpenMPDirectiveKind &PrevMappedDirective, - SourceLocation StartLoc, SourceLocation EndLoc, - const DeclarationNameInfo &DirName, - OpenMPDirectiveKind CancelRegion); + OpenMPDirectiveKind &PrevMappedDirective); public: /// The declarator \p D defines a function in the scope \p S which is nested diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index f28e0f2693080c1..75f9e152dca9297 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -5062,18 +5062,6 @@ static bool checkNestingOfRegions(Sema &SemaRef, const DSAStackTy *Stack, CurrentRegion != OMPD_cancellation_point && CurrentRegion != OMPD_cancel && CurrentRegion != OMPD_scan) return false; - // Checks needed for mapping "loop" construct. Please check mapLoopConstruct - // for a detailed explanation - if (SemaRef.LangOpts.OpenMP >= 50 && CurrentRegion == OMPD_loop && - ((BindKind == OMPC_BIND_parallel) || (BindKind == OMPC_BIND_teams)) && - (isOpenMPWorksharingDirective(ParentRegion) || - ParentRegion == OMPD_loop)) { - int ErrorMsgNumber = (BindKind == OMPC_BIND_parallel) ? 1 : 4; - SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region) - << true << getOpenMPDirectiveName(ParentRegion) << ErrorMsgNumber - << getOpenMPDirectiveName(CurrentRegion); - return true; - } if (CurrentRegion == OMPD_cancellation_point || CurrentRegion == OMPD_cancel) { // OpenMP [2.16, Nesting of Regions] @@ -6126,40 +6114,35 @@ processImplicitMapsWithDefaultMappers(Sema &S, DSAStackTy *Stack, bool Sema::mapLoopConstruct(llvm::SmallVector<OMPClause *> &ClausesWithoutBind, ArrayRef<OMPClause *> Clauses, - OpenMPBindClauseKind &BindKind, + OpenMPBindClauseKind BindKind, OpenMPDirectiveKind &Kind, - OpenMPDirectiveKind &PrevMappedDirective, - SourceLocation StartLoc, SourceLocation EndLoc, - const DeclarationNameInfo &DirName, - OpenMPDirectiveKind CancelRegion) { + OpenMPDirectiveKind &PrevMappedDirective) { bool UseClausesWithoutBind = false; // Restricting to "#pragma omp loop bind" if (getLangOpts().OpenMP >= 50 && Kind == OMPD_loop) { - - const OpenMPDirectiveKind ParentDirective = DSAStack->getParentDirective(); - if (BindKind == OMPC_BIND_unknown) { // Setting the enclosing teams or parallel construct for the loop // directive without bind clause. BindKind = OMPC_BIND_thread; // Default bind(thread) if binding is unknown + const OpenMPDirectiveKind ParentDirective = + DSAStack->getParentDirective(); if (ParentDirective == OMPD_unknown) { Diag(DSAStack->getDefaultDSALocation(), diag::err_omp_bind_required_on_loop); - } else if (isOpenMPParallelDirective(ParentDirective) && - !isOpenMPTeamsDirective(ParentDirective)) { + } else if (ParentDirective == OMPD_parallel || + ParentDirective == OMPD_target_parallel) { BindKind = OMPC_BIND_parallel; - } else if (isOpenMPNestingTeamsDirective(ParentDirective) || - (ParentDirective == OMPD_target_teams)) { + } else if (ParentDirective == OMPD_teams || + ParentDirective == OMPD_target_teams) { BindKind = OMPC_BIND_teams; } } else { - // bind clause is present in loop directive. When the loop directive is - // changed to a new directive the bind clause is not used. So, we should - // set flag indicating to only use the clauses that aren't the - // bind clause. + // bind clause is present, so we should set flag indicating to only + // use the clauses that aren't the bind clause for the new directive that + // loop is lowered to. UseClausesWithoutBind = true; } @@ -6220,35 +6203,26 @@ StmtResult Sema::ActOnOpenMPExecutableDirective( OpenMPDirectiveKind PrevMappedDirective) { StmtResult Res = StmtError(); OpenMPBindClauseKind BindKind = OMPC_BIND_unknown; - llvm::SmallVector<OMPClause *> ClausesWithoutBind; - bool UseClausesWithoutBind = false; - if (const OMPBindClause *BC = OMPExecutableDirective::getSingleClause<OMPBindClause>(Clauses)) BindKind = BC->getBindKind(); - - // Variable used to note down the DirectiveKind because mapLoopConstruct may - // change "Kind" variable, due to mapping of "omp loop" to other directives. - OpenMPDirectiveKind DK = Kind; - if ((Kind == OMPD_loop) || (PrevMappedDirective == OMPD_loop)) { - UseClausesWithoutBind = mapLoopConstruct( - ClausesWithoutBind, Clauses, BindKind, Kind, PrevMappedDirective, - StartLoc, EndLoc, DirName, CancelRegion); - DK = OMPD_loop; - } - // First check CancelRegion which is then used in checkNestingOfRegions. if (checkCancelRegion(*this, Kind, CancelRegion, StartLoc) || - checkNestingOfRegions(*this, DSAStack, DK, DirName, CancelRegion, - BindKind, StartLoc)) { + checkNestingOfRegions(*this, DSAStack, Kind, DirName, CancelRegion, + BindKind, StartLoc)) return StmtError(); - } // Report affected OpenMP target offloading behavior when in HIP lang-mode. if (getLangOpts().HIP && (isOpenMPTargetExecutionDirective(Kind) || isOpenMPTargetDataManagementDirective(Kind))) Diag(StartLoc, diag::warn_hip_omp_target_directives); + llvm::SmallVector<OMPClause *> ClausesWithoutBind; + bool UseClausesWithoutBind = false; + + UseClausesWithoutBind = mapLoopConstruct(ClausesWithoutBind, Clauses, + BindKind, Kind, PrevMappedDirective); + llvm::SmallVector<OMPClause *, 8> ClausesWithImplicit; VarsWithInheritedDSAType VarsWithInheritedDSA; bool ErrorFound = false; diff --git a/clang/test/OpenMP/loop_bind_messages.cpp b/clang/test/OpenMP/loop_bind_messages.cpp index 186a990fd7c52bc..f7fdf2897143289 100644 --- a/clang/test/OpenMP/loop_bind_messages.cpp +++ b/clang/test/OpenMP/loop_bind_messages.cpp @@ -4,7 +4,6 @@ #define NNN 50 int aaa[NNN]; -int aaa2[NNN][NNN]; void parallel_loop() { #pragma omp parallel @@ -16,91 +15,6 @@ void parallel_loop() { } } -void parallel_for_AND_loop_bind() { - #pragma omp parallel for - for (int i = 0 ; i < NNN ; i++) { - #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} - for (int j = 0 ; j < NNN ; j++) { - aaa2[i][j] = i+j; - } - } -} - -void parallel_nowait() { - #pragma omp parallel - #pragma omp for nowait - for (int i = 0 ; i < NNN ; i++) { - #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} - for (int j = 0 ; j < NNN ; j++) { - aaa2[i][j] = i+j; - } - } -} - -void parallel_for_with_nothing() { - #pragma omp parallel for - for (int i = 0 ; i < NNN ; i++) { - #pragma omp nothing - #pragma omp loop // expected-error{{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} - for (int j = 0 ; j < NNN ; j++) { - aaa2[i][j] = i+j; - } - } -} - -void parallel_targetfor_with_loop_bind() { - #pragma omp target teams distribute parallel for - for (int i = 0 ; i < NNN ; i++) { - #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'target teams distribute parallel for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} - for (int j = 0 ; j < NNN ; j++) { - aaa2[i][j] = i+j; - } - } -} - -void parallel_targetparallel_with_loop() { - #pragma omp target parallel - for (int i = 0 ; i < NNN ; i++) { - #pragma omp loop bind(parallel) - for (int j = 0 ; j < NNN ; j++) { - aaa2[i][j] = i+j; - } - } -} - -void loop_bind_AND_loop_bind() { - #pragma omp parallel for - for (int i = 0; i < 100; ++i) { - #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} - for (int i = 0 ; i < NNN ; i++) { - #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'loop' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} - for (int j = 0 ; j < NNN ; j++) { - aaa[j] = j*NNN; - } - } - } -} - -void parallel_with_sections_loop() { - #pragma omp parallel - { - #pragma omp sections - { - for (int i = 0 ; i < NNN ; i++) { - #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}} - for (int j = 0 ; j < NNN ; j++) { - aaa2[i][j] = i+j; - } - } - - #pragma omp section - { - aaa[NNN-1] = NNN; - } - } - } -} - void teams_loop() { int var1, var2; @@ -120,23 +34,17 @@ void teams_loop() { } } -void teams_targetteams_with_loop() { - #pragma omp target teams - for (int i = 0 ; i < NNN ; i++) { - #pragma omp loop bind(teams) - for (int j = 0 ; j < NNN ; j++) { - aaa2[i][j] = i+j; - } +void orphan_loop_with_bind() { + #pragma omp loop bind(parallel) + for (int j = 0 ; j < NNN ; j++) { + aaa[j] = j*NNN; } } -void teams_targetfor_with_loop_bind() { - #pragma omp target teams distribute parallel for - for (int i = 0 ; i < NNN ; i++) { - #pragma omp loop bind(teams) // expected-error{{region cannot be closely nested inside 'target teams distribute parallel for' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}} - for (int j = 0 ; j < NNN ; j++) { - aaa2[i][j] = i+j; - } +void orphan_loop_no_bind() { + #pragma omp loop // expected-error{{expected 'bind' clause for 'loop' construct without an enclosing OpenMP construct}} + for (int j = 0 ; j < NNN ; j++) { + aaa[j] = j*NNN; } } @@ -157,80 +65,12 @@ void teams_loop_reduction() { } } -void teams_loop_distribute() { - int total = 0; - - #pragma omp teams num_teams(8) thread_limit(256) - #pragma omp distribute parallel for dist_schedule(static, 1024) \ - schedule(static, 64) - for (int i = 0; i < NNN; i++) { - #pragma omp loop bind(teams) // expected-error{{'distribute parallel for' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}} - for (int j = 0; j < NNN; j++) { - aaa2[i][j] = i+j; - } - } -} - -void parallel_for_with_loop_teams_bind(){ - #pragma omp parallel for - for (int i = 0; i < NNN; i++) { - #pragma omp loop bind(teams) // expected-error{{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}} - for (int j = 0 ; j < NNN ; j++) { - aaa[i] = i+i*NNN; - } - } -} - -void teams_with_loop_thread_bind(){ - #pragma omp teams - for (int i = 0; i < NNN; i++) { - #pragma omp loop bind(thread) - for (int j = 0 ; j < NNN ; j++) { - aaa[i] = i+i*NNN; - } - } -} - -void orphan_loop_no_bind() { - #pragma omp loop // expected-error{{expected 'bind' clause for 'loop' construct without an enclosing OpenMP construct}} - for (int j = 0 ; j < NNN ; j++) { - aaa[j] = j*NNN; - } -} - -void orphan_loop_parallel_bind() { - #pragma omp loop bind(parallel) - for (int j = 0 ; j < NNN ; j++) { - aaa[j] = j*NNN; - } -} - -void orphan_loop_teams_bind(){ - #pragma omp loop bind(teams) - for (int i = 0; i < NNN; i++) { - aaa[i] = i+i*NNN; - } -} - int main(int argc, char *argv[]) { parallel_loop(); - parallel_for_AND_loop_bind(); - parallel_nowait(); - parallel_for_with_nothing(); - parallel_targetfor_with_loop_bind(); - parallel_targetparallel_with_loop(); - loop_bind_AND_loop_bind(); - parallel_with_sections_loop(); teams_loop(); - teams_targetteams_with_loop(); - teams_targetfor_with_loop_bind(); - teams_loop_reduction(); - teams_loop_distribute(); - parallel_for_with_loop_teams_bind(); - teams_with_loop_thread_bind(); + orphan_loop_with_bind(); orphan_loop_no_bind(); - orphan_loop_parallel_bind(); - orphan_loop_teams_bind(); + teams_loop_reduction(); } #endif diff --git a/clang/test/PCH/pragma-loop.cpp b/clang/test/PCH/pragma-loop.cpp index a3c6871041c0eec..f5de630ffc91206 100644 --- a/clang/test/PCH/pragma-loop.cpp +++ b/clang/test/PCH/pragma-loop.cpp @@ -116,13 +116,9 @@ class pragma_test { inline void run10(int *List, int Length) { int i = 0; - int j = 0; - #pragma omp teams +#pragma omp loop bind(teams) for (int i = 0; i < Length; i++) { - #pragma omp loop bind(teams) - for (int j = 0; j < Length; j++) { - List[i] = i+j; - } + List[i] = i; } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits