LLVM Optimizations
LLVM optimizations can be split into three types:
- Analysis: for computing information for debugging or use by transformation passes
- Transformation: to mutate the program and optimize it
- Utility passes: for debugging or testing a particular program
Analysis Passes
Analysis passes can be grouped into:
- Function analysis - dominator and data flow calculations
- Module analysis - finding module boundaries and intra-module deps
- Loop analysis - calculating loop nesting and loop invariant code motion metadata
- Memory analysis - alias and escape analysis
- Target specific analysis - optimizations for specific archs
- Resource usage analysis - checking usage of registers, the stack, etc
Transformation passes
- instruction combining - simplifies and combines similar instructions
- loop invariant code motion - moves computations in a loop that are invariant outside the loop
- global value numbering - identifies and eliminates redundant computations across a program
- dead code elimination - removes code that does not affect behavior of a program
- loop unrolling - optimizing loops
- vectorization - turning data independent loops into vectorized loops
- mem2reg - promote stack references to register references
- constant propagation - merging constant values and replacing values with constants where possible