mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-21 18:22:53 +01:00
[LTO] Support new PM in ThinLTOCodeGenerator.
This patch adds initial support for using the new pass manager when doing ThinLTO via libLTO. Reviewed By: steven_wu Differential Revision: https://reviews.llvm.org/D102627
This commit is contained in:
parent
1baf7d8c9b
commit
37c3bfd1ce
@ -226,6 +226,12 @@ public:
|
||||
OptLevel = (NewOptLevel > 3) ? 3 : NewOptLevel;
|
||||
}
|
||||
|
||||
/// Enable or disable the new pass manager.
|
||||
void setUseNewPM(unsigned Enabled) { UseNewPM = Enabled; }
|
||||
|
||||
/// Enable or disable debug output for the new pass manager.
|
||||
void setDebugPassManager(unsigned Enabled) { DebugPassManager = Enabled; }
|
||||
|
||||
/// Disable CodeGen, only run the stages till codegen and stop. The output
|
||||
/// will be bitcode.
|
||||
void disableCodeGen(bool Disable) { DisableCodeGen = Disable; }
|
||||
@ -341,6 +347,14 @@ private:
|
||||
|
||||
/// IR Optimization Level [0-3].
|
||||
unsigned OptLevel = 3;
|
||||
|
||||
/// Flag to indicate whether the new pass manager should be used for IR
|
||||
/// optimizations.
|
||||
bool UseNewPM = LLVM_ENABLE_NEW_PASS_MANAGER;
|
||||
|
||||
/// Flag to indicate whether debug output should be enabled for the new pass
|
||||
/// manager.
|
||||
bool DebugPassManager = false;
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/Analysis/ModuleSummaryAnalysis.h"
|
||||
#include "llvm/Analysis/ProfileSummaryInfo.h"
|
||||
#include "llvm/Analysis/TargetLibraryInfo.h"
|
||||
@ -37,6 +38,8 @@
|
||||
#include "llvm/LTO/SummaryBasedOptimizations.h"
|
||||
#include "llvm/MC/SubtargetFeature.h"
|
||||
#include "llvm/Object/IRObjectFile.h"
|
||||
#include "llvm/Passes/PassBuilder.h"
|
||||
#include "llvm/Passes/StandardInstrumentations.h"
|
||||
#include "llvm/Remarks/HotnessThresholdParser.h"
|
||||
#include "llvm/Support/CachePruning.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
@ -262,6 +265,68 @@ static void optimizeModule(Module &TheModule, TargetMachine &TM,
|
||||
PM.run(TheModule);
|
||||
}
|
||||
|
||||
static void optimizeModuleNewPM(Module &TheModule, TargetMachine &TM,
|
||||
unsigned OptLevel, bool Freestanding,
|
||||
bool DebugPassManager,
|
||||
ModuleSummaryIndex *Index) {
|
||||
Optional<PGOOptions> PGOOpt;
|
||||
LoopAnalysisManager LAM;
|
||||
FunctionAnalysisManager FAM;
|
||||
CGSCCAnalysisManager CGAM;
|
||||
ModuleAnalysisManager MAM;
|
||||
|
||||
PassInstrumentationCallbacks PIC;
|
||||
StandardInstrumentations SI(DebugPassManager);
|
||||
SI.registerCallbacks(PIC, &FAM);
|
||||
PipelineTuningOptions PTO;
|
||||
PTO.LoopVectorization = true;
|
||||
PTO.SLPVectorization = true;
|
||||
PassBuilder PB(&TM, PTO, PGOOpt, &PIC);
|
||||
|
||||
std::unique_ptr<TargetLibraryInfoImpl> TLII(
|
||||
new TargetLibraryInfoImpl(Triple(TM.getTargetTriple())));
|
||||
if (Freestanding)
|
||||
TLII->disableAllFunctions();
|
||||
FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); });
|
||||
|
||||
AAManager AA = PB.buildDefaultAAPipeline();
|
||||
|
||||
// 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;
|
||||
|
||||
PassBuilder::OptimizationLevel OL;
|
||||
|
||||
switch (OptLevel) {
|
||||
default:
|
||||
llvm_unreachable("Invalid optimization level");
|
||||
case 0:
|
||||
OL = PassBuilder::OptimizationLevel::O0;
|
||||
break;
|
||||
case 1:
|
||||
OL = PassBuilder::OptimizationLevel::O1;
|
||||
break;
|
||||
case 2:
|
||||
OL = PassBuilder::OptimizationLevel::O2;
|
||||
break;
|
||||
case 3:
|
||||
OL = PassBuilder::OptimizationLevel::O3;
|
||||
break;
|
||||
}
|
||||
|
||||
MPM.addPass(PB.buildThinLTODefaultPipeline(OL, Index));
|
||||
|
||||
MPM.run(TheModule, MAM);
|
||||
}
|
||||
|
||||
static void
|
||||
addUsedSymbolToPreservedGUID(const lto::InputFile &File,
|
||||
DenseSet<GlobalValue::GUID> &PreservedGUID) {
|
||||
@ -421,7 +486,8 @@ ProcessThinLTOModule(Module &TheModule, ModuleSummaryIndex &Index,
|
||||
const GVSummaryMapTy &DefinedGlobals,
|
||||
const ThinLTOCodeGenerator::CachingOptions &CacheOptions,
|
||||
bool DisableCodeGen, StringRef SaveTempsDir,
|
||||
bool Freestanding, unsigned OptLevel, unsigned count) {
|
||||
bool Freestanding, unsigned OptLevel, unsigned count,
|
||||
bool UseNewPM, bool DebugPassManager) {
|
||||
|
||||
// "Benchmark"-like optimization: single-source case
|
||||
bool SingleModule = (ModuleMap.size() == 1);
|
||||
@ -461,7 +527,11 @@ ProcessThinLTOModule(Module &TheModule, ModuleSummaryIndex &Index,
|
||||
saveTempBitcode(TheModule, SaveTempsDir, count, ".3.imported.bc");
|
||||
}
|
||||
|
||||
optimizeModule(TheModule, TM, OptLevel, Freestanding, &Index);
|
||||
if (UseNewPM)
|
||||
optimizeModuleNewPM(TheModule, TM, OptLevel, Freestanding, DebugPassManager,
|
||||
&Index);
|
||||
else
|
||||
optimizeModule(TheModule, TM, OptLevel, Freestanding, &Index);
|
||||
|
||||
saveTempBitcode(TheModule, SaveTempsDir, count, ".4.opt.bc");
|
||||
|
||||
@ -1132,7 +1202,8 @@ void ThinLTOCodeGenerator::run() {
|
||||
*TheModule, *Index, ModuleMap, *TMBuilder.create(), ImportList,
|
||||
ExportList, GUIDPreservedSymbols,
|
||||
ModuleToDefinedGVSummaries[ModuleIdentifier], CacheOptions,
|
||||
DisableCodeGen, SaveTempsDir, Freestanding, OptLevel, count);
|
||||
DisableCodeGen, SaveTempsDir, Freestanding, OptLevel, count,
|
||||
UseNewPM, DebugPassManager);
|
||||
|
||||
// Commit to the cache (if enabled)
|
||||
CacheEntry.write(*OutputBuffer);
|
||||
|
@ -5,6 +5,7 @@
|
||||
; with -lto-pass-remarks-with-hotness.
|
||||
|
||||
; RUN: llvm-lto -thinlto-action=run \
|
||||
; RUN: -use-new-pm=false \
|
||||
; RUN: -lto-pass-remarks-output=%t.yaml \
|
||||
; RUN: -lto-pass-remarks-with-hotness \
|
||||
; RUN: -exported-symbol _func2 \
|
||||
|
@ -4,6 +4,7 @@
|
||||
; Optimization records are collected regardless of the diagnostic handler
|
||||
; RUN: rm -f %t.yaml.thin.0.yaml %t.yaml.thin.1.yaml
|
||||
; RUN: llvm-lto -thinlto-action=run \
|
||||
; RUN: -use-new-pm=false \
|
||||
; RUN: -lto-pass-remarks-output=%t.yaml \
|
||||
; RUN: -lto-pass-remarks-filter=inline \
|
||||
; RUN: -lto-pass-remarks-format=yaml \
|
||||
|
@ -1,7 +1,30 @@
|
||||
; RUN: opt -module-summary %s -o %t1.bc
|
||||
; RUN: llvm-lto2 run %t1.bc -o %t.o \
|
||||
; RUN: -r=%t1.bc,_tinkywinky,pxl \
|
||||
; RUN: -use-new-pm
|
||||
; RUN: -debug-pass-manager \
|
||||
; RUN: -use-new-pm 2>&1 | FileCheck --check-prefix=NEWPM %s
|
||||
|
||||
; RUN: llvm-lto -thinlto-action=run -exported-symbol tinkywinky \
|
||||
; RUN: -use-new-pm \
|
||||
; RUN: -debug-pass-manager \
|
||||
; RUN: %t1.bc 2>&1 | FileCheck --check-prefix=NEWPM %s
|
||||
|
||||
; RUN: llvm-lto -thinlto-action=run -exported-symbol tinkywinky \
|
||||
; RUN: -use-new-pm=false \
|
||||
; RUN: -debug-pass-manager \
|
||||
; RUN: -debug-pass=Structure \
|
||||
; RUN: %t1.bc 2>&1 | FileCheck --check-prefix=LEGACYPM %s
|
||||
|
||||
; Check that the selected pass manager is used for middle-end optimizations by
|
||||
; checking the debug output for IPSCCP.
|
||||
|
||||
; NEWPM-NOT: Interprocedural Sparse Conditional Constant Propagation
|
||||
; NEWPM: Running pass: IPSCCPPass on [module]
|
||||
; NEWPM-NOT: Interprocedural Sparse Conditional Constant Propagation
|
||||
|
||||
; LEGACYPM-NOT: IPSCCPPass
|
||||
; LEGACYPM: Interprocedural Sparse Conditional Constant Propagation
|
||||
; LEGACYPM-NOT: IPSCCPPass
|
||||
|
||||
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-apple-macosx10.11.0"
|
||||
|
@ -227,6 +227,10 @@ static cl::opt<bool>
|
||||
cl::desc("Run LTO passes using the new pass manager"),
|
||||
cl::init(LLVM_ENABLE_NEW_PASS_MANAGER), cl::Hidden);
|
||||
|
||||
static cl::opt<bool>
|
||||
DebugPassManager("debug-pass-manager", cl::init(false), cl::Hidden,
|
||||
cl::desc("Print pass management debugging information"));
|
||||
|
||||
namespace {
|
||||
|
||||
struct ModuleInfo {
|
||||
@ -557,6 +561,8 @@ public:
|
||||
ThinGenerator.setCacheMaxSizeFiles(ThinLTOCacheMaxSizeFiles);
|
||||
ThinGenerator.setCacheMaxSizeBytes(ThinLTOCacheMaxSizeBytes);
|
||||
ThinGenerator.setFreestanding(EnableFreestanding);
|
||||
ThinGenerator.setUseNewPM(UseNewPM);
|
||||
ThinGenerator.setDebugPassManager(DebugPassManager);
|
||||
|
||||
// Add all the exported symbols to the table of symbols to preserve.
|
||||
for (unsigned i = 0; i < ExportedSymbols.size(); ++i)
|
||||
|
Loading…
Reference in New Issue
Block a user