forked from OSchip/llvm-project
df49d1bbb2
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 |
||
---|---|---|
.. | ||
ArgumentPromotion.cpp | ||
BarrierNoopPass.cpp | ||
CMakeLists.txt | ||
ConstantMerge.cpp | ||
CrossDSOCFI.cpp | ||
DeadArgumentElimination.cpp | ||
ElimAvailExtern.cpp | ||
ExtractGV.cpp | ||
ForceFunctionAttrs.cpp | ||
FunctionAttrs.cpp | ||
FunctionImport.cpp | ||
GlobalDCE.cpp | ||
GlobalOpt.cpp | ||
IPConstantPropagation.cpp | ||
IPO.cpp | ||
InferFunctionAttrs.cpp | ||
InlineAlways.cpp | ||
InlineSimple.cpp | ||
Inliner.cpp | ||
Internalize.cpp | ||
LLVMBuild.txt | ||
LoopExtractor.cpp | ||
LowerBitSets.cpp | ||
MergeFunctions.cpp | ||
PartialInlining.cpp | ||
PassManagerBuilder.cpp | ||
PruneEH.cpp | ||
SampleProfile.cpp | ||
StripDeadPrototypes.cpp | ||
StripSymbols.cpp | ||
WholeProgramDevirt.cpp |