"""1Demonstration of llvmlite's New Pass Manager API.23This example shows how to use the new pass manager to optimize LLVM IR.4Comments show the equivalent legacy pass manager approach for comparison.5"""67import llvmlite.binding as llvm89# Initialize LLVM10llvm.initialize_native_target()11llvm.initialize_native_asmprinter()1213# Create a module with some sample IR14module = llvm.parse_assembly("""15define i32 @test_function(i32 %x, i32 %y) {16entry:17%z = add i32 %x, %y18%w = add i32 %z, 0 ; This can be optimized away19%t = mul i32 %w, 1 ; This can also be optimized away20ret i32 %t21}2223define i32 @unused_function() {24entry:25ret i32 4226}27""")2829print("Original IR:")30print(str(module))3132# Create target machine33target = llvm.Target.from_default_triple()34target_machine = target.create_target_machine()3536# NEW PASS MANAGER API:37# Create pipeline tuning options with optimization settings38pto = llvm.create_pipeline_tuning_options(speed_level=2, size_level=0)39# LEGACY EQUIVALENT:40# pmb = llvm.PassManagerBuilder()41# pmb.opt_level = 242# pmb.size_level = 04344# Optionally customize the tuning options45pto.loop_vectorization = True46pto.slp_vectorization = True47pto.loop_unrolling = True48# LEGACY EQUIVALENT:49# pmb.loop_vectorize = True50# pmb.slp_vectorize = True51# pmb.disable_unroll_loops = False5253# Create the pass builder54pass_builder = llvm.create_pass_builder(target_machine, pto)55# LEGACY EQUIVALENT: PassManagerBuilder handles this internally5657# Get a populated module pass manager58mpm = pass_builder.getModulePassManager()59# LEGACY EQUIVALENT:60# mpm = llvm.ModulePassManager()61# pmb.populate(mpm)6263# Run the optimization passes64mpm.run(module, pass_builder)65# LEGACY EQUIVALENT:66# changed = mpm.run(module)6768print("\nOptimized IR:")69print(str(module))7071# For function-level optimizations, you can also use:72fpm = pass_builder.getFunctionPassManager()73# LEGACY EQUIVALENT:74# fpm = llvm.FunctionPassManager(module)75# pmb.populate(fpm)76# fpm.initialize()7778for function in module.functions:79fpm.run(function, pass_builder)80# LEGACY EQUIVALENT:81# for function in module.functions:82# fpm.run(function)83# fpm.finalize() # Call after all functions are processed848586