Skip to content

Commit 5508148

Browse files
authored
[flang][OpenMP] Add flag to enable/disable GlobalFilteringPass (#186)
Since this pass is only needed/useful when using the old clang driver, we are adding a flang to enable/disable it with the goal of completely removing the pass.
1 parent 40a16e7 commit 5508148

File tree

9 files changed

+41
-20
lines changed

9 files changed

+41
-20
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6826,6 +6826,7 @@ defm xor_operator : OptInFC1FFlag<"xor-operator", "Enable .XOR. as a synonym of
68266826
defm logical_abbreviations : OptInFC1FFlag<"logical-abbreviations", "Enable logical abbreviations">;
68276827
defm implicit_none : OptInFC1FFlag<"implicit-none", "No implicit typing allowed unless overridden by IMPLICIT statements">;
68286828
defm underscoring : OptInFC1FFlag<"underscoring", "Appends one trailing underscore to external names">;
6829+
defm offload_global_filtering : OptInFC1FFlag<"offload-global-filtering", "Enable/disable OpenMP global filtering pass">;
68296830
defm ppc_native_vec_elem_order: BoolOptionWithoutMarshalling<"f", "ppc-native-vector-element-order",
68306831
PosFlag<SetTrue, [], [ClangOption], "Specifies PowerPC native vector element order (default)">,
68316832
NegFlag<SetFalse, [], [ClangOption], "Specifies PowerPC non-native vector element order">>;

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ void Flang::addOtherOptions(const ArgList &Args, ArgStringList &CmdArgs) const {
120120
options::OPT_fintrinsic_modules_path, options::OPT_pedantic,
121121
options::OPT_std_EQ, options::OPT_W_Joined,
122122
options::OPT_fconvert_EQ, options::OPT_fpass_plugin_EQ,
123-
options::OPT_funderscoring, options::OPT_fno_underscoring});
123+
options::OPT_funderscoring, options::OPT_fno_underscoring,
124+
options::OPT_foffload_global_filtering,
125+
options::OPT_fno_offload_global_filtering});
124126

125127
llvm::codegenoptions::DebugInfoKind DebugInfoKind;
126128
if (Args.hasArg(options::OPT_gN_Group)) {

flang/include/flang/Frontend/CodeGenOptions.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ CODEGENOPT(LoopVersioning, 1, 0) ///< Enable loop versioning.
3535
CODEGENOPT(AliasAnalysis, 1, 0) ///< Enable alias analysis pass
3636

3737
CODEGENOPT(Underscoring, 1, 1)
38+
CODEGENOPT(OffloadGlobalFiltering, 1, 1)
3839
ENUM_CODEGENOPT(RelocationModel, llvm::Reloc::Model, 3, llvm::Reloc::PIC_) ///< Name of the relocation model to use.
3940
ENUM_CODEGENOPT(DebugInfo, llvm::codegenoptions::DebugInfoKind, 4, llvm::codegenoptions::NoDebugInfo) ///< Level of debug info to generate
4041
ENUM_CODEGENOPT(VecLib, llvm::driver::VectorLibrary, 3, llvm::driver::VectorLibrary::NoLibrary) ///< Vector functions library to use

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ void createHLFIRToFIRPassPipeline(
128128
using DoConcurrentMappingKind =
129129
Fortran::frontend::CodeGenOptions::DoConcurrentMappingKind;
130130

131+
struct OpenMPFIRPassPipelineOpts {
132+
bool isTargetDevice;
133+
bool enableOffloadGlobalFiltering;
134+
DoConcurrentMappingKind doConcurrentMappingKind;
135+
};
136+
131137
/// Create a pass pipeline for handling certain OpenMP transformations needed
132138
/// prior to FIR lowering.
133139
///
@@ -137,9 +143,8 @@ using DoConcurrentMappingKind =
137143
/// \param pm - MLIR pass manager that will hold the pipeline definition.
138144
/// \param isTargetDevice - Whether code is being generated for a target device
139145
/// rather than the host device.
140-
void createOpenMPFIRPassPipeline(
141-
mlir::PassManager &pm, bool isTargetDevice,
142-
DoConcurrentMappingKind doConcurrentMappingKind);
146+
void createOpenMPFIRPassPipeline(mlir::PassManager &pm,
147+
OpenMPFIRPassPipelineOpts opts);
143148

144149
#if !defined(FLANG_EXCLUDE_CODEGEN)
145150
void createDebugPasses(mlir::PassManager &pm,

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,11 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
443443
opts.Underscoring = 0;
444444
}
445445

446+
if (args.hasFlag(clang::driver::options::OPT_fno_offload_global_filtering,
447+
clang::driver::options::OPT_foffload_global_filtering, false)) {
448+
opts.OffloadGlobalFiltering = 0;
449+
}
450+
446451
parseDoConcurrentMapping(opts, args, diags);
447452
}
448453

flang/lib/Frontend/FrontendActions.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -334,12 +334,16 @@ bool CodeGenAction::beginSourceFileAction() {
334334
ci.getInvocation().getFrontendOpts().features.IsEnabled(
335335
Fortran::common::LanguageFeature::OpenMP);
336336

337+
fir::OpenMPFIRPassPipelineOpts opts;
338+
337339
using DoConcurrentMappingKind =
338340
Fortran::frontend::CodeGenOptions::DoConcurrentMappingKind;
339-
DoConcurrentMappingKind doConcurrentMappingKind =
341+
opts.doConcurrentMappingKind =
340342
ci.getInvocation().getCodeGenOpts().getDoConcurrentMapping();
343+
opts.enableOffloadGlobalFiltering =
344+
ci.getInvocation().getCodeGenOpts().OffloadGlobalFiltering;
341345

342-
if (doConcurrentMappingKind != DoConcurrentMappingKind::DCMK_None &&
346+
if (opts.doConcurrentMappingKind != DoConcurrentMappingKind::DCMK_None &&
343347
!isOpenMPEnabled) {
344348
unsigned diagID = ci.getDiagnostics().getCustomDiagID(
345349
clang::DiagnosticsEngine::Warning,
@@ -349,15 +353,15 @@ bool CodeGenAction::beginSourceFileAction() {
349353
}
350354

351355
if (isOpenMPEnabled) {
352-
bool isDevice = false;
356+
opts.isTargetDevice = false;
353357
if (auto offloadMod = llvm::dyn_cast<mlir::omp::OffloadModuleInterface>(
354358
mlirModule->getOperation()))
355-
isDevice = offloadMod.getIsTargetDevice();
359+
opts.isTargetDevice = offloadMod.getIsTargetDevice();
356360

357361
// WARNING: This pipeline must be run immediately after the lowering to
358362
// ensure that the FIR is correct with respect to OpenMP operations/
359363
// attributes.
360-
fir::createOpenMPFIRPassPipeline(pm, isDevice, doConcurrentMappingKind);
364+
fir::createOpenMPFIRPassPipeline(pm, opts);
361365
}
362366

363367
pm.enableVerifier(/*verifyPasses=*/true);
@@ -371,7 +375,6 @@ bool CodeGenAction::beginSourceFileAction() {
371375
return false;
372376
}
373377

374-
375378
// Print initial full MLIR module, before lowering or transformations, if
376379
// -save-temps has been specified.
377380
if (!saveMLIRTempFile(ci.getInvocation(), *mlirModule, getCurrentFile(),

flang/lib/Optimizer/OpenMP/GlobalFiltering.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ namespace flangomp {
2929
using namespace mlir;
3030

3131
namespace {
32+
// TODO Remove this pass when AOMP moves to `clang-linker-wrapper` (instead of
33+
// `clang-offload-packager`).
3234
class GlobalFilteringPass
3335
: public flangomp::impl::GlobalFilteringPassBase<GlobalFilteringPass> {
3436
public:

flang/lib/Optimizer/Passes/Pipelines.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -241,18 +241,19 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm,
241241
/// \param pm - MLIR pass manager that will hold the pipeline definition.
242242
/// \param isTargetDevice - Whether code is being generated for a target device
243243
/// rather than the host device.
244-
void createOpenMPFIRPassPipeline(
245-
mlir::PassManager &pm, bool isTargetDevice,
246-
DoConcurrentMappingKind doConcurrentMappingKind) {
247-
if (doConcurrentMappingKind != DoConcurrentMappingKind::DCMK_None)
244+
void createOpenMPFIRPassPipeline(mlir::PassManager &pm,
245+
OpenMPFIRPassPipelineOpts opts) {
246+
if (opts.doConcurrentMappingKind != DoConcurrentMappingKind::DCMK_None)
248247
pm.addPass(flangomp::createDoConcurrentConversionPass(
249-
doConcurrentMappingKind == DoConcurrentMappingKind::DCMK_Device));
248+
opts.doConcurrentMappingKind == DoConcurrentMappingKind::DCMK_Device));
250249

251250
pm.addPass(flangomp::createMapInfoFinalizationPass());
252251
pm.addPass(flangomp::createMarkDeclareTargetPass());
253-
if (isTargetDevice) {
252+
if (opts.isTargetDevice) {
254253
pm.addPass(flangomp::createFunctionFilteringPass());
255-
pm.addPass(flangomp::createGlobalFilteringPass());
254+
255+
if (opts.enableOffloadGlobalFiltering)
256+
pm.addPass(flangomp::createGlobalFilteringPass());
256257
}
257258
}
258259

flang/tools/bbc/bbc.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -295,15 +295,16 @@ static llvm::LogicalResult runOpenMPPasses(mlir::ModuleOp mlirModule) {
295295
using DoConcurrentMappingKind =
296296
Fortran::frontend::CodeGenOptions::DoConcurrentMappingKind;
297297

298-
auto doConcurrentMappingKind =
298+
fir::OpenMPFIRPassPipelineOpts opts;
299+
opts.isTargetDevice = enableOpenMPDevice;
300+
opts.doConcurrentMappingKind =
299301
llvm::StringSwitch<DoConcurrentMappingKind>(
300302
enableDoConcurrentToOpenMPConversion)
301303
.Case("host", DoConcurrentMappingKind::DCMK_Host)
302304
.Case("device", DoConcurrentMappingKind::DCMK_Device)
303305
.Default(DoConcurrentMappingKind::DCMK_None);
304306

305-
fir::createOpenMPFIRPassPipeline(pm, enableOpenMPDevice,
306-
doConcurrentMappingKind);
307+
fir::createOpenMPFIRPassPipeline(pm, opts);
307308
(void)mlir::applyPassManagerCLOptions(pm);
308309
if (mlir::failed(pm.run(mlirModule))) {
309310
llvm::errs() << "FATAL: failed to correctly apply OpenMP pass pipeline";

0 commit comments

Comments
 (0)