llvm-project/llvm/lib/Transforms/IPO
Mehdi Amini 1db10ac6ce Define the ThinLTO Pipeline (experimental)
Summary:
On the contrary to Full LTO, ThinLTO can afford to shift compile time
from the frontend to the linker: both phases are parallel (even if
it is not totally "free": projects like clang are reusing product
from the "compile phase" for multiple link, think about
libLLVMSupport reused for opt, llc, etc.).

This pipeline is based on the proposal in D13443 for full LTO. We
didn't move forward on this proposal because the LTO link was far too
long after that. We believe that we can afford it with ThinLTO.

The ThinLTO pipeline integrates in the regular O2/O3 flow:

 - The compile phase perform the inliner with a somehow lighter
   function simplification. (TODO: tune the inliner thresholds here)
   This is intendend to simplify the IR and get rid of obvious things
   like linkonce_odr that will be inlined.
 - The link phase will run the pipeline from the start, extended with
   some specific passes that leverage the augmented knowledge we have
   during LTO. Especially after the inliner is done, a sequence of
   globalDCE/globalOpt is performed, followed by another run of the
   "function simplification" passes. It is not clear if this part
   of the pipeline will stay as is, as the split model of ThinLTO
   does not allow the same benefit as FullLTO without added tricks.

The measurements on the public test suite as well as on our internal
suite show an overall net improvement. The binary size for the clang
executable is reduced by 5%. We're still tuning it with the bringup
of ThinLTO and it will evolve, but this should provide a good starting
point.

Reviewers: tejohnson

Differential Revision: http://reviews.llvm.org/D17115

From: Mehdi Amini <mehdi.amini@apple.com>
llvm-svn: 261029
2016-02-16 23:02:29 +00:00
..
ArgumentPromotion.cpp Add an "addUsedAAAnalyses" helper function 2016-02-09 01:21:57 +00:00
BarrierNoopPass.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
CMakeLists.txt WholeProgramDevirt: introduce. 2016-02-09 22:50:34 +00:00
ConstantMerge.cpp IPO: Remove implicit ilist iterator conversions, NFC 2015-10-13 17:51:03 +00:00
CrossDSOCFI.cpp [cfi] Cross-DSO CFI diagnostic mode (LLVM part). 2016-01-25 23:35:03 +00:00
DeadArgumentElimination.cpp Convert int to Twine instead of using utostr since it was already being added to a Twine. NFC 2016-01-31 00:15:35 +00:00
ElimAvailExtern.cpp Disallow aliases to available_externally. 2015-11-26 19:22:59 +00:00
ExtractGV.cpp GlobalValue: use getValueType() instead of getType()->getPointerElementType(). 2016-01-16 20:30:46 +00:00
ForceFunctionAttrs.cpp Fix option desc in FunctionAttrs; NFC 2016-01-06 18:18:16 +00:00
FunctionAttrs.cpp [attrs] Move the norecurse deduction to operate on the node set rather 2016-02-13 08:47:51 +00:00
FunctionImport.cpp Fix Windows bot failure in Transforms/FunctionImport/funcimport.ll 2016-02-10 23:47:38 +00:00
GlobalDCE.cpp Re-reapply "[IR] Move optional data in llvm::Function into a hungoff uselist" 2015-12-19 08:52:49 +00:00
GlobalOpt.cpp Transforms: Move GlobalOpt's Evaluator to Utils where it can be reused. 2016-02-03 02:51:00 +00:00
IPConstantPropagation.cpp Revert r240137 (Fixed/added namespace ending comments using clang-tidy. NFC) 2015-06-23 09:49:53 +00:00
IPO.cpp WholeProgramDevirt: introduce. 2016-02-09 22:50:34 +00:00
InferFunctionAttrs.cpp [BasicAA] Remove special casing of memset_pattern16 in favor of generic attribute inference 2016-01-06 04:53:16 +00:00
InlineAlways.cpp Refactor threshold computation for inline cost analysis 2016-01-14 23:16:29 +00:00
InlineSimple.cpp Refactor threshold computation for inline cost analysis 2016-01-14 23:16:29 +00:00
Inliner.cpp Add an "addUsedAAAnalyses" helper function 2016-02-09 01:21:57 +00:00
Internalize.cpp Use a StringSet in Internalize, and allow to create the pass from an existing one (NFC) 2016-02-10 23:24:31 +00:00
LLVMBuild.txt [PGO] Passmanagerbuilder change that enable IR level PGO instrumentation 2016-01-21 18:28:59 +00:00
LoopExtractor.cpp LoopInfo: Simplify ownership of Loop objects 2016-01-08 19:08:53 +00:00
LowerBitSets.cpp LowerBitSets: Don't bother to do any work if the llvm.bitset.test intrinsic is unused. 2016-02-03 03:48:46 +00:00
MergeFunctions.cpp Avoid overly large SmallPtrSet/SmallSet 2016-01-30 01:24:31 +00:00
PartialInlining.cpp IPO: Remove implicit ilist iterator conversions, NFC 2015-10-13 17:51:03 +00:00
PassManagerBuilder.cpp Define the ThinLTO Pipeline (experimental) 2016-02-16 23:02:29 +00:00
PruneEH.cpp [PruneEH] Don't try to insert a terminator after another terminator 2016-01-23 06:00:44 +00:00
SampleProfile.cpp Use ArrayRef to hide SmallVector details, kill a useless vector copy along the way. 2016-02-13 16:01:12 +00:00
StripDeadPrototypes.cpp [PM] Port StripDeadPrototypes to the new pass manager 2015-10-30 23:28:12 +00:00
StripSymbols.cpp DI: Reverse direction of subprogram -> function edge. 2015-11-05 22:03:56 +00:00
WholeProgramDevirt.cpp Fix GCC build. 2016-02-09 23:01:38 +00:00