1.2.60 $OPTIMIZATION : Enable Optimizations

This switch enables optimization. It can have the following possible values:

ON
Switches on optimizations, corresponding to level 2 optimizations.
OFF
Switches off all kinds of optimizations.
DEFAULT
Returns to default (i.e. command-line or config file) specified optimizations.
XYZ
Parses the string and switches on the optimizations found in the string as if they were passed using the -Oo command line option. The optimizations must be separated by commas.

The following strings are supported:

REGVAR
Use register variables.
UNCERTAIN
Use uncertain optimizations.
SIZE
Optimize for size.
STACKFRAME
Skip stackframes.
PEEPHOLE
Peephole optimizations.
ASMCSE
Use common subexpression elimination at the assembler level.
LOOPUNROLL
Unroll loops.
TAILREC
Change tail recursion to regular while.
ORDERFIELDS
Reorder fields if this results in better alignment.
FASTMATH
Fast math operations.
REMOVEEMPTYPROCS
Remove calls to empty procedures.
CSE
Use common subexpression elimination.
DFA
Use DFA (Data Flow Analysis).
AUTOINLINE
Try to automatically inline procedures where appropriate.
LEVEL1
Enable some level 1 optimizations. Note that this is not the same as -O1, it is a separate flag.
LEVEL2
Enable some level 2 optimizations. Note that this is not the same as -O2, it is a separate flag.
LEVEL3
Level 3 optimizations. Note that this is not the same as -O2, it is a separate flag.
LEVEL4
Level 4 optimizations. Note that this is not the same as -O2, it is a separate flag.
SCHEDULE
ARM CPU only: perform instruction scheduling. Enabled by default at -O3 and higher.
USEEBP
i8086 and i386 CPUs only: use the (E)BP register for register variables when it is not used to hold the frame pointer. Enabled by default when using level 4 optimizations.
USERBP
x86-64 CPU only: use the RBP register for register variables when it is not used to hold the frame pointer. Enabled by default when using level 4 optimizations.
DEADVALUES
Allow removing expressions whose result is not used, even when this can change program behaviour. For example, range check errors can disappear when indexing an array and not doing anything with the loaded value, or access violations due to invalid pointer dereferences can disappear.
Note: it does not (and must not) remove expressions that have explicit side-effects. Enabled by default when using level 4 optimizations.
CONSTPROP
Perform constant propagation across statements. Enabled by default when using level 3 optimizations or higher.
DEADSTORE
Remove stores to variables if the value of that variable is no longer used afterwards. This optimization is not enabled by default at any optimization level. Requires DFA (Data Flow Analysis) to be active (otherwise it won’t do anything), which itself is enabled by default when using level 3 optimizations or higher.
FORCENOSTACKFRAME
ARM and Xtensa CPU only (currently the switch is not yet used there). Do not use a separate frame pointer register if a procedure/function has no nested pure assembler procedures/functions. This requires the compiler to estimate the size of the stack frame in advance, and if that estimate is wrong this will result in an internal compiler error. For this reason it is not enabled by default at any optimization level.
USELOADMODIFYSTORE
Optimize expressions of the form ”x := x ¡op¿ y” by directly modifying the value of x rather than loading, modifying and then storing it. This is not enabled by default at any optimization level.

You can disable a certain optimization by prefixing the value with NO.

Example:

{$OPTIMIZATION ON}

is equivalent to

{$OPTIMIZATION LEVEL2}

Multiple optimizations can be specified with:

{$OPTIMIZATION REGVAR,SIZE,LEVEL2}

Disable loop unrolling with:

{$OPTIMIZATION NOLOOPUNROLL}

This switch is also activated by the -Ooxxx command line switch. Note the small ’o’: it is -Oo followed by the switch name.