Index: lib/LTO/LTOBackend.cpp =================================================================== --- lib/LTO/LTOBackend.cpp +++ lib/LTO/LTOBackend.cpp @@ -42,6 +42,10 @@ using namespace llvm; using namespace lto; +cl::opt LTOUseNewPM("lto-use-new-pm", + cl::desc("Run 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 +128,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 +247,20 @@ 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 + // 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!"); + + if (LTOUseNewPM || !Conf.OptPipeline.empty()) { // FIXME: Plumb the combined index into the new pass manager. - runNewPMCustomPasses(Mod, TM, Conf.OptPipeline, Conf.AAPipeline, - Conf.DisableVerify); + if (Conf.OptPipeline.empty()) + runNewPMPasses(Mod, TM, Conf.OptLevel); + else + runNewPMCustomPasses(Mod, TM, Conf.OptPipeline, Conf.AAPipeline, + Conf.DisableVerify); + } else + runOldPMPasses(Conf, Mod, TM, IsThinLTO, CombinedIndex); return !Conf.PostOptModuleHook || Conf.PostOptModuleHook(Task, Mod); } Index: test/ThinLTO/X86/error-newpm.ll =================================================================== --- /dev/null +++ test/ThinLTO/X86/error-newpm.ll @@ -0,0 +1,22 @@ +; RUN: opt -module-summary %s -o %t1.bc +; RUN: not llvm-lto2 %t1.bc -o %t.o \ +; RUN: -r=%t1.bc,_foo,pxl \ +; RUN: -r=%t1.bc,_bar,pl \ +; RUN: -r=%t1.bc,_linkonce_func,pl \ +; RUN: -lto-use-new-pm 2>&1 | FileCheck %s + +; CHECK: ThinLTO not supported with the new PM yet! + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.11.0" + +define void @foo() { + ret void +} +define void @bar() { + call void @linkonce_func() + ret void +} +define linkonce void @linkonce_func() { + ret void +} Index: test/tools/llvm-lto/thinlto.ll =================================================================== --- test/tools/llvm-lto/thinlto.ll +++ test/tools/llvm-lto/thinlto.ll @@ -27,3 +27,6 @@ entry: ret void } + +; We don't (yet) accept ThinLTO + new pass manager. +; RUN: not llvm-lto -thinlto Index: test/tools/llvm-lto2/X86/pipeline.ll =================================================================== --- test/tools/llvm-lto2/X86/pipeline.ll +++ 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"