llvm-project/llvm/lib/Transforms/IPO
Peter Collingbourne df49d1bbb2 WholeProgramDevirt: introduce.
This pass implements whole program optimization of virtual calls in cases
where we know (via bitset information) that the list of callees is fixed. This
includes the following:

- Single implementation devirtualization: if a virtual call has a single
  possible callee, replace all calls with a direct call to that callee.

- Virtual constant propagation: if the virtual function's return type is an
  integer <=64 bits and all possible callees are readnone, for each class and
  each list of constant arguments: evaluate the function, store the return
  value alongside the virtual table, and rewrite each virtual call as a load
  from the virtual table.

- Uniform return value optimization: if the conditions for virtual constant
  propagation hold and each function returns the same constant value, replace
  each virtual call with that constant.

- Unique return value optimization for i1 return values: if the conditions
  for virtual constant propagation hold and a single vtable's function
  returns 0, or a single vtable's function returns 1, replace each virtual
  call with a comparison of the vptr against that vtable's address.

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

llvm-svn: 260312
2016-02-09 22:50:34 +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 [FunctionAttrs] Fix SCC logic around operand bundles 2016-02-09 18:40:40 +00:00
FunctionImport.cpp [ThinLTO] Do metadata linking during batch function importing 2016-01-22 00:15:53 +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 IPO: Remove implicit ilist iterator conversions, NFC 2015-10-13 17:51:03 +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 WholeProgramDevirt: introduce. 2016-02-09 22:50:34 +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 Avoid overly large SmallPtrSet/SmallSet 2016-01-30 01:24:31 +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 WholeProgramDevirt: introduce. 2016-02-09 22:50:34 +00:00