Skip to content

Commit 7006b90

Browse files
[flang][NFCI]Use config structure for MLIR to LLVM pass creation (#67792)
The CreateMLIRToLLVMPassPipeline function has quite a few arguments, all of which has default values. Create a struct, with a constructor for the default values, and pass that struct instead. Re-arrange a few include files to make everything available. No functional change intended.
1 parent bc30b41 commit 7006b90

File tree

5 files changed

+50
-31
lines changed

5 files changed

+50
-31
lines changed

flang/include/flang/Tools/CLOptions.inc

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include "flang/Optimizer/CodeGen/CodeGen.h"
1717
#include "flang/Optimizer/HLFIR/Passes.h"
1818
#include "flang/Optimizer/Transforms/Passes.h"
19-
#include "llvm/Frontend/Debug/Options.h"
2019
#include "llvm/Passes/OptimizationLevel.h"
2120
#include "llvm/Support/CommandLine.h"
2221

@@ -184,29 +183,28 @@ inline void addExternalNameConversionPass(
184183
/// incremental conversion of FIR.
185184
///
186185
/// \param pm - MLIR pass manager that will hold the pipeline definition
187-
inline void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
188-
llvm::OptimizationLevel optLevel = defaultOptLevel,
189-
bool stackArrays = false, bool loopVersioning = false) {
186+
inline void createDefaultFIROptimizerPassPipeline(
187+
mlir::PassManager &pm, const MLIRToLLVMPassPipelineConfig &pc) {
190188
// simplify the IR
191189
mlir::GreedyRewriteConfig config;
192190
config.enableRegionSimplification = false;
193191
pm.addPass(mlir::createCSEPass());
194-
fir::addAVC(pm, optLevel);
192+
fir::addAVC(pm, pc.OptLevel);
195193
pm.addNestedPass<mlir::func::FuncOp>(fir::createCharacterConversionPass());
196194
pm.addPass(mlir::createCanonicalizerPass(config));
197195
pm.addPass(fir::createSimplifyRegionLitePass());
198-
if (optLevel.isOptimizingForSpeed()) {
196+
if (pc.OptLevel.isOptimizingForSpeed()) {
199197
// These passes may increase code size.
200198
pm.addPass(fir::createSimplifyIntrinsicsPass());
201199
pm.addPass(fir::createAlgebraicSimplificationPass(config));
202200
}
203201

204-
if (loopVersioning)
202+
if (pc.LoopVersioning)
205203
pm.addPass(fir::createLoopVersioningPass());
206204

207205
pm.addPass(mlir::createCSEPass());
208206

209-
if (stackArrays)
207+
if (pc.StackArrays)
210208
pm.addPass(fir::createStackArraysPass());
211209
else
212210
fir::addMemoryAllocationOpt(pm);
@@ -291,40 +289,33 @@ inline void createDebugPasses(
291289
}
292290
}
293291

294-
inline void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
295-
llvm::OptimizationLevel optLevel = defaultOptLevel,
296-
bool underscoring = true,
297-
llvm::codegenoptions::DebugInfoKind debugInfo = NoDebugInfo) {
292+
inline void createDefaultFIRCodeGenPassPipeline(
293+
mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig config) {
298294
fir::addBoxedProcedurePass(pm);
299295
pm.addNestedPass<mlir::func::FuncOp>(
300296
fir::createAbstractResultOnFuncOptPass());
301297
pm.addNestedPass<fir::GlobalOp>(fir::createAbstractResultOnGlobalOptPass());
302298
fir::addCodeGenRewritePass(pm);
303299
fir::addTargetRewritePass(pm);
304-
fir::addExternalNameConversionPass(pm, underscoring);
305-
fir::createDebugPasses(pm, debugInfo);
306-
fir::addFIRToLLVMPass(pm, optLevel);
300+
fir::addExternalNameConversionPass(pm, config.Underscoring);
301+
fir::createDebugPasses(pm, config.DebugInfo);
302+
fir::addFIRToLLVMPass(pm, config.OptLevel);
307303
}
308304

309305
/// Create a pass pipeline for lowering from MLIR to LLVM IR
310306
///
311307
/// \param pm - MLIR pass manager that will hold the pipeline definition
312308
/// \param optLevel - optimization level used for creating FIR optimization
313309
/// passes pipeline
314-
inline void createMLIRToLLVMPassPipeline(mlir::PassManager &pm,
315-
llvm::OptimizationLevel optLevel = defaultOptLevel,
316-
bool stackArrays = false, bool underscoring = true,
317-
bool loopVersioning = false,
318-
llvm::codegenoptions::DebugInfoKind debugInfo = NoDebugInfo) {
319-
fir::createHLFIRToFIRPassPipeline(pm, optLevel);
310+
inline void createMLIRToLLVMPassPipeline(
311+
mlir::PassManager &pm, const MLIRToLLVMPassPipelineConfig &config) {
312+
fir::createHLFIRToFIRPassPipeline(pm, config.OptLevel);
320313

321314
// Add default optimizer pass pipeline.
322-
fir::createDefaultFIROptimizerPassPipeline(
323-
pm, optLevel, stackArrays, loopVersioning);
315+
fir::createDefaultFIROptimizerPassPipeline(pm, config);
324316

325317
// Add codegen pass pipeline.
326-
fir::createDefaultFIRCodeGenPassPipeline(
327-
pm, optLevel, underscoring, debugInfo);
318+
fir::createDefaultFIRCodeGenPassPipeline(pm, config);
328319
}
329320
#undef FLANG_EXCLUDE_CODEGEN
330321
#endif

flang/include/flang/Tools/CrossToolHelpers.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,36 @@
1313
#ifndef FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
1414
#define FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
1515

16+
#include "flang/Frontend/CodeGenOptions.h"
1617
#include "flang/Frontend/LangOptions.h"
1718
#include <cstdint>
1819

1920
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
2021
#include "mlir/IR/BuiltinOps.h"
22+
#include "llvm/Frontend/Debug/Options.h"
23+
#include "llvm/Passes/OptimizationLevel.h"
24+
25+
/// Configuriation for the MLIR to LLVM pass pipeline.
26+
struct MLIRToLLVMPassPipelineConfig {
27+
explicit MLIRToLLVMPassPipelineConfig(llvm::OptimizationLevel level) {
28+
OptLevel = level;
29+
}
30+
explicit MLIRToLLVMPassPipelineConfig(llvm::OptimizationLevel level,
31+
const Fortran::frontend::CodeGenOptions &opts) {
32+
OptLevel = level;
33+
StackArrays = opts.StackArrays;
34+
Underscoring = opts.Underscoring;
35+
LoopVersioning = opts.LoopVersioning;
36+
DebugInfo = opts.getDebugInfo();
37+
}
38+
39+
llvm::OptimizationLevel OptLevel; ///< optimisation level
40+
bool StackArrays = false; ///< convert memory allocations to alloca.
41+
bool Underscoring = true; ///< add underscores to function names.
42+
bool LoopVersioning = false; ///< Run the version loop pass.
43+
llvm::codegenoptions::DebugInfoKind DebugInfo =
44+
llvm::codegenoptions::NoDebugInfo; ///< Debug info generation.
45+
};
2146

2247
struct OffloadModuleOpts {
2348
OffloadModuleOpts() {}

flang/lib/Frontend/FrontendActions.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -713,10 +713,10 @@ void CodeGenAction::generateLLVMIR() {
713713
pm.addPass(std::make_unique<Fortran::lower::VerifierPass>());
714714
pm.enableVerifier(/*verifyPasses=*/true);
715715

716+
MLIRToLLVMPassPipelineConfig config(level, opts);
717+
716718
// Create the pass pipeline
717-
fir::createMLIRToLLVMPassPipeline(pm, level, opts.StackArrays,
718-
opts.Underscoring, opts.LoopVersioning,
719-
opts.getDebugInfo());
719+
fir::createMLIRToLLVMPassPipeline(pm, config);
720720
(void)mlir::applyPassManagerCLOptions(pm);
721721

722722
// run the pass manager

flang/tools/bbc/bbc.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,8 @@ static mlir::LogicalResult convertFortranSourceToMLIR(
368368
pm.addPass(std::make_unique<Fortran::lower::VerifierPass>());
369369

370370
// Add O2 optimizer pass pipeline.
371-
fir::createDefaultFIROptimizerPassPipeline(pm, llvm::OptimizationLevel::O2);
371+
fir::createDefaultFIROptimizerPassPipeline(
372+
pm, MLIRToLLVMPassPipelineConfig(llvm::OptimizationLevel::O2));
372373
}
373374

374375
if (mlir::succeeded(pm.run(mlirModule))) {

flang/tools/tco/tco.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "flang/Optimizer/Support/InitFIR.h"
1818
#include "flang/Optimizer/Support/InternalNames.h"
1919
#include "flang/Optimizer/Transforms/Passes.h"
20+
#include "flang/Tools/CrossToolHelpers.h"
2021
#include "mlir/IR/AsmState.h"
2122
#include "mlir/IR/BuiltinOps.h"
2223
#include "mlir/IR/MLIRContext.h"
@@ -118,12 +119,13 @@ compileFIR(const mlir::PassPipelineCLParser &passPipeline) {
118119
if (mlir::failed(passPipeline.addToPipeline(pm, errorHandler)))
119120
return mlir::failure();
120121
} else {
122+
MLIRToLLVMPassPipelineConfig config(llvm::OptimizationLevel::O2);
121123
if (codeGenLLVM) {
122124
// Run only CodeGen passes.
123-
fir::createDefaultFIRCodeGenPassPipeline(pm);
125+
fir::createDefaultFIRCodeGenPassPipeline(pm, config);
124126
} else {
125127
// Run tco with O2 by default.
126-
fir::createMLIRToLLVMPassPipeline(pm, llvm::OptimizationLevel::O2);
128+
fir::createMLIRToLLVMPassPipeline(pm, config);
127129
}
128130
fir::addLLVMDialectToLLVMPass(pm, out.os());
129131
}

0 commit comments

Comments
 (0)