Pass Ordering Utilities
Utility for running LLVM’s standard optimization pass pipelines (O0–O3) programmatically.
Headers: include/Optimization/PassOrdering/
Implementation: lib/Optimization/PassOrdering/
Build target: CanaryOptimizationPipeline
Overview
The PassOrdering module provides a small API for running LLVM’s default
optimization pass pipelines (O0, O1, O2, O3) on a module without going through
the opt tool. This is useful when a Lotus tool wants to perform standard
LLVM cleanup or optimisation as a preprocessing step before running its own
analyses.
ModuleOptimizer
File: ModuleOptimizer.h
#include <Optimization/PassOrdering/ModuleOptimizer.h>
llvm::Module *M = ...;
llvm_utils::optimiseModule(M, llvm::OptimizationLevel::O2);
The function llvm_utils::optimiseModule composes the default per-module
pipeline for the requested llvm::OptimizationLevel using
llvm::PassBuilder.
Use cases
Preprocessing: Apply O1/O2 cleanup before alias analysis or bug checking to remove dead code, inline trivial functions, and simplify the IR.
Testing: Quickly run a standard pipeline to verify optimisation interaction with Lotus passes.
Custom tooling: Any tool that needs a standard optimisation baseline without invoking
optas a separate process.
#include <Optimization/PassOrdering/ModuleOptimizer.h>
// Apply O2-level optimisations as preprocessing
llvm_utils::optimiseModule(M, llvm::OptimizationLevel::O2);
// Then run Lotus analysis on the optimised IR
lotus::analysis::nullpointer::NullCheckAnalysis nullCheck(M);
nullCheck.run();
See Also
Scalar Optimizations — Individual scalar optimisation passes
Interprocedural MemorySSA Optimizations — Interprocedural optimisation passes