[llvm] r292864 - [LTO] Teach lib/LTO about the new pass manager.
Davide Italiano via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 23 16:58:25 PST 2017
Author: davide
Date: Mon Jan 23 18:58:24 2017
New Revision: 292864
URL: http://llvm.org/viewvc/llvm-project?rev=292864&view=rev
Log:
[LTO] Teach lib/LTO about the new pass manager.
Differential Revision: https://reviews.llvm.org/D28997
Modified:
llvm/trunk/lib/LTO/LTOBackend.cpp
llvm/trunk/test/tools/llvm-lto2/X86/pipeline.ll
Modified: llvm/trunk/lib/LTO/LTOBackend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOBackend.cpp?rev=292864&r1=292863&r2=292864&view=diff
==============================================================================
--- llvm/trunk/lib/LTO/LTOBackend.cpp (original)
+++ llvm/trunk/lib/LTO/LTOBackend.cpp Mon Jan 23 18:58:24 2017
@@ -42,6 +42,11 @@
using namespace llvm;
using namespace lto;
+static cl::opt<bool>
+ 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 @@ createTargetMachine(Config &Conf, String
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 @@ static void runOldPMPasses(Config &Conf,
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);
}
Modified: llvm/trunk/test/tools/llvm-lto2/X86/pipeline.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-lto2/X86/pipeline.ll?rev=292864&r1=292863&r2=292864&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-lto2/X86/pipeline.ll (original)
+++ llvm/trunk/test/tools/llvm-lto2/X86/pipeline.ll Mon Jan 23 18:58:24 2017
@@ -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"
More information about the llvm-commits
mailing list