Types of procedural analysis
The z/OS® XL C/C++ compiler performs both intraprocedural and interprocedural analysis.
Intraprocedural analysis is a mechanism for performing optimization for each function in a compilation unit, using only the information available for that function and compilation unit.
Interprocedural analysis is a mechanism for performing optimization across function and compilation unit boundaries. When inlining is in effect, the C/C++ compiler performs a limited form of interprocedural analysis, where it only applies within a compilation unit.
Interprocedural analysis through the IPA compiler option improves
upon the limited interprocedural analysis described above. When you
invoke interprocedural analysis through the IPA option, the compiler
performs optimizations across the entire program. It also performs
optimizations not otherwise available with the C/C++ compiler.
The types of optimizations performed include:
- Inlining across compilation units
- Inlining replaces certain function calls with the actual code of the function. Inlining not only eliminates the linkage overhead but also exposes the entire function to the caller and thus enables the compiler to better optimize your code.
- Program partitioning
- Program partitioning improves performance by reordering functions to exploit locality of reference. Functions that call each other frequently will be closer together in memory.
- Coalescing of global variables
- The compiler puts global variables into one or more structures and accesses the variables by calculating the offsets from the beginning of the structures. This lowers the cost of variable access and exploits data locality.
- Code straightening
- Code straightening streamlines the flow of your program.
- Unreachable code elimination
- Unreachable code elimination removes unreachable code within a function.
- Call graph pruning of unreachable functions
- Call graph pruning of unreachable functions removes code that is 100% inlined or never referenced.
- Intraprocedural constant and set propagation
- IPA propagates floating point and integer constants to their uses and computes constant expressions at compile time. Also, variable uses that are known to be one of several constants can result in the folding of conditionals and switches.
- Intraprocedural pointer alias analysis
- IPA tracks pointer definitions to their uses, resulting in more refined information about memory locations that a pointer dereference may use or define. This enables other parts of the compiler to better optimize code around such dereferences. IPA tracks data and function pointer definitions. When a pointer dereference can only refer to a single memory location or function, the dereference is rewritten to be an explicit reference to the memory location or function.
- Intraprocedural copy propagation
- IPA propagates expressions defining some variables to the uses of the variable. This creates additional opportunities for constant expression folding. It also eliminates redundant variable copies.
- Intraprocedural unreachable code and store elimination
- IPA removes definitions of variables that cannot be reached, along with the computation feeding the definition.
- Conversion of reference (address) arguments to value arguments
- IPA converts reference (address) arguments to value arguments when the formal parameter is not written in the called procedure.
- Conversion of static variables to automatic (stack) variables
- IPA converts static variables to automatic (stack) variables when their use is limited to a single procedure invocation.
The execution time for code optimized using interprocedural
analysis (IPA compile and link) is normally faster than for code optimized
using intraprocedural analysis (IPA compile only) or the OPT compiler
option. Please note that not all applications are suited for IPA optimization
and the performance gains realized from using IPA will vary.
Note: For
additional information about using the IPA(LINK) option, see IPA(LINK) option and exploitation of 64-bit virtual memory.