[lld] r263761 - [LTO] Call the optimizer before invoking codegen.
Davide Italiano via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 17 16:35:34 PDT 2016
Author: davide
Date: Thu Mar 17 18:35:34 2016
New Revision: 263761
URL: http://llvm.org/viewvc/llvm-project?rev=263761&view=rev
Log:
[LTO] Call the optimizer before invoking codegen.
This is the required plumbing needed to run the LTO passes.
Differential Revision: http://reviews.llvm.org/D18235
Modified:
lld/trunk/ELF/SymbolTable.cpp
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=263761&r1=263760&r2=263761&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Thu Mar 17 18:35:34 2016
@@ -18,12 +18,16 @@
#include "Config.h"
#include "Error.h"
#include "Symbols.h"
+#include "llvm/Analysis/TargetLibraryInfo.h"
+#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Linker/IRMover.h"
#include "llvm/Support/StringSaver.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Target/TargetMachine.h"
+#include "llvm/Transforms/IPO.h"
+#include "llvm/Transforms/IPO/PassManagerBuilder.h"
using namespace llvm;
using namespace llvm::object;
@@ -106,6 +110,15 @@ static void saveLtoObjectFile(StringRef
OS << Buffer;
}
+// This is for use when debugging LTO.
+static void saveBCFile(Module &M, StringRef Suffix) {
+ std::error_code EC;
+ raw_fd_ostream OS(Config->OutputFile.str() + Suffix.str(), EC,
+ sys::fs::OpenFlags::F_None);
+ check(EC);
+ WriteBitcodeToFile(&M, OS, /* ShouldPreserveUseListOrder */ true);
+}
+
// Codegen the module M and returns the resulting InputFile.
template <class ELFT>
std::unique_ptr<InputFile> SymbolTable<ELFT>::codegen(Module &M) {
@@ -126,6 +139,25 @@ std::unique_ptr<InputFile> SymbolTable<E
std::unique_ptr<TargetMachine> TM(
TheTarget->createTargetMachine(TripleStr, "", "", Options, R));
+ // Run LTO passes.
+ // FIXME: Reduce code duplication by sharing this code with the gold plugin.
+ legacy::PassManager LtoPasses;
+ LtoPasses.add(
+ createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis()));
+ PassManagerBuilder PMB;
+ PMB.LibraryInfo = new TargetLibraryInfoImpl(Triple(TM->getTargetTriple()));
+ PMB.Inliner = createFunctionInliningPass();
+ PMB.VerifyInput = true;
+ PMB.VerifyOutput = true;
+ PMB.LoopVectorize = true;
+ PMB.SLPVectorize = true;
+ PMB.OptLevel = 2; // FIXME: This should be an option.
+ PMB.populateLTOPassManager(LtoPasses);
+ LtoPasses.run(M);
+
+ if (Config->SaveTemps)
+ saveBCFile(M, ".lto.opt.bc");
+
raw_svector_ostream OS(OwningLTOData);
legacy::PassManager CodeGenPasses;
if (TM->addPassesToEmitFile(CodeGenPasses, OS,
@@ -169,15 +201,6 @@ static void addBitcodeFile(IRMover &Move
[](GlobalValue &, IRMover::ValueAdder) {});
}
-// This is for use when debugging LTO.
-static void saveBCFile(Module &M) {
- std::error_code EC;
- raw_fd_ostream OS(Config->OutputFile.str() + ".lto.bc", EC,
- sys::fs::OpenFlags::F_None);
- check(EC);
- WriteBitcodeToFile(&M, OS, /* ShouldPreserveUseListOrder */ true);
-}
-
// Merge all the bitcode files we have seen, codegen the result and return
// the resulting ObjectFile.
template <class ELFT>
@@ -188,7 +211,7 @@ elf::ObjectFile<ELFT> *SymbolTable<ELFT>
for (const std::unique_ptr<BitcodeFile> &F : BitcodeFiles)
addBitcodeFile(Mover, *F, Context);
if (Config->SaveTemps)
- saveBCFile(Combined);
+ saveBCFile(Combined, ".lto.bc");
std::unique_ptr<InputFile> F = codegen(Combined);
ObjectFiles.emplace_back(cast<ObjectFile<ELFT>>(F.release()));
return &*ObjectFiles.back();
More information about the llvm-commits
mailing list