@@ -1102,7 +1102,6 @@ static void createBodyOfOp(mlir::Operation &op, const OpWithBodyGenInfo &info,
11021102 firOpBuilder.createBlock (&op.getRegion (0 ));
11031103 return {};
11041104 }();
1105-
11061105 // Mark the earliest insertion point.
11071106 mlir::Operation *marker = insertMarker (firOpBuilder);
11081107
@@ -1858,7 +1857,6 @@ static mlir::omp::LoopNestOp genLoopNestOp(
18581857 std::pair<mlir::omp::BlockArgOpenMPOpInterface, const EntryBlockArgs &>>
18591858 wrapperArgs,
18601859 llvm::omp::Directive directive, DataSharingProcessor &dsp) {
1861-
18621860 auto ivCallback = [&](mlir::Operation *op) {
18631861 genLoopVars (op, converter, loc, iv, wrapperArgs);
18641862 return llvm::SmallVector<const semantics::Symbol *>(iv);
@@ -1867,15 +1865,13 @@ static mlir::omp::LoopNestOp genLoopNestOp(
18671865 auto *nestedEval =
18681866 getCollapsedLoopEval (eval, getCollapseValue (item->clauses ));
18691867
1870- auto loopNestOp = genOpWithBody<mlir::omp::LoopNestOp>(
1868+ return genOpWithBody<mlir::omp::LoopNestOp>(
18711869 OpWithBodyGenInfo (converter, symTable, semaCtx, loc, *nestedEval,
18721870 directive)
18731871 .setClauses (&item->clauses )
18741872 .setDataSharingProcessor (&dsp)
18751873 .setGenRegionEntryCb (ivCallback),
18761874 queue, item, clauseOps);
1877-
1878- return loopNestOp;
18791875}
18801876
18811877static void genLoopOp (lower::AbstractConverter &converter,
@@ -2202,76 +2198,77 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
22022198 if (!converter.getSymbolAddress (sym))
22032199 return ;
22042200
2205- if (llvm::is_contained (mapSyms, &sym))
2206- return ;
2207-
2208- if (const auto *details =
2209- sym.template detailsIf <semantics::HostAssocDetails>())
2210- converter.copySymbolBinding (details->symbol (), sym);
2211- std::stringstream name;
2212- fir::ExtendedValue dataExv = converter.getSymbolExtendedValue (sym);
2213- name << sym.name ().ToString ();
2214-
2215- lower::AddrAndBoundsInfo info = getDataOperandBaseAddr (
2216- converter, firOpBuilder, sym, converter.getCurrentLocation ());
2217- llvm::SmallVector<mlir::Value> bounds =
2218- lower::genImplicitBoundsOps<mlir::omp::MapBoundsOp,
2219- mlir::omp::MapBoundsType>(
2220- firOpBuilder, info, dataExv,
2221- semantics::IsAssumedSizeArray (sym.GetUltimate ()),
2222- converter.getCurrentLocation ());
2223-
2224- llvm::omp::OpenMPOffloadMappingFlags mapFlag =
2225- llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_IMPLICIT;
2226- mlir::omp::VariableCaptureKind captureKind =
2227- mlir::omp::VariableCaptureKind::ByRef;
2228-
2229- mlir::Value baseOp = info.rawInput ;
2230- mlir::Type eleType = baseOp.getType ();
2231- if (auto refType = mlir::dyn_cast<fir::ReferenceType>(baseOp.getType ()))
2232- eleType = refType.getElementType ();
2233-
2234- // If a variable is specified in declare target link and if device
2235- // type is not specified as `nohost`, it needs to be mapped tofrom
2236- mlir::ModuleOp mod = firOpBuilder.getModule ();
2237- mlir::Operation *op = mod.lookupSymbol (converter.mangleName (sym));
2238- auto declareTargetOp =
2239- llvm::dyn_cast_if_present<mlir::omp::DeclareTargetInterface>(op);
2240- if (declareTargetOp && declareTargetOp.isDeclareTarget ()) {
2241- if (declareTargetOp.getDeclareTargetCaptureClause () ==
2242- mlir::omp::DeclareTargetCaptureClause::link &&
2243- declareTargetOp.getDeclareTargetDeviceType () !=
2244- mlir::omp::DeclareTargetDeviceType::nohost) {
2201+ if (!llvm::is_contained (mapSyms, &sym)) {
2202+ if (const auto *details =
2203+ sym.template detailsIf <semantics::HostAssocDetails>())
2204+ converter.copySymbolBinding (details->symbol (), sym);
2205+ std::stringstream name;
2206+ fir::ExtendedValue dataExv = converter.getSymbolExtendedValue (sym);
2207+ name << sym.name ().ToString ();
2208+
2209+ lower::AddrAndBoundsInfo info = getDataOperandBaseAddr (
2210+ converter, firOpBuilder, sym, converter.getCurrentLocation ());
2211+ llvm::SmallVector<mlir::Value> bounds =
2212+ lower::genImplicitBoundsOps<mlir::omp::MapBoundsOp,
2213+ mlir::omp::MapBoundsType>(
2214+ firOpBuilder, info, dataExv,
2215+ semantics::IsAssumedSizeArray (sym.GetUltimate ()),
2216+ converter.getCurrentLocation ());
2217+
2218+ llvm::omp::OpenMPOffloadMappingFlags mapFlag =
2219+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_IMPLICIT;
2220+ mlir::omp::VariableCaptureKind captureKind =
2221+ mlir::omp::VariableCaptureKind::ByRef;
2222+
2223+ mlir::Value baseOp = info.rawInput ;
2224+ mlir::Type eleType = baseOp.getType ();
2225+ if (auto refType = mlir::dyn_cast<fir::ReferenceType>(baseOp.getType ()))
2226+ eleType = refType.getElementType ();
2227+
2228+ // If a variable is specified in declare target link and if device
2229+ // type is not specified as `nohost`, it needs to be mapped tofrom
2230+ mlir::ModuleOp mod = firOpBuilder.getModule ();
2231+ mlir::Operation *op = mod.lookupSymbol (converter.mangleName (sym));
2232+ auto declareTargetOp =
2233+ llvm::dyn_cast_if_present<mlir::omp::DeclareTargetInterface>(op);
2234+ if (declareTargetOp && declareTargetOp.isDeclareTarget ()) {
2235+ if (declareTargetOp.getDeclareTargetCaptureClause () ==
2236+ mlir::omp::DeclareTargetCaptureClause::link &&
2237+ declareTargetOp.getDeclareTargetDeviceType () !=
2238+ mlir::omp::DeclareTargetDeviceType::nohost) {
2239+ mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO;
2240+ mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM;
2241+ }
2242+ } else if (fir::isa_trivial (eleType) || fir::isa_char (eleType)) {
2243+ captureKind = mlir::omp::VariableCaptureKind::ByCopy;
2244+ } else if (!fir::isa_builtin_cptr_type (eleType)) {
22452245 mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO;
22462246 mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM;
22472247 }
2248- } else if (fir::isa_trivial (eleType) || fir::isa_char (eleType)) {
2249- captureKind = mlir::omp::VariableCaptureKind::ByCopy;
2250- } else if (!fir::isa_builtin_cptr_type (eleType)) {
2251- mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO;
2252- mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM;
2248+ auto location =
2249+ mlir::NameLoc::get (mlir::StringAttr::get (firOpBuilder.getContext (),
2250+ sym.name ().ToString ()),
2251+ baseOp.getLoc ());
2252+ mlir::Value mapOp = createMapInfoOp (
2253+ firOpBuilder, location, baseOp, /* varPtrPtr=*/ mlir::Value{},
2254+ name.str (), bounds, /* members=*/ {},
2255+ /* membersIndex=*/ mlir::ArrayAttr{},
2256+ static_cast <
2257+ std::underlying_type_t <llvm::omp::OpenMPOffloadMappingFlags>>(
2258+ mapFlag),
2259+ captureKind, baseOp.getType ());
2260+
2261+ clauseOps.mapVars .push_back (mapOp);
2262+ mapSyms.push_back (&sym);
22532263 }
2254- auto location = mlir::NameLoc::get (
2255- mlir::StringAttr::get (firOpBuilder.getContext (), sym.name ().ToString ()),
2256- baseOp.getLoc ());
2257- mlir::Value mapOp = createMapInfoOp (
2258- firOpBuilder, location, baseOp, /* varPtrPtr=*/ mlir::Value{}, name.str (),
2259- bounds, /* members=*/ {},
2260- /* membersIndex=*/ mlir::ArrayAttr{},
2261- static_cast <
2262- std::underlying_type_t <llvm::omp::OpenMPOffloadMappingFlags>>(
2263- mapFlag),
2264- captureKind, baseOp.getType ());
2265-
2266- clauseOps.mapVars .push_back (mapOp);
2267- mapSyms.push_back (&sym);
22682264 };
22692265 lower::pft::visitAllSymbols (eval, captureImplicitMap);
22702266
22712267 auto targetOp = firOpBuilder.create <mlir::omp::TargetOp>(loc, clauseOps);
22722268
22732269 llvm::SmallVector<mlir::Value> mapBaseValues;
22742270 extractMappedBaseValues (clauseOps.mapVars , mapBaseValues);
2271+
22752272 EntryBlockArgs args;
22762273 args.hostEvalVars = clauseOps.hostEvalVars ;
22772274 // TODO: Add in_reduction syms and vars.
@@ -2471,14 +2468,12 @@ genTeamsOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
24712468 return llvm::to_vector (args.getSyms ());
24722469 };
24732470
2474- auto teamsOp = genOpWithBody<mlir::omp::TeamsOp>(
2471+ return genOpWithBody<mlir::omp::TeamsOp>(
24752472 OpWithBodyGenInfo (converter, symTable, semaCtx, loc, eval,
24762473 llvm::omp::Directive::OMPD_teams)
24772474 .setClauses (&item->clauses )
24782475 .setGenRegionEntryCb (genRegionEntryCB),
24792476 queue, item, clauseOps);
2480-
2481- return teamsOp;
24822477}
24832478
24842479// ===----------------------------------------------------------------------===//
@@ -2528,6 +2523,7 @@ static void genStandaloneDo(lower::AbstractConverter &converter,
25282523 const ConstructQueue &queue,
25292524 ConstructQueue::const_iterator item) {
25302525 lower::StatementContext stmtCtx;
2526+
25312527 mlir::omp::WsloopOperands wsloopClauseOps;
25322528 llvm::SmallVector<const semantics::Symbol *> wsloopReductionSyms;
25332529 genWsloopClauses (converter, semaCtx, stmtCtx, item->clauses , loc,
@@ -3449,7 +3445,6 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
34493445 ConstructQueue queue{
34503446 buildConstructQueue (converter.getFirOpBuilder ().getModule (), semaCtx,
34513447 eval, source, directive, clauses)};
3452-
34533448 genOMPDispatch (converter, symTable, semaCtx, eval, currentLocation, queue,
34543449 queue.begin ());
34553450}
@@ -3475,7 +3470,6 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
34753470 std::get<parser::OmpSectionBlocks>(sectionsConstruct.t );
34763471 clauses.append (makeClauses (
34773472 std::get<parser::OmpClauseList>(endSectionsDirective.t ), semaCtx));
3478-
34793473 mlir::Location currentLocation = converter.getCurrentLocation ();
34803474
34813475 llvm::omp::Directive directive =
0 commit comments