https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/77759
>From 67ea0e5df3c4919030c963c969d8f9cda0b5996b Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Tue, 9 Jan 2024 12:25:10 -0600 Subject: [PATCH] [Flang][OpenMP] Handle SECTION construct from within SECTIONS Introduce `createSectionOp`, invoke it from the SECTIONS construct for each nested SECTION construct. This makes it unnecessary to embed OpenMPSectionConstruct inside of OpenMPSectionConstruct anymore. Recursive lowering [3/5] --- flang/lib/Lower/OpenMP.cpp | 57 +++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp index 496b4ba27a0533..aa315d7ab280e2 100644 --- a/flang/lib/Lower/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP.cpp @@ -2379,6 +2379,18 @@ genParallelOp(Fortran::lower::AbstractConverter &converter, procBindKindAttr); } +static mlir::omp::SectionOp +genSectionOp(Fortran::lower::AbstractConverter &converter, + Fortran::lower::pft::Evaluation &eval, + mlir::Location currentLocation, + const Fortran::parser::OmpClauseList §ionsClauseList) { + // Currently only private/firstprivate clause is handled, and + // all privatization is done within `omp.section` operations. + return genOpWithBody<mlir::omp::SectionOp>(converter, eval, currentLocation, + /*outerCombined=*/false, + §ionsClauseList); +} + static mlir::omp::SingleOp genSingleOp(Fortran::lower::AbstractConverter &converter, Fortran::lower::pft::Evaluation &eval, @@ -3375,35 +3387,6 @@ genOMP(Fortran::lower::AbstractConverter &converter, genNestedEvaluations(converter, eval); } -static void -genOMP(Fortran::lower::AbstractConverter &converter, - Fortran::lower::SymMap &symTable, Fortran::lower::pft::Evaluation &eval, - const Fortran::parser::OpenMPSectionConstruct §ionConstruct) { - mlir::Location currentLocation = converter.getCurrentLocation(); - const Fortran::parser::OpenMPConstruct *parentOmpConstruct = - eval.parentConstruct->getIf<Fortran::parser::OpenMPConstruct>(); - assert(parentOmpConstruct && - "No enclosing parent OpenMPConstruct on SECTION construct"); - const Fortran::parser::OpenMPSectionsConstruct *sectionsConstruct = - std::get_if<Fortran::parser::OpenMPSectionsConstruct>( - &parentOmpConstruct->u); - assert(sectionsConstruct && "SECTION construct must have parent" - "SECTIONS construct"); - const Fortran::parser::OmpClauseList §ionsClauseList = - std::get<Fortran::parser::OmpClauseList>( - std::get<Fortran::parser::OmpBeginSectionsDirective>( - sectionsConstruct->t) - .t); - // Currently only private/firstprivate clause is handled, and - // all privatization is done within `omp.section` operations. - symTable.pushScope(); - genOpWithBody<mlir::omp::SectionOp>(converter, eval, currentLocation, - /*outerCombined=*/false, - §ionsClauseList); - genNestedEvaluations(converter, eval); - symTable.popScope(); -} - static void genOMP(Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, Fortran::lower::pft::Evaluation &eval, @@ -3447,7 +3430,18 @@ genOMP(Fortran::lower::AbstractConverter &converter, /*reductions=*/nullptr, allocateOperands, allocatorOperands, nowaitClauseOperand); - genNestedEvaluations(converter, eval); + const auto §ionBlocks = + std::get<Fortran::parser::OmpSectionBlocks>(sectionsConstruct.t); + auto &firOpBuilder = converter.getFirOpBuilder(); + auto ip = firOpBuilder.saveInsertionPoint(); + for (const auto &[nblock, neval] : + llvm::zip(sectionBlocks.v, eval.getNestedEvaluations())) { + symTable.pushScope(); + genSectionOp(converter, neval, currentLocation, sectionsClauseList); + genNestedEvaluations(converter, neval); + symTable.popScope(); + firOpBuilder.restoreInsertionPoint(ip); + } } static void @@ -3562,7 +3556,8 @@ static void genOMP(Fortran::lower::AbstractConverter &converter, genOMP(converter, symTable, eval, sectionsConstruct); }, [&](const Fortran::parser::OpenMPSectionConstruct §ionConstruct) { - genOMP(converter, symTable, eval, sectionConstruct); + // SECTION constructs are handled as a part of SECTIONS. + llvm_unreachable("Unexpected standalone OMP SECTION"); }, [&](const Fortran::parser::OpenMPLoopConstruct &loopConstruct) { genOMP(converter, symTable, eval, semanticsContext, loopConstruct); _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits