Inter-Procedural Optimizations

This page summarizes inter-procedural optimizations implemented in lib/Optimization/IPO/ plus lib/Optimization/Scalar/AggressiveInliner.cpp and exposed via the lotus-opt tool.

Implementation Location: lib/Optimization/IPO/

Tool

  • Binary: lotus-opt

  • Source: tools/optimization/lotus-opt.cpp

  • Selection flags: -ainline, -ipdse, -ip-rle, -ip-sink, -ip-forward, or -ip-all to run all of them.

Example:

build/bin/lotus-opt -ip-all input.bc -o optimized.bc

Passes

  • AInliner (lib/Optimization/Scalar/AggressiveInliner.cpp) Aggressive inliner to simplify call boundaries and enable downstream IP optimizations.

  • IPDeadStoreElimination (lib/Optimization/IPO/IPDeadStoreElimination.cpp) Removes inter-procedurally provable dead stores.

  • IPRedundantLoadElimination (lib/Optimization/IPO/IPRedundantLoadElimination.cpp) Eliminates redundant loads across function boundaries when safe.

  • IPStoreSinking (lib/Optimization/IPO/IPStoreSinking.cpp) Sinks stores inter-procedurally to reduce redundant writes.

  • IPStoreToLoadForwarding (lib/Optimization/IPO/IPStoreToLoadForwarding.cpp) Forwards values from stores to later loads across calls when possible.

  • ModuleOptimizer (lib/Optimization/Pipeline/ModuleOptimizer.cpp) Driver that wires the above passes into a module-level pipeline.

Notes

  • lib/Optimization/README.md tracks optimization-specific references and evaluation notes for select passes (e.g., prefetching, LICM).

  • Interprocedural MemorySSA Optimizations documents the dedicated lib/Optimization/IPO/ subtree.