4.7. Optimization passes

LLVM gives you the possibility to fine-tune optimization passes. llvmlite exposes several of these parameters. Optimization passes are managed by a pass manager; there are two kinds thereof: FunctionPassManager, for optimizations which work on single functions, and ModulePassManager, for optimizations which work on whole modules.

To instantiate any of those pass managers, you first have to create and configure a PassManagerBuilder.

class llvmlite.binding.PassManagerBuilder

Create a new pass manager builder. This object centralizes optimization settings. The following method is available:

populate(pm)

Populate the pass manager pm with the optimization passes configured in this pass manager builder.

The following writable properties are also available:

disable_unroll_loops

If true, disable loop unrolling.

inlining_threshold

The integer threshold for inlining a function into another. The higher, the more likely inlining a function is. This attribute is write-only.

loop_vectorize

If true, allow vectorizing loops.

opt_level

The general optimization level as an integer between 0 and 3.

size_level

Whether and how much to optimize for size. An integer between 0 and 2.

slp_vectorize

If true, enable the “SLP vectorizer”, which uses a different algorithm from the loop vectorizer. Both may be enabled at the same time.

class llvmlite.binding.PassManager

The base class for pass managers.

class llvmlite.binding.ModulePassManager

Create a new pass manager to run optimization passes on a module. Use PassManagerBuilder.populate() to add optimization passes.

The following method is available:

run(module)

Run optimization passes on the module (a ModuleRef instance). True is returned if the optimizations made any modification to the module, False instead.

class llvmlite.binding.FunctionPassManager(module)

Create a new pass manager to run optimization passes on a function of the given module (an ModuleRef instance). Use PassManagerBuilder.populate() to add optimization passes.

The following methods are available:

finalize()

Run all the finalizers of the optimization passes.

initialize()

Run all the initializers of the optimization passes.

run(function)

Run optimization passes on the function (a ValueRef instance). True is returned if the optimizations made any modification to the module, False instead.