A rudimentary peephole optimizer is enabled by default. It acts upon the generated LIR. If you want to disable optimization at all, use the method build_with_options and set the attribute optimize to false.

lovm2 gives you a guarantee that your LV2Function will not be unexpectedly altered when lowering.

Dead Code elimination

After lowering the LIR, the optimizer will eliminate code that is not reachable.

    CPush(0)        main:
    Ret        =>       CPush(0)
    CPush(1)            Ret

Constant evaluation

Computing constant operations ahead can not only improve the programs performance, but also drop certain constants out of the LV2CodeObject reducing its size. Bytecode sequences will be tranformed like this:

CPush(1)   =>   CPush(2)

Note: The optimizer currently only optimizes expressions if all operands are constant and does not cover neutral elements like + 0 or * 1 as such.

Logical short-curcuit

It is common for languages to avoid evaluating the second operand of Or/And operations if the first term is already sufficient for the expressions outcome.

Logical negation

The optimizer will merge instruction sequences like this:

Not   =>   Jf