diff --git a/flang/include/flang/Lower/OpenMP.h b/flang/include/flang/Lower/OpenMP.h index d2b7a423d7781..e6fe7fb2276de 100644 --- a/flang/include/flang/Lower/OpenMP.h +++ b/flang/include/flang/Lower/OpenMP.h @@ -72,6 +72,7 @@ int64_t getCollapseValue(const Fortran::parser::OmpClauseList &clauseList); void genThreadprivateOp(AbstractConverter &, const pft::Variable &); void genDeclareTargetIntGlobal(AbstractConverter &, const pft::Variable &); void genOpenMPReduction(AbstractConverter &, + Fortran::semantics::SemanticsContext &, const Fortran::parser::OmpClauseList &clauseList); mlir::Operation *findReductionChain(mlir::Value, mlir::Value * = nullptr); @@ -82,6 +83,7 @@ void removeStoreOp(mlir::Operation *, mlir::Value); bool isOpenMPTargetConstruct(const parser::OpenMPConstruct &); bool isOpenMPDeviceDeclareTarget(Fortran::lower::AbstractConverter &, + Fortran::semantics::SemanticsContext &, Fortran::lower::pft::Evaluation &, const parser::OpenMPDeclarativeConstruct &); void genOpenMPRequires(mlir::Operation *, const Fortran::semantics::Symbol *); diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index 7577c49fbbc16..76e127207d764 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -2470,7 +2470,8 @@ class FirConverter : public Fortran::lower::AbstractConverter { // found ompDeviceCodeFound = ompDeviceCodeFound || - Fortran::lower::isOpenMPDeviceDeclareTarget(*this, getEval(), ompDecl); + Fortran::lower::isOpenMPDeviceDeclareTarget( + *this, bridge.getSemanticsContext(), getEval(), ompDecl); genOpenMPDeclarativeConstruct( *this, localSymbols, bridge.getSemanticsContext(), getEval(), ompDecl); builder->restoreInsertionPoint(insertPt); diff --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp index 746dc2b62787d..e5887620d503b 100644 --- a/flang/lib/Lower/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP.cpp @@ -552,8 +552,9 @@ class ClauseProcessor { public: ClauseProcessor(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, const Fortran::parser::OmpClauseList &clauses) - : converter(converter), clauses(clauses) {} + : converter(converter), semaCtx(semaCtx), clauses(clauses) {} // 'Unique' clauses: They can appear at most once in the clause list. bool @@ -614,7 +615,6 @@ class ClauseProcessor { // target directives that require it. bool processMap(mlir::Location currentLocation, const llvm::omp::Directive &directive, - Fortran::semantics::SemanticsContext &semanticsContext, Fortran::lower::StatementContext &stmtCtx, llvm::SmallVectorImpl &mapOperands, llvm::SmallVectorImpl *mapSymTypes = nullptr, @@ -643,10 +643,8 @@ class ClauseProcessor { &useDeviceSymbols) const; template - bool - processMotionClauses(Fortran::semantics::SemanticsContext &semanticsContext, - Fortran::lower::StatementContext &stmtCtx, - llvm::SmallVectorImpl &mapOperands); + bool processMotionClauses(Fortran::lower::StatementContext &stmtCtx, + llvm::SmallVectorImpl &mapOperands); // Call this method for these clauses that should be supported but are not // implemented yet. It triggers a compilation error if any of the given @@ -715,6 +713,7 @@ class ClauseProcessor { } Fortran::lower::AbstractConverter &converter; + Fortran::semantics::SemanticsContext &semaCtx; const Fortran::parser::OmpClauseList &clauses; }; @@ -1859,7 +1858,6 @@ createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc, bool ClauseProcessor::processMap( mlir::Location currentLocation, const llvm::omp::Directive &directive, - Fortran::semantics::SemanticsContext &semanticsContext, Fortran::lower::StatementContext &stmtCtx, llvm::SmallVectorImpl &mapOperands, llvm::SmallVectorImpl *mapSymTypes, @@ -1921,7 +1919,7 @@ bool ClauseProcessor::processMap( Fortran::lower::gatherDataOperandAddrAndBounds< Fortran::parser::OmpObject, mlir::omp::DataBoundsOp, mlir::omp::DataBoundsType>( - converter, firOpBuilder, semanticsContext, stmtCtx, ompObject, + converter, firOpBuilder, semaCtx, stmtCtx, ompObject, clauseLocation, asFortran, bounds, treatIndexAsSection); auto origSymbol = @@ -2029,7 +2027,6 @@ bool ClauseProcessor::processUseDevicePtr( template bool ClauseProcessor::processMotionClauses( - Fortran::semantics::SemanticsContext &semanticsContext, Fortran::lower::StatementContext &stmtCtx, llvm::SmallVectorImpl &mapOperands) { return findRepeatableClause( @@ -2053,7 +2050,7 @@ bool ClauseProcessor::processMotionClauses( Fortran::lower::gatherDataOperandAddrAndBounds< Fortran::parser::OmpObject, mlir::omp::DataBoundsOp, mlir::omp::DataBoundsType>( - converter, firOpBuilder, semanticsContext, stmtCtx, ompObject, + converter, firOpBuilder, semaCtx, stmtCtx, ompObject, clauseLocation, asFortran, bounds, treatIndexAsSection); auto origSymbol = @@ -2292,8 +2289,9 @@ struct OpWithBodyGenInfo { mlir::Operation *)>; OpWithBodyGenInfo(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, mlir::Location loc, Fortran::lower::pft::Evaluation &eval) - : converter(converter), loc(loc), eval(eval) {} + : converter(converter), semaCtx(semaCtx), loc(loc), eval(eval) {} OpWithBodyGenInfo &setGenNested(bool value) { genNested = value; @@ -2330,6 +2328,8 @@ struct OpWithBodyGenInfo { /// [inout] converter to use for the clauses. Fortran::lower::AbstractConverter &converter; + /// [in] Semantics context + Fortran::semantics::SemanticsContext &semaCtx; /// [in] location in source code. mlir::Location loc; /// [in] current PFT node/evaluation. @@ -2408,7 +2408,8 @@ static void createBodyOfOp(Op &op, OpWithBodyGenInfo &info) { threadPrivatizeVars(info.converter, info.eval); if (info.clauses) { firOpBuilder.setInsertionPoint(marker); - ClauseProcessor(info.converter, *info.clauses).processCopyin(); + ClauseProcessor(info.converter, info.semaCtx, *info.clauses) + .processCopyin(); } } @@ -2488,6 +2489,7 @@ static void createBodyOfOp(Op &op, OpWithBodyGenInfo &info) { static void genBodyOfTargetDataOp( Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, bool genNested, mlir::omp::DataOp &dataOp, const llvm::SmallVector &useDeviceTypes, @@ -2561,26 +2563,29 @@ static OpTy genOpWithBody(OpWithBodyGenInfo &info, Args &&...args) { static mlir::omp::MasterOp genMasterOp(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, bool genNested, mlir::Location currentLocation) { return genOpWithBody( - OpWithBodyGenInfo(converter, currentLocation, eval) + OpWithBodyGenInfo(converter, semaCtx, currentLocation, eval) .setGenNested(genNested), /*resultTypes=*/mlir::TypeRange()); } static mlir::omp::OrderedRegionOp genOrderedRegionOp(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, bool genNested, mlir::Location currentLocation) { return genOpWithBody( - OpWithBodyGenInfo(converter, currentLocation, eval) + OpWithBodyGenInfo(converter, semaCtx, currentLocation, eval) .setGenNested(genNested), /*simd=*/false); } static mlir::omp::ParallelOp genParallelOp(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, bool genNested, mlir::Location currentLocation, const Fortran::parser::OmpClauseList &clauseList, @@ -2593,7 +2598,7 @@ genParallelOp(Fortran::lower::AbstractConverter &converter, llvm::SmallVector reductionDeclSymbols; llvm::SmallVector reductionSymbols; - ClauseProcessor cp(converter, clauseList); + ClauseProcessor cp(converter, semaCtx, clauseList); cp.processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier::Parallel, ifClauseOperand); cp.processNumThreads(stmtCtx, numThreadsClauseOperand); @@ -2622,7 +2627,7 @@ genParallelOp(Fortran::lower::AbstractConverter &converter, }; return genOpWithBody( - OpWithBodyGenInfo(converter, currentLocation, eval) + OpWithBodyGenInfo(converter, semaCtx, currentLocation, eval) .setGenNested(genNested) .setOuterCombined(outerCombined) .setClauses(&clauseList) @@ -2640,19 +2645,21 @@ genParallelOp(Fortran::lower::AbstractConverter &converter, static mlir::omp::SectionOp genSectionOp(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, bool genNested, 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( - OpWithBodyGenInfo(converter, currentLocation, eval) + OpWithBodyGenInfo(converter, semaCtx, currentLocation, eval) .setGenNested(genNested) .setClauses(§ionsClauseList)); } static mlir::omp::SingleOp genSingleOp(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, bool genNested, mlir::Location currentLocation, const Fortran::parser::OmpClauseList &beginClauseList, @@ -2660,15 +2667,15 @@ genSingleOp(Fortran::lower::AbstractConverter &converter, llvm::SmallVector allocateOperands, allocatorOperands; mlir::UnitAttr nowaitAttr; - ClauseProcessor cp(converter, beginClauseList); + ClauseProcessor cp(converter, semaCtx, beginClauseList); cp.processAllocate(allocatorOperands, allocateOperands); cp.processTODO( currentLocation, llvm::omp::Directive::OMPD_single); - ClauseProcessor(converter, endClauseList).processNowait(nowaitAttr); + ClauseProcessor(converter, semaCtx, endClauseList).processNowait(nowaitAttr); return genOpWithBody( - OpWithBodyGenInfo(converter, currentLocation, eval) + OpWithBodyGenInfo(converter, semaCtx, currentLocation, eval) .setGenNested(genNested) .setClauses(&beginClauseList), allocateOperands, allocatorOperands, nowaitAttr); @@ -2676,6 +2683,7 @@ genSingleOp(Fortran::lower::AbstractConverter &converter, static mlir::omp::TaskOp genTaskOp(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, bool genNested, mlir::Location currentLocation, const Fortran::parser::OmpClauseList &clauseList) { @@ -2686,7 +2694,7 @@ genTaskOp(Fortran::lower::AbstractConverter &converter, llvm::SmallVector allocateOperands, allocatorOperands, dependOperands; - ClauseProcessor cp(converter, clauseList); + ClauseProcessor cp(converter, semaCtx, clauseList); cp.processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier::Task, ifClauseOperand); cp.processAllocate(allocatorOperands, allocateOperands); @@ -2702,7 +2710,7 @@ genTaskOp(Fortran::lower::AbstractConverter &converter, currentLocation, llvm::omp::Directive::OMPD_task); return genOpWithBody( - OpWithBodyGenInfo(converter, currentLocation, eval) + OpWithBodyGenInfo(converter, semaCtx, currentLocation, eval) .setGenNested(genNested) .setClauses(&clauseList), ifClauseOperand, finalClauseOperand, untiedAttr, mergeableAttr, @@ -2717,16 +2725,17 @@ genTaskOp(Fortran::lower::AbstractConverter &converter, static mlir::omp::TaskGroupOp genTaskGroupOp(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, bool genNested, mlir::Location currentLocation, const Fortran::parser::OmpClauseList &clauseList) { llvm::SmallVector allocateOperands, allocatorOperands; - ClauseProcessor cp(converter, clauseList); + ClauseProcessor cp(converter, semaCtx, clauseList); cp.processAllocate(allocatorOperands, allocateOperands); cp.processTODO( currentLocation, llvm::omp::Directive::OMPD_taskgroup); return genOpWithBody( - OpWithBodyGenInfo(converter, currentLocation, eval) + OpWithBodyGenInfo(converter, semaCtx, currentLocation, eval) .setGenNested(genNested) .setClauses(&clauseList), /*task_reduction_vars=*/mlir::ValueRange(), @@ -2735,9 +2744,9 @@ genTaskGroupOp(Fortran::lower::AbstractConverter &converter, static mlir::omp::DataOp genDataOp(Fortran::lower::AbstractConverter &converter, - Fortran::lower::pft::Evaluation &eval, - Fortran::semantics::SemanticsContext &semanticsContext, - bool genNested, mlir::Location currentLocation, + Fortran::semantics::SemanticsContext &semaCtx, + Fortran::lower::pft::Evaluation &eval, bool genNested, + mlir::Location currentLocation, const Fortran::parser::OmpClauseList &clauseList) { Fortran::lower::StatementContext stmtCtx; mlir::Value ifClauseOperand, deviceOperand; @@ -2747,7 +2756,7 @@ genDataOp(Fortran::lower::AbstractConverter &converter, llvm::SmallVector useDeviceLocs; llvm::SmallVector useDeviceSymbols; - ClauseProcessor cp(converter, clauseList); + ClauseProcessor cp(converter, semaCtx, clauseList); cp.processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier::TargetData, ifClauseOperand); cp.processDevice(stmtCtx, deviceOperand); @@ -2756,20 +2765,21 @@ genDataOp(Fortran::lower::AbstractConverter &converter, cp.processUseDeviceAddr(deviceAddrOperands, useDeviceTypes, useDeviceLocs, useDeviceSymbols); cp.processMap(currentLocation, llvm::omp::Directive::OMPD_target_data, - semanticsContext, stmtCtx, mapOperands); + stmtCtx, mapOperands); auto dataOp = converter.getFirOpBuilder().create( currentLocation, ifClauseOperand, deviceOperand, devicePtrOperands, deviceAddrOperands, mapOperands); - genBodyOfTargetDataOp(converter, eval, genNested, dataOp, useDeviceTypes, - useDeviceLocs, useDeviceSymbols, currentLocation); + genBodyOfTargetDataOp(converter, semaCtx, eval, genNested, dataOp, + useDeviceTypes, useDeviceLocs, useDeviceSymbols, + currentLocation); return dataOp; } template static OpTy genEnterExitUpdateDataOp(Fortran::lower::AbstractConverter &converter, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, mlir::Location currentLocation, const Fortran::parser::OmpClauseList &clauseList) { fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); @@ -2796,20 +2806,19 @@ genEnterExitUpdateDataOp(Fortran::lower::AbstractConverter &converter, return nullptr; } - ClauseProcessor cp(converter, clauseList); + ClauseProcessor cp(converter, semaCtx, clauseList); cp.processIf(directiveName, ifClauseOperand); cp.processDevice(stmtCtx, deviceOperand); cp.processNowait(nowaitAttr); if constexpr (std::is_same_v) { - cp.processMotionClauses( - semanticsContext, stmtCtx, mapOperands); - cp.processMotionClauses( - semanticsContext, stmtCtx, mapOperands); + cp.processMotionClauses(stmtCtx, + mapOperands); + cp.processMotionClauses(stmtCtx, + mapOperands); } else { - cp.processMap(currentLocation, directive, semanticsContext, stmtCtx, - mapOperands); + cp.processMap(currentLocation, directive, stmtCtx, mapOperands); } cp.processTODO(currentLocation, @@ -2823,6 +2832,7 @@ genEnterExitUpdateDataOp(Fortran::lower::AbstractConverter &converter, // all the symbols present in mapSymbols as block arguments to this block. static void genBodyOfTargetOp( Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, bool genNested, mlir::omp::TargetOp &targetOp, const llvm::SmallVector &mapSymTypes, @@ -2974,9 +2984,9 @@ static void genBodyOfTargetOp( static mlir::omp::TargetOp genTargetOp(Fortran::lower::AbstractConverter &converter, - Fortran::lower::pft::Evaluation &eval, - Fortran::semantics::SemanticsContext &semanticsContext, - bool genNested, mlir::Location currentLocation, + Fortran::semantics::SemanticsContext &semaCtx, + Fortran::lower::pft::Evaluation &eval, bool genNested, + mlir::Location currentLocation, const Fortran::parser::OmpClauseList &clauseList, llvm::omp::Directive directive, bool outerCombined = false) { Fortran::lower::StatementContext stmtCtx; @@ -2987,14 +2997,14 @@ genTargetOp(Fortran::lower::AbstractConverter &converter, llvm::SmallVector mapSymLocs; llvm::SmallVector mapSymbols; - ClauseProcessor cp(converter, clauseList); + ClauseProcessor cp(converter, semaCtx, clauseList); cp.processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier::Target, ifClauseOperand); cp.processDevice(stmtCtx, deviceOperand); cp.processThreadLimit(stmtCtx, threadLimitOperand); cp.processNowait(nowaitAttr); - cp.processMap(currentLocation, directive, semanticsContext, stmtCtx, - mapOperands, &mapSymTypes, &mapSymLocs, &mapSymbols); + cp.processMap(currentLocation, directive, stmtCtx, mapOperands, &mapSymTypes, + &mapSymLocs, &mapSymbols); cp.processTODO reductionDeclSymbols; - ClauseProcessor cp(converter, clauseList); + ClauseProcessor cp(converter, semaCtx, clauseList); cp.processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier::Teams, ifClauseOperand); cp.processAllocate(allocatorOperands, allocateOperands); @@ -3111,7 +3122,7 @@ genTeamsOp(Fortran::lower::AbstractConverter &converter, currentLocation, llvm::omp::Directive::OMPD_teams); return genOpWithBody( - OpWithBodyGenInfo(converter, currentLocation, eval) + OpWithBodyGenInfo(converter, semaCtx, currentLocation, eval) .setGenNested(genNested) .setOuterCombined(outerCombined) .setClauses(&clauseList), @@ -3128,6 +3139,7 @@ genTeamsOp(Fortran::lower::AbstractConverter &converter, /// 'declare target' directive and return the intended device type for them. static mlir::omp::DeclareTargetDeviceType getDeclareTargetInfo( Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPDeclareTargetConstruct &declareTargetConstruct, llvm::SmallVectorImpl &symbolAndClause) { @@ -3153,7 +3165,7 @@ static mlir::omp::DeclareTargetDeviceType getDeclareTargetInfo( eval.getOwningProcedure()->getSubprogramSymbol()); } - ClauseProcessor cp(converter, *clauseList); + ClauseProcessor cp(converter, semaCtx, *clauseList); cp.processTo(symbolAndClause); cp.processEnter(symbolAndClause); cp.processLink(symbolAndClause); @@ -3169,12 +3181,13 @@ static mlir::omp::DeclareTargetDeviceType getDeclareTargetInfo( static std::optional getDeclareTargetFunctionDevice( Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPDeclareTargetConstruct &declareTargetConstruct) { llvm::SmallVector symbolAndClause; mlir::omp::DeclareTargetDeviceType deviceType = getDeclareTargetInfo( - converter, eval, declareTargetConstruct, symbolAndClause); + converter, semaCtx, eval, declareTargetConstruct, symbolAndClause); // Return the device type only if at least one of the targets for the // directive is a function or subroutine @@ -3196,9 +3209,8 @@ getDeclareTargetFunctionDevice( static void genOmpSimpleStandalone(Fortran::lower::AbstractConverter &converter, - Fortran::lower::pft::Evaluation &eval, - Fortran::semantics::SemanticsContext &semanticsContext, - bool genNested, + Fortran::semantics::SemanticsContext &semaCtx, + Fortran::lower::pft::Evaluation &eval, bool genNested, const Fortran::parser::OpenMPSimpleStandaloneConstruct &simpleStandaloneConstruct) { const auto &directive = @@ -3216,7 +3228,7 @@ genOmpSimpleStandalone(Fortran::lower::AbstractConverter &converter, firOpBuilder.create(currentLocation); break; case llvm::omp::Directive::OMPD_taskwait: - ClauseProcessor(converter, opClauseList) + ClauseProcessor(converter, semaCtx, opClauseList) .processTODO( currentLocation, llvm::omp::Directive::OMPD_taskwait); @@ -3226,20 +3238,20 @@ genOmpSimpleStandalone(Fortran::lower::AbstractConverter &converter, firOpBuilder.create(currentLocation); break; case llvm::omp::Directive::OMPD_target_data: - genDataOp(converter, eval, semanticsContext, genNested, currentLocation, + genDataOp(converter, semaCtx, eval, genNested, currentLocation, opClauseList); break; case llvm::omp::Directive::OMPD_target_enter_data: genEnterExitUpdateDataOp( - converter, semanticsContext, currentLocation, opClauseList); + converter, semaCtx, currentLocation, opClauseList); break; case llvm::omp::Directive::OMPD_target_exit_data: genEnterExitUpdateDataOp( - converter, semanticsContext, currentLocation, opClauseList); + converter, semaCtx, currentLocation, opClauseList); break; case llvm::omp::Directive::OMPD_target_update: genEnterExitUpdateDataOp( - converter, semanticsContext, currentLocation, opClauseList); + converter, semaCtx, currentLocation, opClauseList); break; case llvm::omp::Directive::OMPD_ordered: TODO(currentLocation, "OMPD_ordered"); @@ -3248,6 +3260,7 @@ genOmpSimpleStandalone(Fortran::lower::AbstractConverter &converter, static void genOmpFlush(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPFlushConstruct &flushConstruct) { llvm::SmallVector operandRange; @@ -3267,19 +3280,19 @@ genOmpFlush(Fortran::lower::AbstractConverter &converter, static void genOMP(Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPStandaloneConstruct &standaloneConstruct) { std::visit( Fortran::common::visitors{ [&](const Fortran::parser::OpenMPSimpleStandaloneConstruct &simpleStandaloneConstruct) { - genOmpSimpleStandalone(converter, eval, semanticsContext, + genOmpSimpleStandalone(converter, semaCtx, eval, /*genNested=*/true, simpleStandaloneConstruct); }, [&](const Fortran::parser::OpenMPFlushConstruct &flushConstruct) { - genOmpFlush(converter, eval, flushConstruct); + genOmpFlush(converter, semaCtx, eval, flushConstruct); }, [&](const Fortran::parser::OpenMPCancelConstruct &cancelConstruct) { TODO(converter.getCurrentLocation(), "OpenMPCancelConstruct"); @@ -3340,6 +3353,7 @@ genLoopVars(mlir::Operation *op, Fortran::lower::AbstractConverter &converter, static void createSimdLoop(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, llvm::omp::Directive ompDirective, const Fortran::parser::OmpClauseList &loopOpClauseList, @@ -3358,7 +3372,7 @@ createSimdLoop(Fortran::lower::AbstractConverter &converter, mlir::IntegerAttr simdlenClauseOperand, safelenClauseOperand; std::size_t loopVarTypeSize; - ClauseProcessor cp(converter, loopOpClauseList); + ClauseProcessor cp(converter, semaCtx, loopOpClauseList); cp.processCollapse(loc, eval, lowerBound, upperBound, step, iv, loopVarTypeSize); cp.processScheduleChunk(stmtCtx, scheduleChunkClauseOperand); @@ -3391,13 +3405,14 @@ createSimdLoop(Fortran::lower::AbstractConverter &converter, }; createBodyOfOp( - simdLoopOp, OpWithBodyGenInfo(converter, loc, *nestedEval) + simdLoopOp, OpWithBodyGenInfo(converter, semaCtx, loc, *nestedEval) .setClauses(&loopOpClauseList) .setDataSharingProcessor(&dsp) .setGenRegionEntryCb(ivCallback)); } static void createWsLoop(Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, llvm::omp::Directive ompDirective, const Fortran::parser::OmpClauseList &beginClauseList, @@ -3420,7 +3435,7 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter, mlir::omp::ScheduleModifierAttr scheduleModClauseOperand; std::size_t loopVarTypeSize; - ClauseProcessor cp(converter, beginClauseList); + ClauseProcessor cp(converter, semaCtx, beginClauseList); cp.processCollapse(loc, eval, lowerBound, upperBound, step, iv, loopVarTypeSize); cp.processScheduleChunk(stmtCtx, scheduleChunkClauseOperand); @@ -3460,7 +3475,7 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter, // <...> // !$omp end do nowait if (endClauseList) { - if (ClauseProcessor(converter, *endClauseList) + if (ClauseProcessor(converter, semaCtx, *endClauseList) .processNowait(nowaitClauseOperand)) wsLoopOp.setNowaitAttr(nowaitClauseOperand); } @@ -3473,7 +3488,7 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter, }; createBodyOfOp( - wsLoopOp, OpWithBodyGenInfo(converter, loc, *nestedEval) + wsLoopOp, OpWithBodyGenInfo(converter, semaCtx, loc, *nestedEval) .setClauses(&beginClauseList) .setDataSharingProcessor(&dsp) .setGenRegionEntryCb(ivCallback)); @@ -3481,10 +3496,11 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter, static void createSimdWsLoop( Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, llvm::omp::Directive ompDirective, const Fortran::parser::OmpClauseList &beginClauseList, const Fortran::parser::OmpClauseList *endClauseList, mlir::Location loc) { - ClauseProcessor cp(converter, beginClauseList); + ClauseProcessor cp(converter, semaCtx, beginClauseList); cp.processTODO< Fortran::parser::OmpClause::Aligned, Fortran::parser::OmpClause::Allocate, Fortran::parser::OmpClause::Linear, Fortran::parser::OmpClause::Safelen, @@ -3498,13 +3514,13 @@ static void createSimdWsLoop( // When support for vectorization is enabled, then we need to add handling of // if clause. Currently if clause can be skipped because we always assume // SIMD length = 1. - createWsLoop(converter, eval, ompDirective, beginClauseList, endClauseList, - loc); + createWsLoop(converter, semaCtx, eval, ompDirective, beginClauseList, + endClauseList, loc); } static void genOMP(Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPLoopConstruct &loopConstruct) { const auto &beginLoopDirective = @@ -3536,14 +3552,14 @@ static void genOMP(Fortran::lower::AbstractConverter &converter, if ((llvm::omp::allTargetSet & llvm::omp::loopConstructSet) .test(ompDirective)) { validDirective = true; - genTargetOp(converter, eval, semanticsContext, /*genNested=*/false, + genTargetOp(converter, semaCtx, eval, /*genNested=*/false, currentLocation, loopOpClauseList, ompDirective, /*outerCombined=*/true); } if ((llvm::omp::allTeamsSet & llvm::omp::loopConstructSet) .test(ompDirective)) { validDirective = true; - genTeamsOp(converter, eval, /*genNested=*/false, currentLocation, + genTeamsOp(converter, semaCtx, eval, /*genNested=*/false, currentLocation, loopOpClauseList, /*outerCombined=*/true); } @@ -3554,8 +3570,8 @@ static void genOMP(Fortran::lower::AbstractConverter &converter, if ((llvm::omp::allParallelSet & llvm::omp::loopConstructSet) .test(ompDirective)) { validDirective = true; - genParallelOp(converter, eval, /*genNested=*/false, currentLocation, - loopOpClauseList, + genParallelOp(converter, semaCtx, eval, /*genNested=*/false, + currentLocation, loopOpClauseList, /*outerCombined=*/true); } } @@ -3570,25 +3586,25 @@ static void genOMP(Fortran::lower::AbstractConverter &converter, if (llvm::omp::allDoSimdSet.test(ompDirective)) { // 2.9.3.2 Workshare SIMD construct - createSimdWsLoop(converter, eval, ompDirective, loopOpClauseList, + createSimdWsLoop(converter, semaCtx, eval, ompDirective, loopOpClauseList, endClauseList, currentLocation); } else if (llvm::omp::allSimdSet.test(ompDirective)) { // 2.9.3.1 SIMD construct - createSimdLoop(converter, eval, ompDirective, loopOpClauseList, + createSimdLoop(converter, semaCtx, eval, ompDirective, loopOpClauseList, currentLocation); } else { - createWsLoop(converter, eval, ompDirective, loopOpClauseList, endClauseList, - currentLocation); + createWsLoop(converter, semaCtx, eval, ompDirective, loopOpClauseList, + endClauseList, currentLocation); } - genOpenMPReduction(converter, loopOpClauseList); + genOpenMPReduction(converter, semaCtx, loopOpClauseList); } static void genOMP(Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPBlockConstruct &blockConstruct) { const auto &beginBlockDirective = @@ -3637,37 +3653,38 @@ genOMP(Fortran::lower::AbstractConverter &converter, mlir::Location currentLocation = converter.genLocation(directive.source); switch (directive.v) { case llvm::omp::Directive::OMPD_master: - genMasterOp(converter, eval, /*genNested=*/true, currentLocation); + genMasterOp(converter, semaCtx, eval, /*genNested=*/true, currentLocation); break; case llvm::omp::Directive::OMPD_ordered: - genOrderedRegionOp(converter, eval, /*genNested=*/true, currentLocation); + genOrderedRegionOp(converter, semaCtx, eval, /*genNested=*/true, + currentLocation); break; case llvm::omp::Directive::OMPD_parallel: - genParallelOp(converter, eval, /*genNested=*/true, currentLocation, + genParallelOp(converter, semaCtx, eval, /*genNested=*/true, currentLocation, beginClauseList); break; case llvm::omp::Directive::OMPD_single: - genSingleOp(converter, eval, /*genNested=*/true, currentLocation, + genSingleOp(converter, semaCtx, eval, /*genNested=*/true, currentLocation, beginClauseList, endClauseList); break; case llvm::omp::Directive::OMPD_target: - genTargetOp(converter, eval, semanticsContext, /*genNested=*/true, - currentLocation, beginClauseList, directive.v); + genTargetOp(converter, semaCtx, eval, /*genNested=*/true, currentLocation, + beginClauseList, directive.v); break; case llvm::omp::Directive::OMPD_target_data: - genDataOp(converter, eval, semanticsContext, /*genNested=*/true, - currentLocation, beginClauseList); + genDataOp(converter, semaCtx, eval, /*genNested=*/true, currentLocation, + beginClauseList); break; case llvm::omp::Directive::OMPD_task: - genTaskOp(converter, eval, /*genNested=*/true, currentLocation, + genTaskOp(converter, semaCtx, eval, /*genNested=*/true, currentLocation, beginClauseList); break; case llvm::omp::Directive::OMPD_taskgroup: - genTaskGroupOp(converter, eval, /*genNested=*/true, currentLocation, - beginClauseList); + genTaskGroupOp(converter, semaCtx, eval, /*genNested=*/true, + currentLocation, beginClauseList); break; case llvm::omp::Directive::OMPD_teams: - genTeamsOp(converter, eval, /*genNested=*/true, currentLocation, + genTeamsOp(converter, semaCtx, eval, /*genNested=*/true, currentLocation, beginClauseList, /*outerCombined=*/false); break; @@ -3686,14 +3703,14 @@ genOMP(Fortran::lower::AbstractConverter &converter, bool combinedDirective = false; if ((llvm::omp::allTargetSet & llvm::omp::blockConstructSet) .test(directive.v)) { - genTargetOp(converter, eval, semanticsContext, /*genNested=*/false, - currentLocation, beginClauseList, directive.v, + genTargetOp(converter, semaCtx, eval, /*genNested=*/false, currentLocation, + beginClauseList, directive.v, /*outerCombined=*/true); combinedDirective = true; } if ((llvm::omp::allTeamsSet & llvm::omp::blockConstructSet) .test(directive.v)) { - genTeamsOp(converter, eval, /*genNested=*/false, currentLocation, + genTeamsOp(converter, semaCtx, eval, /*genNested=*/false, currentLocation, beginClauseList); combinedDirective = true; } @@ -3701,8 +3718,8 @@ genOMP(Fortran::lower::AbstractConverter &converter, .test(directive.v)) { bool outerCombined = directive.v != llvm::omp::Directive::OMPD_target_parallel; - genParallelOp(converter, eval, /*genNested=*/false, currentLocation, - beginClauseList, outerCombined); + genParallelOp(converter, semaCtx, eval, /*genNested=*/false, + currentLocation, beginClauseList, outerCombined); combinedDirective = true; } if ((llvm::omp::workShareSet & llvm::omp::blockConstructSet) @@ -3721,7 +3738,7 @@ genOMP(Fortran::lower::AbstractConverter &converter, static void genOMP(Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPCriticalConstruct &criticalConstruct) { fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); @@ -3736,7 +3753,7 @@ genOMP(Fortran::lower::AbstractConverter &converter, } const auto &clauseList = std::get(cd.t); - ClauseProcessor(converter, clauseList).processHint(hintClauseOp); + ClauseProcessor(converter, semaCtx, clauseList).processHint(hintClauseOp); mlir::omp::CriticalOp criticalOp = [&]() { if (name.empty()) { @@ -3754,14 +3771,14 @@ genOMP(Fortran::lower::AbstractConverter &converter, currentLocation, mlir::FlatSymbolRefAttr::get(firOpBuilder.getContext(), global.getSymName())); }(); - auto genInfo = OpWithBodyGenInfo(converter, currentLocation, eval); + auto genInfo = OpWithBodyGenInfo(converter, semaCtx, currentLocation, eval); createBodyOfOp(criticalOp, genInfo); } static void genOMP(Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPSectionsConstruct §ionsConstruct) { mlir::Location currentLocation = converter.getCurrentLocation(); @@ -3774,7 +3791,7 @@ genOMP(Fortran::lower::AbstractConverter &converter, // Process clauses before optional omp.parallel, so that new variables are // allocated outside of the parallel region - ClauseProcessor cp(converter, sectionsClauseList); + ClauseProcessor cp(converter, semaCtx, sectionsClauseList); cp.processSectionsReduction(currentLocation); cp.processAllocate(allocatorOperands, allocateOperands); @@ -3784,7 +3801,7 @@ genOMP(Fortran::lower::AbstractConverter &converter, // Parallel wrapper of PARALLEL SECTIONS construct if (dir == llvm::omp::Directive::OMPD_parallel_sections) { - genParallelOp(converter, eval, + genParallelOp(converter, semaCtx, eval, /*genNested=*/false, currentLocation, sectionsClauseList, /*outerCombined=*/true); } else { @@ -3792,13 +3809,14 @@ genOMP(Fortran::lower::AbstractConverter &converter, std::get(sectionsConstruct.t); const auto &endSectionsClauseList = std::get(endSectionsDirective.t); - ClauseProcessor(converter, endSectionsClauseList) + ClauseProcessor(converter, semaCtx, endSectionsClauseList) .processNowait(nowaitClauseOperand); } // SECTIONS construct genOpWithBody( - OpWithBodyGenInfo(converter, currentLocation, eval).setGenNested(false), + OpWithBodyGenInfo(converter, semaCtx, currentLocation, eval) + .setGenNested(false), /*reduction_vars=*/mlir::ValueRange(), /*reductions=*/nullptr, allocateOperands, allocatorOperands, nowaitClauseOperand); @@ -3810,7 +3828,7 @@ genOMP(Fortran::lower::AbstractConverter &converter, for (const auto &[nblock, neval] : llvm::zip(sectionBlocks.v, eval.getNestedEvaluations())) { symTable.pushScope(); - genSectionOp(converter, neval, /*genNested=*/true, currentLocation, + genSectionOp(converter, semaCtx, neval, /*genNested=*/true, currentLocation, sectionsClauseList); symTable.popScope(); firOpBuilder.restoreInsertionPoint(ip); @@ -3820,7 +3838,7 @@ genOMP(Fortran::lower::AbstractConverter &converter, static void genOMP(Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPAtomicConstruct &atomicConstruct) { std::visit( @@ -3865,14 +3883,14 @@ genOMP(Fortran::lower::AbstractConverter &converter, static void genOMP(Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPDeclareTargetConstruct &declareTargetConstruct) { llvm::SmallVector symbolAndClause; mlir::ModuleOp mod = converter.getFirOpBuilder().getModule(); mlir::omp::DeclareTargetDeviceType deviceType = getDeclareTargetInfo( - converter, eval, declareTargetConstruct, symbolAndClause); + converter, semaCtx, eval, declareTargetConstruct, symbolAndClause); for (const DeclareTargetCapturePair &symClause : symbolAndClause) { mlir::Operation *op = mod.lookupSymbol( @@ -3918,27 +3936,25 @@ static void genOMP(Fortran::lower::AbstractConverter &converter, static void genOMP(Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPConstruct &ompConstruct) { std::visit( Fortran::common::visitors{ [&](const Fortran::parser::OpenMPStandaloneConstruct &standaloneConstruct) { - genOMP(converter, symTable, semanticsContext, eval, - standaloneConstruct); + genOMP(converter, symTable, semaCtx, eval, standaloneConstruct); }, [&](const Fortran::parser::OpenMPSectionsConstruct §ionsConstruct) { - genOMP(converter, symTable, semanticsContext, eval, - sectionsConstruct); + genOMP(converter, symTable, semaCtx, eval, sectionsConstruct); }, [&](const Fortran::parser::OpenMPSectionConstruct §ionConstruct) { // SECTION constructs are handled as a part of SECTIONS. llvm_unreachable("Unexpected standalone OMP SECTION"); }, [&](const Fortran::parser::OpenMPLoopConstruct &loopConstruct) { - genOMP(converter, symTable, semanticsContext, eval, loopConstruct); + genOMP(converter, symTable, semaCtx, eval, loopConstruct); }, [&](const Fortran::parser::OpenMPDeclarativeAllocate &execAllocConstruct) { @@ -3953,16 +3969,14 @@ static void genOMP(Fortran::lower::AbstractConverter &converter, TODO(converter.getCurrentLocation(), "OpenMPAllocatorsConstruct"); }, [&](const Fortran::parser::OpenMPBlockConstruct &blockConstruct) { - genOMP(converter, symTable, semanticsContext, eval, blockConstruct); + genOMP(converter, symTable, semaCtx, eval, blockConstruct); }, [&](const Fortran::parser::OpenMPAtomicConstruct &atomicConstruct) { - genOMP(converter, symTable, semanticsContext, eval, - atomicConstruct); + genOMP(converter, symTable, semaCtx, eval, atomicConstruct); }, [&](const Fortran::parser::OpenMPCriticalConstruct &criticalConstruct) { - genOMP(converter, symTable, semanticsContext, eval, - criticalConstruct); + genOMP(converter, symTable, semaCtx, eval, criticalConstruct); }, }, ompConstruct.u); @@ -3971,7 +3985,7 @@ static void genOMP(Fortran::lower::AbstractConverter &converter, static void genOMP(Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPDeclarativeConstruct &ompDeclConstruct) { std::visit( @@ -3991,8 +4005,7 @@ genOMP(Fortran::lower::AbstractConverter &converter, }, [&](const Fortran::parser::OpenMPDeclareTargetConstruct &declareTargetConstruct) { - genOMP(converter, symTable, semanticsContext, eval, - declareTargetConstruct); + genOMP(converter, symTable, semaCtx, eval, declareTargetConstruct); }, [&](const Fortran::parser::OpenMPRequiresConstruct &requiresConstruct) { @@ -4026,21 +4039,21 @@ mlir::Operation *Fortran::lower::genOpenMPTerminator(fir::FirOpBuilder &builder, void Fortran::lower::genOpenMPConstruct( Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPConstruct &omp) { symTable.pushScope(); - genOMP(converter, symTable, semanticsContext, eval, omp); + genOMP(converter, symTable, semaCtx, eval, omp); symTable.popScope(); } void Fortran::lower::genOpenMPDeclarativeConstruct( Fortran::lower::AbstractConverter &converter, Fortran::lower::SymMap &symTable, - Fortran::semantics::SemanticsContext &semanticsContext, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPDeclarativeConstruct &omp) { - genOMP(converter, symTable, semanticsContext, eval, omp); + genOMP(converter, symTable, semaCtx, eval, omp); genNestedEvaluations(converter, eval); } @@ -4155,6 +4168,7 @@ void Fortran::lower::genDeclareTargetIntGlobal( // ops in the builder (instead of a rewriter) is probably not the best approach. void Fortran::lower::genOpenMPReduction( Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, const Fortran::parser::OmpClauseList &clauseList) { fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); @@ -4377,13 +4391,14 @@ bool Fortran::lower::isOpenMPTargetConstruct( bool Fortran::lower::isOpenMPDeviceDeclareTarget( Fortran::lower::AbstractConverter &converter, + Fortran::semantics::SemanticsContext &semaCtx, Fortran::lower::pft::Evaluation &eval, const Fortran::parser::OpenMPDeclarativeConstruct &ompDecl) { return std::visit( Fortran::common::visitors{ [&](const Fortran::parser::OpenMPDeclareTargetConstruct &ompReq) { mlir::omp::DeclareTargetDeviceType targetType = - getDeclareTargetFunctionDevice(converter, eval, ompReq) + getDeclareTargetFunctionDevice(converter, semaCtx, eval, ompReq) .value_or(mlir::omp::DeclareTargetDeviceType::host); return targetType != mlir::omp::DeclareTargetDeviceType::host; },