[flang-commits] [flang] 7006b90 - [flang][NFCI]Use config structure for MLIR to LLVM pass creation (#67792)
via flang-commits
flang-commits at lists.llvm.org
Tue Oct 3 06:01:56 PDT 2023
Author: Mats Petersson
Date: 2023-10-03T14:01:50+01:00
New Revision: 7006b90a064ca5502c5f55f227f4f90d116dbb7b
URL: https://github.com/llvm/llvm-project/commit/7006b90a064ca5502c5f55f227f4f90d116dbb7b
DIFF: https://github.com/llvm/llvm-project/commit/7006b90a064ca5502c5f55f227f4f90d116dbb7b.diff
LOG: [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.
Added:
Modified:
flang/include/flang/Tools/CLOptions.inc
flang/include/flang/Tools/CrossToolHelpers.h
flang/lib/Frontend/FrontendActions.cpp
flang/tools/bbc/bbc.cpp
flang/tools/tco/tco.cpp
Removed:
################################################################################
diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc
index 616d9ddc066a75d..0b210bec9f785c8 100644
--- a/flang/include/flang/Tools/CLOptions.inc
+++ b/flang/include/flang/Tools/CLOptions.inc
@@ -16,7 +16,6 @@
#include "flang/Optimizer/CodeGen/CodeGen.h"
#include "flang/Optimizer/HLFIR/Passes.h"
#include "flang/Optimizer/Transforms/Passes.h"
-#include "llvm/Frontend/Debug/Options.h"
#include "llvm/Passes/OptimizationLevel.h"
#include "llvm/Support/CommandLine.h"
@@ -184,29 +183,28 @@ inline void addExternalNameConversionPass(
/// incremental conversion of FIR.
///
/// \param pm - MLIR pass manager that will hold the pipeline definition
-inline void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
- llvm::OptimizationLevel optLevel = defaultOptLevel,
- bool stackArrays = false, bool loopVersioning = false) {
+inline void createDefaultFIROptimizerPassPipeline(
+ mlir::PassManager &pm, const MLIRToLLVMPassPipelineConfig &pc) {
// simplify the IR
mlir::GreedyRewriteConfig config;
config.enableRegionSimplification = false;
pm.addPass(mlir::createCSEPass());
- fir::addAVC(pm, optLevel);
+ fir::addAVC(pm, pc.OptLevel);
pm.addNestedPass<mlir::func::FuncOp>(fir::createCharacterConversionPass());
pm.addPass(mlir::createCanonicalizerPass(config));
pm.addPass(fir::createSimplifyRegionLitePass());
- if (optLevel.isOptimizingForSpeed()) {
+ if (pc.OptLevel.isOptimizingForSpeed()) {
// These passes may increase code size.
pm.addPass(fir::createSimplifyIntrinsicsPass());
pm.addPass(fir::createAlgebraicSimplificationPass(config));
}
- if (loopVersioning)
+ if (pc.LoopVersioning)
pm.addPass(fir::createLoopVersioningPass());
pm.addPass(mlir::createCSEPass());
- if (stackArrays)
+ if (pc.StackArrays)
pm.addPass(fir::createStackArraysPass());
else
fir::addMemoryAllocationOpt(pm);
@@ -291,19 +289,17 @@ inline void createDebugPasses(
}
}
-inline void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
- llvm::OptimizationLevel optLevel = defaultOptLevel,
- bool underscoring = true,
- llvm::codegenoptions::DebugInfoKind debugInfo = NoDebugInfo) {
+inline void createDefaultFIRCodeGenPassPipeline(
+ mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig config) {
fir::addBoxedProcedurePass(pm);
pm.addNestedPass<mlir::func::FuncOp>(
fir::createAbstractResultOnFuncOptPass());
pm.addNestedPass<fir::GlobalOp>(fir::createAbstractResultOnGlobalOptPass());
fir::addCodeGenRewritePass(pm);
fir::addTargetRewritePass(pm);
- fir::addExternalNameConversionPass(pm, underscoring);
- fir::createDebugPasses(pm, debugInfo);
- fir::addFIRToLLVMPass(pm, optLevel);
+ fir::addExternalNameConversionPass(pm, config.Underscoring);
+ fir::createDebugPasses(pm, config.DebugInfo);
+ fir::addFIRToLLVMPass(pm, config.OptLevel);
}
/// Create a pass pipeline for lowering from MLIR to LLVM IR
@@ -311,20 +307,15 @@ inline void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
/// \param pm - MLIR pass manager that will hold the pipeline definition
/// \param optLevel - optimization level used for creating FIR optimization
/// passes pipeline
-inline void createMLIRToLLVMPassPipeline(mlir::PassManager &pm,
- llvm::OptimizationLevel optLevel = defaultOptLevel,
- bool stackArrays = false, bool underscoring = true,
- bool loopVersioning = false,
- llvm::codegenoptions::DebugInfoKind debugInfo = NoDebugInfo) {
- fir::createHLFIRToFIRPassPipeline(pm, optLevel);
+inline void createMLIRToLLVMPassPipeline(
+ mlir::PassManager &pm, const MLIRToLLVMPassPipelineConfig &config) {
+ fir::createHLFIRToFIRPassPipeline(pm, config.OptLevel);
// Add default optimizer pass pipeline.
- fir::createDefaultFIROptimizerPassPipeline(
- pm, optLevel, stackArrays, loopVersioning);
+ fir::createDefaultFIROptimizerPassPipeline(pm, config);
// Add codegen pass pipeline.
- fir::createDefaultFIRCodeGenPassPipeline(
- pm, optLevel, underscoring, debugInfo);
+ fir::createDefaultFIRCodeGenPassPipeline(pm, config);
}
#undef FLANG_EXCLUDE_CODEGEN
#endif
diff --git a/flang/include/flang/Tools/CrossToolHelpers.h b/flang/include/flang/Tools/CrossToolHelpers.h
index d43a1fccccb62fd..8453828995ad015 100644
--- a/flang/include/flang/Tools/CrossToolHelpers.h
+++ b/flang/include/flang/Tools/CrossToolHelpers.h
@@ -13,11 +13,36 @@
#ifndef FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
#define FORTRAN_TOOLS_CROSS_TOOL_HELPERS_H
+#include "flang/Frontend/CodeGenOptions.h"
#include "flang/Frontend/LangOptions.h"
#include <cstdint>
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
#include "mlir/IR/BuiltinOps.h"
+#include "llvm/Frontend/Debug/Options.h"
+#include "llvm/Passes/OptimizationLevel.h"
+
+/// Configuriation for the MLIR to LLVM pass pipeline.
+struct MLIRToLLVMPassPipelineConfig {
+ explicit MLIRToLLVMPassPipelineConfig(llvm::OptimizationLevel level) {
+ OptLevel = level;
+ }
+ explicit MLIRToLLVMPassPipelineConfig(llvm::OptimizationLevel level,
+ const Fortran::frontend::CodeGenOptions &opts) {
+ OptLevel = level;
+ StackArrays = opts.StackArrays;
+ Underscoring = opts.Underscoring;
+ LoopVersioning = opts.LoopVersioning;
+ DebugInfo = opts.getDebugInfo();
+ }
+
+ llvm::OptimizationLevel OptLevel; ///< optimisation level
+ bool StackArrays = false; ///< convert memory allocations to alloca.
+ bool Underscoring = true; ///< add underscores to function names.
+ bool LoopVersioning = false; ///< Run the version loop pass.
+ llvm::codegenoptions::DebugInfoKind DebugInfo =
+ llvm::codegenoptions::NoDebugInfo; ///< Debug info generation.
+};
struct OffloadModuleOpts {
OffloadModuleOpts() {}
diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp
index 6cc7808a30d8a0f..fa12e37607cf110 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -713,10 +713,10 @@ void CodeGenAction::generateLLVMIR() {
pm.addPass(std::make_unique<Fortran::lower::VerifierPass>());
pm.enableVerifier(/*verifyPasses=*/true);
+ MLIRToLLVMPassPipelineConfig config(level, opts);
+
// Create the pass pipeline
- fir::createMLIRToLLVMPassPipeline(pm, level, opts.StackArrays,
- opts.Underscoring, opts.LoopVersioning,
- opts.getDebugInfo());
+ fir::createMLIRToLLVMPassPipeline(pm, config);
(void)mlir::applyPassManagerCLOptions(pm);
// run the pass manager
diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp
index ddac27dcdb95c56..6752d2cf53532c3 100644
--- a/flang/tools/bbc/bbc.cpp
+++ b/flang/tools/bbc/bbc.cpp
@@ -368,7 +368,8 @@ static mlir::LogicalResult convertFortranSourceToMLIR(
pm.addPass(std::make_unique<Fortran::lower::VerifierPass>());
// Add O2 optimizer pass pipeline.
- fir::createDefaultFIROptimizerPassPipeline(pm, llvm::OptimizationLevel::O2);
+ fir::createDefaultFIROptimizerPassPipeline(
+ pm, MLIRToLLVMPassPipelineConfig(llvm::OptimizationLevel::O2));
}
if (mlir::succeeded(pm.run(mlirModule))) {
diff --git a/flang/tools/tco/tco.cpp b/flang/tools/tco/tco.cpp
index 9552d5c9af9e30b..31d6bac142dc421 100644
--- a/flang/tools/tco/tco.cpp
+++ b/flang/tools/tco/tco.cpp
@@ -17,6 +17,7 @@
#include "flang/Optimizer/Support/InitFIR.h"
#include "flang/Optimizer/Support/InternalNames.h"
#include "flang/Optimizer/Transforms/Passes.h"
+#include "flang/Tools/CrossToolHelpers.h"
#include "mlir/IR/AsmState.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/MLIRContext.h"
@@ -118,12 +119,13 @@ compileFIR(const mlir::PassPipelineCLParser &passPipeline) {
if (mlir::failed(passPipeline.addToPipeline(pm, errorHandler)))
return mlir::failure();
} else {
+ MLIRToLLVMPassPipelineConfig config(llvm::OptimizationLevel::O2);
if (codeGenLLVM) {
// Run only CodeGen passes.
- fir::createDefaultFIRCodeGenPassPipeline(pm);
+ fir::createDefaultFIRCodeGenPassPipeline(pm, config);
} else {
// Run tco with O2 by default.
- fir::createMLIRToLLVMPassPipeline(pm, llvm::OptimizationLevel::O2);
+ fir::createMLIRToLLVMPassPipeline(pm, config);
}
fir::addLLVMDialectToLLVMPass(pm, out.os());
}
More information about the flang-commits
mailing list