@@ -1102,7 +1102,6 @@ static void createBodyOfOp(mlir::Operation &op, const OpWithBodyGenInfo &info,
1102
1102
firOpBuilder.createBlock (&op.getRegion (0 ));
1103
1103
return {};
1104
1104
}();
1105
-
1106
1105
// Mark the earliest insertion point.
1107
1106
mlir::Operation *marker = insertMarker (firOpBuilder);
1108
1107
@@ -1858,7 +1857,6 @@ static mlir::omp::LoopNestOp genLoopNestOp(
1858
1857
std::pair<mlir::omp::BlockArgOpenMPOpInterface, const EntryBlockArgs &>>
1859
1858
wrapperArgs,
1860
1859
llvm::omp::Directive directive, DataSharingProcessor &dsp) {
1861
-
1862
1860
auto ivCallback = [&](mlir::Operation *op) {
1863
1861
genLoopVars (op, converter, loc, iv, wrapperArgs);
1864
1862
return llvm::SmallVector<const semantics::Symbol *>(iv);
@@ -1867,15 +1865,13 @@ static mlir::omp::LoopNestOp genLoopNestOp(
1867
1865
auto *nestedEval =
1868
1866
getCollapsedLoopEval (eval, getCollapseValue (item->clauses ));
1869
1867
1870
- auto loopNestOp = genOpWithBody<mlir::omp::LoopNestOp>(
1868
+ return genOpWithBody<mlir::omp::LoopNestOp>(
1871
1869
OpWithBodyGenInfo (converter, symTable, semaCtx, loc, *nestedEval,
1872
1870
directive)
1873
1871
.setClauses (&item->clauses )
1874
1872
.setDataSharingProcessor (&dsp)
1875
1873
.setGenRegionEntryCb (ivCallback),
1876
1874
queue, item, clauseOps);
1877
-
1878
- return loopNestOp;
1879
1875
}
1880
1876
1881
1877
static void genLoopOp (lower::AbstractConverter &converter,
@@ -2202,76 +2198,77 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
2202
2198
if (!converter.getSymbolAddress (sym))
2203
2199
return ;
2204
2200
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)) {
2245
2245
mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO;
2246
2246
mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM;
2247
2247
}
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);
2253
2263
}
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);
2268
2264
};
2269
2265
lower::pft::visitAllSymbols (eval, captureImplicitMap);
2270
2266
2271
2267
auto targetOp = firOpBuilder.create <mlir::omp::TargetOp>(loc, clauseOps);
2272
2268
2273
2269
llvm::SmallVector<mlir::Value> mapBaseValues;
2274
2270
extractMappedBaseValues (clauseOps.mapVars , mapBaseValues);
2271
+
2275
2272
EntryBlockArgs args;
2276
2273
args.hostEvalVars = clauseOps.hostEvalVars ;
2277
2274
// TODO: Add in_reduction syms and vars.
@@ -2471,14 +2468,12 @@ genTeamsOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
2471
2468
return llvm::to_vector (args.getSyms ());
2472
2469
};
2473
2470
2474
- auto teamsOp = genOpWithBody<mlir::omp::TeamsOp>(
2471
+ return genOpWithBody<mlir::omp::TeamsOp>(
2475
2472
OpWithBodyGenInfo (converter, symTable, semaCtx, loc, eval,
2476
2473
llvm::omp::Directive::OMPD_teams)
2477
2474
.setClauses (&item->clauses )
2478
2475
.setGenRegionEntryCb (genRegionEntryCB),
2479
2476
queue, item, clauseOps);
2480
-
2481
- return teamsOp;
2482
2477
}
2483
2478
2484
2479
// ===----------------------------------------------------------------------===//
@@ -2528,6 +2523,7 @@ static void genStandaloneDo(lower::AbstractConverter &converter,
2528
2523
const ConstructQueue &queue,
2529
2524
ConstructQueue::const_iterator item) {
2530
2525
lower::StatementContext stmtCtx;
2526
+
2531
2527
mlir::omp::WsloopOperands wsloopClauseOps;
2532
2528
llvm::SmallVector<const semantics::Symbol *> wsloopReductionSyms;
2533
2529
genWsloopClauses (converter, semaCtx, stmtCtx, item->clauses , loc,
@@ -3449,7 +3445,6 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
3449
3445
ConstructQueue queue{
3450
3446
buildConstructQueue (converter.getFirOpBuilder ().getModule (), semaCtx,
3451
3447
eval, source, directive, clauses)};
3452
-
3453
3448
genOMPDispatch (converter, symTable, semaCtx, eval, currentLocation, queue,
3454
3449
queue.begin ());
3455
3450
}
@@ -3475,7 +3470,6 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
3475
3470
std::get<parser::OmpSectionBlocks>(sectionsConstruct.t );
3476
3471
clauses.append (makeClauses (
3477
3472
std::get<parser::OmpClauseList>(endSectionsDirective.t ), semaCtx));
3478
-
3479
3473
mlir::Location currentLocation = converter.getCurrentLocation ();
3480
3474
3481
3475
llvm::omp::Directive directive =
0 commit comments