| 10 | namespace llvm_util { |
| 11 | |
| 12 | string optimize_module(llvm::Module *M, string_view optArgs) { |
| 13 | llvm::LoopAnalysisManager LAM; |
| 14 | llvm::FunctionAnalysisManager FAM; |
| 15 | llvm::CGSCCAnalysisManager CGAM; |
| 16 | llvm::ModuleAnalysisManager MAM; |
| 17 | llvm::PassBuilder PB; |
| 18 | |
| 19 | llvm::ModulePassManager MPM; |
| 20 | |
| 21 | PB.registerModuleAnalyses(MAM); |
| 22 | PB.registerCGSCCAnalyses(CGAM); |
| 23 | PB.registerFunctionAnalyses(FAM); |
| 24 | PB.registerLoopAnalyses(LAM); |
| 25 | PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); |
| 26 | |
| 27 | if (optArgs == "O3") { |
| 28 | MPM = PB.buildPerModuleDefaultPipeline(OptimizationLevel::O3); |
| 29 | } else if (optArgs == "O2") { |
| 30 | MPM = PB.buildPerModuleDefaultPipeline(OptimizationLevel::O2); |
| 31 | } else if (optArgs == "O1") { |
| 32 | MPM = PB.buildPerModuleDefaultPipeline(OptimizationLevel::O1); |
| 33 | } else if (optArgs == "O0") { |
| 34 | MPM = PB.buildPerModuleDefaultPipeline(OptimizationLevel::O0); |
| 35 | } else if (optArgs == "Os") { |
| 36 | MPM = PB.buildPerModuleDefaultPipeline(OptimizationLevel::Os); |
| 37 | } else if (optArgs == "Oz") { |
| 38 | MPM = PB.buildPerModuleDefaultPipeline(OptimizationLevel::Oz); |
| 39 | } else { |
| 40 | if (auto Err = PB.parsePassPipeline(MPM, optArgs)) |
| 41 | return toString(std::move(Err)); |
| 42 | } |
| 43 | MPM.run(*M, MAM); |
| 44 | return {}; |
| 45 | } |
| 46 | |
| 47 | } |