6.6.1.17 -mpa=n

Enable the procedure abstraction optimization up to level n. If n is zero, the optimization is disabled. If n is 1, first level of abstraction is allowed; that is, instruction sequences in the source code may be abstracted into a subroutine. If n is 2, a second level of abstraction is allowed; that is, instructions that were put into a subroutine in the first level may be abstracted into a subroutine one level deeper. This pattern continues for larger values of n. The net effect is to limit the subroutine call nesting depth to a maximum of n.

Optimization levels depend on the compiler edition (see 19 Optimizations).

Note: The procedure abstractor behaves as the inverse of inlining functions. The pass is designed to extract common code sequences from multiple sites throughout a translation unit and place them into a common area of code. Although this option generally does not improve the run-time performance of the generated code, it can reduce the code size significantly. Programs compiled with -mpa can be harder to debug.
The procedure abstractor is invoked as a separate phase of compilation, after the production of an assembly file. This phase does not optimize across translation units. When the procedure-optimizing phase is enabled, inline assembly code must be limited to valid machine instructions. Invalid machine instructions or instruction sequences, or assembler directives (sectioning directives, macros, include files, etc.), must not be used, or the procedure abstraction phase will fail, inhibiting the creation of an output file.