diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -587,6 +587,36 @@ } } +static void +genACCParallelLoopOps(Fortran::lower::AbstractConverter &converter, + const Fortran::parser::AccClauseList &accClauseList) { + createParallelOp(converter, accClauseList); + createLoopOp(converter, accClauseList); +} + +static void +genACC(Fortran::lower::AbstractConverter &converter, + Fortran::lower::pft::Evaluation &eval, + const Fortran::parser::OpenACCCombinedConstruct &combinedConstruct) { + const auto &beginCombinedDirective = + std::get(combinedConstruct.t); + const auto &combinedDirective = + std::get(beginCombinedDirective.t); + const auto &accClauseList = + std::get(beginCombinedDirective.t); + + if (combinedDirective.v == llvm::acc::ACCD_kernels_loop) { + TODO("OpenACC Kernels Loop construct not lowered yet!"); + } else if (combinedDirective.v == llvm::acc::ACCD_parallel_loop) { + genACCParallelLoopOps(converter, accClauseList); + } else if (combinedDirective.v == llvm::acc::ACCD_serial_loop) { + TODO("OpenACC Serial Loop construct not lowered yet!"); + } else { + llvm::report_fatal_error( + "Unknown combined construct encountered in lowering"); + } +} + static void genACCEnterDataOp(Fortran::lower::AbstractConverter &converter, const Fortran::parser::AccClauseList &accClauseList) { @@ -939,7 +969,7 @@ }, [&](const Fortran::parser::OpenACCCombinedConstruct &combinedConstruct) { - TODO("OpenACC Combined construct not lowered yet!"); + genACC(converter, eval, combinedConstruct); }, [&](const Fortran::parser::OpenACCLoopConstruct &loopConstruct) { genACC(converter, eval, loopConstruct);