1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

[LTO] Add ability to parse AA pipelines.

This is supposed to be a drop in replacement for what lld
provides via --lto-newpm-aa-pipeline.

llvm-svn: 281774
This commit is contained in:
Davide Italiano 2016-09-16 21:03:21 +00:00
parent f46cca3a86
commit b91039268d
4 changed files with 33 additions and 4 deletions

View File

@ -83,6 +83,11 @@ struct Config {
/// manager as the old one doesn't have this ability. /// manager as the old one doesn't have this ability.
std::string OptPipeline; std::string OptPipeline;
// If this field is set, it has the same effect of specifying an AA pipeline
// identified by the string. Only works with the new pass manager, in
// conjunction OptPipeline.
std::string AAPipeline;
/// Setting this field will replace target triples in input files with this /// Setting this field will replace target triples in input files with this
/// triple. /// triple.
std::string OverrideTriple; std::string OverrideTriple;
@ -170,6 +175,7 @@ struct Config {
CGOptLevel(std::move(X.CGOptLevel)), OptLevel(std::move(X.OptLevel)), CGOptLevel(std::move(X.CGOptLevel)), OptLevel(std::move(X.OptLevel)),
DisableVerify(std::move(X.DisableVerify)), DisableVerify(std::move(X.DisableVerify)),
OptPipeline(std::move(X.OptPipeline)), OptPipeline(std::move(X.OptPipeline)),
AAPipeline(std::move(X.AAPipeline)),
OverrideTriple(std::move(X.OverrideTriple)), OverrideTriple(std::move(X.OverrideTriple)),
DefaultTriple(std::move(X.DefaultTriple)), DefaultTriple(std::move(X.DefaultTriple)),
ShouldDiscardValueNames(std::move(X.ShouldDiscardValueNames)), ShouldDiscardValueNames(std::move(X.ShouldDiscardValueNames)),
@ -194,6 +200,7 @@ struct Config {
OptLevel = std::move(X.OptLevel); OptLevel = std::move(X.OptLevel);
DisableVerify = std::move(X.DisableVerify); DisableVerify = std::move(X.DisableVerify);
OptPipeline = std::move(X.OptPipeline); OptPipeline = std::move(X.OptPipeline);
AAPipeline = std::move(X.AAPipeline);
OverrideTriple = std::move(X.OverrideTriple); OverrideTriple = std::move(X.OverrideTriple);
DefaultTriple = std::move(X.DefaultTriple); DefaultTriple = std::move(X.DefaultTriple);
ShouldDiscardValueNames = std::move(X.ShouldDiscardValueNames); ShouldDiscardValueNames = std::move(X.ShouldDiscardValueNames);

View File

@ -124,9 +124,17 @@ createTargetMachine(Config &Conf, StringRef TheTriple,
static void runNewPMCustomPasses(Module &Mod, TargetMachine *TM, static void runNewPMCustomPasses(Module &Mod, TargetMachine *TM,
std::string PipelineDesc, std::string PipelineDesc,
std::string AAPipelineDesc,
bool DisableVerify) { bool DisableVerify) {
PassBuilder PB(TM); PassBuilder PB(TM);
AAManager AA; AAManager AA;
// Parse a custom AA pipeline if asked to.
if (!AAPipelineDesc.empty())
if (!PB.parseAAPipeline(AA, AAPipelineDesc))
report_fatal_error("unable to parse AA pipeline description: " +
AAPipelineDesc);
LoopAnalysisManager LAM; LoopAnalysisManager LAM;
FunctionAnalysisManager FAM; FunctionAnalysisManager FAM;
CGSCCAnalysisManager CGAM; CGSCCAnalysisManager CGAM;
@ -185,7 +193,8 @@ bool opt(Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod,
if (Conf.OptPipeline.empty()) if (Conf.OptPipeline.empty())
runOldPMPasses(Conf, Mod, TM, IsThinLto); runOldPMPasses(Conf, Mod, TM, IsThinLto);
else else
runNewPMCustomPasses(Mod, TM, Conf.OptPipeline, Conf.DisableVerify); runNewPMCustomPasses(Mod, TM, Conf.OptPipeline, Conf.AAPipeline,
Conf.DisableVerify);
return !Conf.PostOptModuleHook || Conf.PostOptModuleHook(Task, Mod); return !Conf.PostOptModuleHook || Conf.PostOptModuleHook(Task, Mod);
} }

View File

@ -2,7 +2,8 @@
; Try a custom pipeline ; Try a custom pipeline
; RUN: llvm-lto2 %t1.bc -o %t.o -save-temps \ ; RUN: llvm-lto2 %t1.bc -o %t.o -save-temps \
; RUN: -r %t1.bc,patatino,px -opt-pipeline loweratomic ; RUN: -r %t1.bc,patatino,px -opt-pipeline loweratomic \
; RUN: -aa-pipeline basic-aa
; RUN: llvm-dis < %t.o.0.4.opt.bc | FileCheck %s --check-prefix=CUSTOM ; RUN: llvm-dis < %t.o.0.4.opt.bc | FileCheck %s --check-prefix=CUSTOM
target triple = "x86_64-unknown-linux-gnu" target triple = "x86_64-unknown-linux-gnu"
@ -16,9 +17,16 @@ define void @patatino() {
; CUSTOM-NEXT: ret void ; CUSTOM-NEXT: ret void
; CUSTOM-NEXT: } ; CUSTOM-NEXT: }
; Check that invalid pipeline are caught as errors. ; Check that invalid pipelines are caught as errors.
; RUN: not llvm-lto2 %t1.bc -o %t.o -save-temps \ ; RUN: not llvm-lto2 %t1.bc -o %t.o \
; RUN: -r %t1.bc,patatino,px -opt-pipeline foogoo 2>&1 | \ ; RUN: -r %t1.bc,patatino,px -opt-pipeline foogoo 2>&1 | \
; RUN: FileCheck %s --check-prefix=ERR ; RUN: FileCheck %s --check-prefix=ERR
; ERR: LLVM ERROR: unable to parse pass pipeline description: foogoo ; ERR: LLVM ERROR: unable to parse pass pipeline description: foogoo
; RUN: not llvm-lto2 %t1.bc -o %t.o \
; RUN: -r %t1.bc,patatino,px -aa-pipeline patatino \
; RUN: -opt-pipeline loweratomic 2>&1 | \
; RUN: FileCheck %s --check-prefix=AAERR
; AAERR: LLVM ERROR: unable to parse AA pipeline description: patatino

View File

@ -39,6 +39,10 @@ static cl::opt<std::string> OptPipeline("opt-pipeline",
cl::desc("Optimizer Pipeline"), cl::desc("Optimizer Pipeline"),
cl::value_desc("pipeline")); cl::value_desc("pipeline"));
static cl::opt<std::string> AAPipeline("aa-pipeline",
cl::desc("Alias Analysis Pipeline"),
cl::value_desc("aapipeline"));
static cl::opt<bool> SaveTemps("save-temps", cl::desc("Save temporary files")); static cl::opt<bool> SaveTemps("save-temps", cl::desc("Save temporary files"));
static cl::opt<bool> static cl::opt<bool>
@ -154,6 +158,7 @@ int main(int argc, char **argv) {
// Run a custom pipeline, if asked for. // Run a custom pipeline, if asked for.
Conf.OptPipeline = OptPipeline; Conf.OptPipeline = OptPipeline;
Conf.AAPipeline = AAPipeline;
ThinBackend Backend; ThinBackend Backend;
if (ThinLTODistributedIndexes) if (ThinLTODistributedIndexes)