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.