diff options
Diffstat (limited to 'flang/tools/tco/tco.cpp')
-rw-r--r-- | flang/tools/tco/tco.cpp | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/flang/tools/tco/tco.cpp b/flang/tools/tco/tco.cpp index d8daf87..3693980 100644 --- a/flang/tools/tco/tco.cpp +++ b/flang/tools/tco/tco.cpp @@ -51,6 +51,12 @@ static cl::opt<bool> emitFir("emit-fir", cl::desc("Parse and pretty-print the input"), cl::init(false)); +static cl::opt<unsigned> + OptLevel("O", + cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " + "(default = '-O2')"), + cl::Prefix, cl::init(2)); + static cl::opt<std::string> targetTriple("target", cl::desc("specify a target triple"), cl::init("native")); @@ -96,6 +102,22 @@ static void printModule(mlir::ModuleOp mod, raw_ostream &output) { output << mod << '\n'; } +static std::optional<llvm::OptimizationLevel> +getOptimizationLevel(unsigned level) { + switch (level) { + default: + return std::nullopt; + case 0: + return llvm::OptimizationLevel::O0; + case 1: + return llvm::OptimizationLevel::O1; + case 2: + return llvm::OptimizationLevel::O2; + case 3: + return llvm::OptimizationLevel::O3; + } +} + // compile a .fir file static llvm::LogicalResult compileFIR(const mlir::PassPipelineCLParser &passPipeline) { @@ -157,9 +179,17 @@ compileFIR(const mlir::PassPipelineCLParser &passPipeline) { if (mlir::failed(passPipeline.addToPipeline(pm, errorHandler))) return mlir::failure(); } else { - MLIRToLLVMPassPipelineConfig config(llvm::OptimizationLevel::O2); + std::optional<llvm::OptimizationLevel> level = + getOptimizationLevel(OptLevel); + if (!level) { + errs() << "Error invalid optimization level\n"; + return mlir::failure(); + } + MLIRToLLVMPassPipelineConfig config(*level); + // TODO: config.StackArrays should be set here? config.EnableOpenMP = true; // assume the input contains OpenMP config.AliasAnalysis = enableAliasAnalysis && !testGeneratorMode; + config.LoopVersioning = OptLevel > 2; if (codeGenLLVM) { // Run only CodeGen passes. fir::createDefaultFIRCodeGenPassPipeline(pm, config); |