Index: llvm/trunk/lib/LTO/LTOBackend.cpp =================================================================== --- llvm/trunk/lib/LTO/LTOBackend.cpp +++ llvm/trunk/lib/LTO/LTOBackend.cpp @@ -42,6 +42,11 @@ using namespace llvm; using namespace lto; +static cl::opt + LTOUseNewPM("lto-use-new-pm", + cl::desc("Run LTO passes using the new pass manager"), + cl::init(false), cl::Hidden); + LLVM_ATTRIBUTE_NORETURN static void reportOpenError(StringRef Path, Twine Msg) { errs() << "failed to open " << Path << ": " << Msg << '\n'; errs().flush(); @@ -124,6 +129,56 @@ Conf.CodeModel, Conf.CGOptLevel)); } +static void runNewPMPasses(Module &Mod, TargetMachine *TM, unsigned OptLevel) { + PassBuilder PB(TM); + AAManager AA; + + // Parse a custom AA pipeline if asked to. + assert(PB.parseAAPipeline(AA, "default")); + + LoopAnalysisManager LAM; + FunctionAnalysisManager FAM; + CGSCCAnalysisManager CGAM; + ModuleAnalysisManager MAM; + + // Register the AA manager first so that our version is the one used. + FAM.registerPass([&] { return std::move(AA); }); + + // Register all the basic analyses with the managers. + PB.registerModuleAnalyses(MAM); + PB.registerCGSCCAnalyses(CGAM); + PB.registerFunctionAnalyses(FAM); + PB.registerLoopAnalyses(LAM); + PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); + + ModulePassManager MPM; + // FIXME (davide): verify the input. + + PassBuilder::OptimizationLevel OL; + + switch (OptLevel) { + default: + llvm_unreachable("Invalid optimization level"); + case 0: + OL = PassBuilder::O0; + break; + case 1: + OL = PassBuilder::O1; + break; + case 2: + OL = PassBuilder::O2; + break; + case 3: + OL = PassBuilder::O3; + break; + } + + MPM = PB.buildLTODefaultPipeline(OL, false /* DebugLogging */); + MPM.run(Mod, MAM); + + // FIXME (davide): verify the output. +} + static void runNewPMCustomPasses(Module &Mod, TargetMachine *TM, std::string PipelineDesc, std::string AAPipelineDesc, @@ -193,12 +248,19 @@ bool opt(Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod, bool IsThinLTO, ModuleSummaryIndex &CombinedIndex) { - if (Conf.OptPipeline.empty()) - runOldPMPasses(Conf, Mod, TM, IsThinLTO, CombinedIndex); - else - // FIXME: Plumb the combined index into the new pass manager. + // There's still no ThinLTO pipeline hooked up in the new pass manager, + // once there is one, we can just remove this. + if (LTOUseNewPM && IsThinLTO) + report_fatal_error("ThinLTO not supported with the new PM yet!"); + + // FIXME: Plumb the combined index into the new pass manager. + if (!Conf.OptPipeline.empty()) runNewPMCustomPasses(Mod, TM, Conf.OptPipeline, Conf.AAPipeline, Conf.DisableVerify); + else if (LTOUseNewPM) + runNewPMPasses(Mod, TM, Conf.OptLevel); + else + runOldPMPasses(Conf, Mod, TM, IsThinLTO, CombinedIndex); return !Conf.PostOptModuleHook || Conf.PostOptModuleHook(Task, Mod); } Index: llvm/trunk/test/tools/llvm-lto2/X86/pipeline.ll =================================================================== --- llvm/trunk/test/tools/llvm-lto2/X86/pipeline.ll +++ llvm/trunk/test/tools/llvm-lto2/X86/pipeline.ll @@ -6,6 +6,10 @@ ; RUN: -aa-pipeline basic-aa ; RUN: llvm-dis < %t.o.0.4.opt.bc | FileCheck %s --check-prefix=CUSTOM +; Try the new pass manager LTO default pipeline (make sure the option +; is accepted). +; RUN: llvm-lto2 %t1.bc -o %t.o -lto-use-new-pm -r %t1.bc,patatino,px + target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu"