Skip to content

Commit db6069e

Browse files
committed
[Flang][OpenMP][MLIR] Add option to switch off deferred mapping of descriptors
1 parent 0de3479 commit db6069e

File tree

11 files changed

+68
-14
lines changed

11 files changed

+68
-14
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7305,6 +7305,15 @@ def fhermetic_module_files : Flag<["-"], "fhermetic-module-files">, Group<f_Grou
73057305
def fdo_concurrent_to_openmp_EQ : Joined<["-"], "fdo-concurrent-to-openmp=">,
73067306
HelpText<"Try to map `do concurrent` loops to OpenMP [none|host|device]">,
73077307
Values<"none, host, device">;
7308+
7309+
def fdefer_desc_map : Flag<["-"], "fdefer-desc-map">, Group<f_Group>,
7310+
HelpText<"Enable deferred descriptor mapping, which puts off top-level descriptor "
7311+
"mapping until target regions, this is the default behaviour">;
7312+
7313+
def fno_defer_desc_map : Flag<["-"], "fno-defer-desc-map">, Group<f_Group>,
7314+
HelpText<"Disable deferred deferred descriptor mapping, which puts off top-level "
7315+
" descriptor mapping till target regions">;
7316+
73087317
} // let Visibility = [FC1Option, FlangOption]
73097318

73107319
def J : JoinedOrSeparate<["-"], "J">,

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ void Flang::addCodegenOptions(const ArgList &Args,
184184
options::OPT_frepack_arrays_contiguity_EQ,
185185
options::OPT_fstack_repack_arrays, options::OPT_fno_stack_repack_arrays,
186186
options::OPT_ftime_report, options::OPT_ftime_report_EQ,
187-
options::OPT_funroll_loops, options::OPT_fno_unroll_loops});
187+
options::OPT_funroll_loops, options::OPT_fno_unroll_loops,
188+
options::OPT_fdefer_desc_map, options::OPT_fno_defer_desc_map});
188189
}
189190

190191
void Flang::addPicOptions(const ArgList &Args, ArgStringList &CmdArgs) const {

flang/include/flang/Frontend/CodeGenOptions.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ CODEGENOPT(AliasAnalysis, 1, 0) ///< Enable alias analysis pass
4242

4343
CODEGENOPT(Underscoring, 1, 1)
4444
CODEGENOPT(OffloadGlobalFiltering, 1, 0)
45+
CODEGENOPT(DeferDescriptorMapping, 1, 0) ///< Fortran OpenMP specific optimisation for delaying descriptor mapping until target/target data regions
46+
4547
ENUM_CODEGENOPT(RelocationModel, llvm::Reloc::Model, 3, llvm::Reloc::PIC_) ///< Name of the relocation model to use.
4648
ENUM_CODEGENOPT(DebugInfo, llvm::codegenoptions::DebugInfoKind, 4, llvm::codegenoptions::NoDebugInfo) ///< Level of debug info to generate
4749
ENUM_CODEGENOPT(VecLib, llvm::driver::VectorLibrary, 4, llvm::driver::VectorLibrary::NoLibrary) ///< Vector functions library to use

flang/include/flang/Optimizer/OpenMP/Passes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ namespace flangomp {
3333
bool shouldUseWorkshareLowering(mlir::Operation *op);
3434

3535
std::unique_ptr<mlir::Pass> createDoConcurrentConversionPass(bool mapToDevice);
36+
37+
std::unique_ptr<mlir::Pass> createMapInfoFinalizationPass(bool deferDescMap);
3638
} // namespace flangomp
3739

3840
#endif // FORTRAN_OPTIMIZER_OPENMP_PASSES_H

flang/include/flang/Optimizer/OpenMP/Passes.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ def MapInfoFinalizationPass
2121
explicit individual mapping by the OpenMP runtime.
2222
}];
2323
let dependentDialects = ["mlir::omp::OpenMPDialect"];
24+
25+
let options = [Option<"deferDescMapping", "opt-defer-desc-mapping",
26+
"bool", /*default=*/"true",
27+
"Activates or deactivates deferred descriptor mapping, "
28+
"which delays mapping of top-level descriptors to target "
29+
"regions and target data regions">];
2430
}
2531

2632
def MapsForPrivatizedSymbolsPass

flang/include/flang/Optimizer/Passes/Pipelines.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ struct OpenMPFIRPassPipelineOpts {
134134
bool isTargetDevice;
135135
bool enableOffloadGlobalFiltering;
136136

137+
/// Deactivates or activates MapInfoFinalization passes removal of
138+
/// top-level descriptor mapping for non-Target Data/Target region
139+
/// directives.
140+
bool deferDescMap;
141+
137142
/// Controls how to map `do concurrent` loops; to device, host, or none at
138143
/// all.
139144
Fortran::frontend::CodeGenOptions::DoConcurrentMappingKind

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,10 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
488488
}
489489

490490
parseDoConcurrentMapping(opts, args, diags);
491+
492+
opts.DeferDescriptorMapping =
493+
args.hasFlag(clang::driver::options::OPT_fdefer_desc_map,
494+
clang::driver::options::OPT_fno_defer_desc_map, true);
491495
}
492496

493497
/// Parses all target input arguments and populates the target

flang/lib/Frontend/FrontendActions.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,8 @@ bool CodeGenAction::beginSourceFileAction() {
307307
ci.getInvocation().getCodeGenOpts().getDoConcurrentMapping();
308308
opts.enableOffloadGlobalFiltering =
309309
ci.getInvocation().getCodeGenOpts().OffloadGlobalFiltering;
310+
opts.deferDescMap =
311+
ci.getInvocation().getCodeGenOpts().DeferDescriptorMapping;
310312

311313
if (opts.doConcurrentMappingKind != DoConcurrentMappingKind::DCMK_None &&
312314
!isOpenMPEnabled) {

flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ namespace {
5858
class MapInfoFinalizationPass
5959
: public flangomp::impl::MapInfoFinalizationPassBase<
6060
MapInfoFinalizationPass> {
61+
public:
62+
MapInfoFinalizationPass() = default;
63+
64+
MapInfoFinalizationPass(
65+
const flangomp::MapInfoFinalizationPassOptions &options)
66+
: MapInfoFinalizationPassBase(options) {}
67+
6168
/// Helper class tracking a members parent and its
6269
/// placement in the parents member list
6370
struct ParentAndPlacement {
@@ -954,17 +961,20 @@ class MapInfoFinalizationPass
954961
// within a target region. At which point we map the relevant descriptor
955962
// data and the runtime should correctly associate the data with the
956963
// descriptor and bind together and allow clean mapping and execution.
957-
func->walk([&](mlir::omp::MapInfoOp op) {
958-
if (fir::isTypeWithDescriptor(op.getVarType()) ||
959-
mlir::isa_and_present<fir::BoxAddrOp>(
960-
op.getVarPtr().getDefiningOp())) {
961-
mlir::Operation *targetUser = getFirstTargetUser(op);
962-
assert(targetUser && "expected user of map operation was not found");
963-
builder.setInsertionPoint(op);
964-
removeTopLevelDescriptor(op, builder, targetUser);
965-
addImplictDescriptorMapToTargetDataOp(op, builder, targetUser);
966-
}
967-
});
964+
if (deferDescMapping) {
965+
func->walk([&](mlir::omp::MapInfoOp op) {
966+
if (fir::isTypeWithDescriptor(op.getVarType()) ||
967+
mlir::isa_and_present<fir::BoxAddrOp>(
968+
op.getVarPtr().getDefiningOp())) {
969+
mlir::Operation *targetUser = getFirstTargetUser(op);
970+
assert(targetUser &&
971+
"expected user of map operation was not found");
972+
builder.setInsertionPoint(op);
973+
removeTopLevelDescriptor(op, builder, targetUser);
974+
addImplictDescriptorMapToTargetDataOp(op, builder, targetUser);
975+
}
976+
});
977+
}
968978

969979
// Wait until after we have generated all of our maps to add them onto
970980
// the target's block arguments, simplifying the process as there would be
@@ -977,5 +987,11 @@ class MapInfoFinalizationPass
977987
});
978988
}
979989
};
980-
981990
} // namespace
991+
992+
std::unique_ptr<mlir::Pass>
993+
flangomp::createMapInfoFinalizationPass(bool deferDescMap) {
994+
MapInfoFinalizationPassOptions options;
995+
options.deferDescMapping = deferDescMap;
996+
return std::make_unique<MapInfoFinalizationPass>(options);
997+
}

flang/lib/Optimizer/Passes/Pipelines.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ void createOpenMPFIRPassPipeline(mlir::PassManager &pm,
312312
// underlying data which is necessary to access the data on the offload
313313
// target device.
314314
pm.addPass(flangomp::createMapsForPrivatizedSymbolsPass());
315-
pm.addPass(flangomp::createMapInfoFinalizationPass());
315+
pm.addPass(flangomp::createMapInfoFinalizationPass(opts.deferDescMap));
316316
pm.addPass(flangomp::createMarkDeclareTargetPass());
317317
pm.addPass(flangomp::createGenericLoopConversionPass());
318318
if (opts.isTargetDevice) {

0 commit comments

Comments
 (0)