Skip to content

Commit

Permalink
[ThinLTO] Honor -O{0,1,2,4} passed through the libLTO interface for T…
Browse files Browse the repository at this point in the history
…hinLTO

This was hardcoded to be O3 till now, without any way to change it
without changing the code.

llvm-svn: 290682
  • Loading branch information
joker-eph committed Dec 28, 2016
1 parent ba3ea97 commit cc7fbf7
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 7 deletions.
10 changes: 9 additions & 1 deletion llvm/include/llvm/LTO/legacy/ThinLTOCodeGenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ struct TargetMachineBuilder {
std::string MAttr;
TargetOptions Options;
Optional<Reloc::Model> RelocModel;
CodeGenOpt::Level CGOptLevel = CodeGenOpt::Default;
CodeGenOpt::Level CGOptLevel = CodeGenOpt::Aggressive;

std::unique_ptr<TargetMachine> create() const;
};
Expand Down Expand Up @@ -199,6 +199,11 @@ class ThinLTOCodeGenerator {
TMBuilder.CGOptLevel = CGOptLevel;
}

/// IR optimization level: from 0 to 3.
void setOptLevel(unsigned NewOptLevel) {
OptLevel = (NewOptLevel > 3) ? 3 : NewOptLevel;
}

/// Disable CodeGen, only run the stages till codegen and stop. The output
/// will be bitcode.
void disableCodeGen(bool Disable) { DisableCodeGen = Disable; }
Expand Down Expand Up @@ -300,6 +305,9 @@ class ThinLTOCodeGenerator {
/// Flag to indicate that only the CodeGen will be performed, no cross-module
/// importing or optimization.
bool CodeGenOnly = false;

/// IR Optimization Level [0-3].
unsigned OptLevel = 3;
};
}
#endif
14 changes: 8 additions & 6 deletions llvm/lib/LTO/ThinLTOCodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,13 +200,14 @@ crossImportIntoModule(Module &TheModule, const ModuleSummaryIndex &Index,
report_fatal_error("importFunctions failed");
}

static void optimizeModule(Module &TheModule, TargetMachine &TM) {
static void optimizeModule(Module &TheModule, TargetMachine &TM,
unsigned OptLevel) {
// Populate the PassManager
PassManagerBuilder PMB;
PMB.LibraryInfo = new TargetLibraryInfoImpl(TM.getTargetTriple());
PMB.Inliner = createFunctionInliningPass();
// FIXME: should get it from the bitcode?
PMB.OptLevel = 3;
PMB.OptLevel = OptLevel;
PMB.LoopVectorize = true;
PMB.SLPVectorize = true;
PMB.VerifyInput = true;
Expand Down Expand Up @@ -383,7 +384,7 @@ ProcessThinLTOModule(Module &TheModule, ModuleSummaryIndex &Index,
const GVSummaryMapTy &DefinedGlobals,
const ThinLTOCodeGenerator::CachingOptions &CacheOptions,
bool DisableCodeGen, StringRef SaveTempsDir,
unsigned count) {
unsigned OptLevel, unsigned count) {

// "Benchmark"-like optimization: single-source case
bool SingleModule = (ModuleMap.size() == 1);
Expand Down Expand Up @@ -415,7 +416,7 @@ ProcessThinLTOModule(Module &TheModule, ModuleSummaryIndex &Index,
saveTempBitcode(TheModule, SaveTempsDir, count, ".3.imported.bc");
}

optimizeModule(TheModule, TM);
optimizeModule(TheModule, TM, OptLevel);

saveTempBitcode(TheModule, SaveTempsDir, count, ".4.opt.bc");

Expand Down Expand Up @@ -534,6 +535,7 @@ std::unique_ptr<TargetMachine> TargetMachineBuilder::create() const {
SubtargetFeatures Features(MAttr);
Features.getDefaultSubtargetFeatures(TheTriple);
std::string FeatureStr = Features.getString();

return std::unique_ptr<TargetMachine>(TheTarget->createTargetMachine(
TheTriple.str(), MCpu, FeatureStr, Options, RelocModel,
CodeModel::Default, CGOptLevel));
Expand Down Expand Up @@ -726,7 +728,7 @@ void ThinLTOCodeGenerator::optimize(Module &TheModule) {
initTMBuilder(TMBuilder, Triple(TheModule.getTargetTriple()));

// Optimize now
optimizeModule(TheModule, *TMBuilder.create());
optimizeModule(TheModule, *TMBuilder.create(), OptLevel);
}

/**
Expand Down Expand Up @@ -947,7 +949,7 @@ void ThinLTOCodeGenerator::run() {
*TheModule, *Index, ModuleMap, *TMBuilder.create(), ImportList,
ExportList, GUIDPreservedSymbols,
ModuleToDefinedGVSummaries[ModuleIdentifier], CacheOptions,
DisableCodeGen, SaveTempsDir, count);
DisableCodeGen, SaveTempsDir, OptLevel, count);

// Commit to the cache (if enabled)
CacheEntry.write(*OutputBuffer);
Expand Down
19 changes: 19 additions & 0 deletions llvm/tools/lto/lto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,25 @@ thinlto_code_gen_t thinlto_create_codegen(void) {
ThinLTOCodeGenerator *CodeGen = new ThinLTOCodeGenerator();
CodeGen->setTargetOptions(InitTargetOptionsFromCodeGenFlags());

if (OptLevel.getNumOccurrences()) {
if (OptLevel < '0' || OptLevel > '3')
report_fatal_error("Optimization level must be between 0 and 3");
CodeGen->setOptLevel(OptLevel - '0');
switch (OptLevel) {
case '0':
CodeGen->setCodeGenOptLevel(CodeGenOpt::None);
break;
case '1':
CodeGen->setCodeGenOptLevel(CodeGenOpt::Less);
break;
case '2':
CodeGen->setCodeGenOptLevel(CodeGenOpt::Default);
break;
case '3':
CodeGen->setCodeGenOptLevel(CodeGenOpt::Aggressive);
break;
}
}
return wrap(CodeGen);
}

Expand Down

0 comments on commit cc7fbf7

Please sign in to comment.