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.
After lowering the
LIR, the optimizer will eliminate code that is not reachable.
main: CPush(0) main: Ret => CPush(0) CPush(1) Ret ...
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(0) CPush(1) => CPush(2) Add
Note: The optimizer currently only optimizes expressions if all operands are constant and does not cover neutral elements like
* 1as such.
It is common for languages to avoid evaluating the second operand of
And operations if the first term is already sufficient for the expressions outcome.
The optimizer will merge instruction sequences like this:
... Not => Jf Jt