优化遍数
LLVM 提供了微调优化遍数的机会。优化遍数由遍数管理器管理。有两种遍数管理器:
FunctionPassManager
,用于对单个函数进行优化的遍数。ModulePassManager
,用于对整个模块进行优化的遍数。
llvmlite 为 LLVM 的新和旧遍数管理器提供了绑定,它们具有略有不同的 API 和行为。它们之间的差异以及新遍数管理器的动机在LLVM 博客关于新遍数管理器的文章中有所概述。
在 llvmlite 的未来版本中,可能与 LLVM 最低版本要求 17 同时,将移除对旧遍数管理器的支持。建议使用 llvmlite 的新代码使用新遍数管理器,并更新使用旧遍数管理器的现有代码以使用新遍数管理器。
新遍数管理器API
为了管理优化属性,我们首先需要实例化一个PipelineTuningOptions
实例
- class llvmlite.binding.PipelineTuningOptions(speed_level=2, size_level=0)
创建一个新的 PipelineTuningOptions 对象。
以下是可用的可写属性,其默认值取决于速度和大小优化级别的初始设置
我们还需要一个PassBuilder
对象来管理相应的函数和模块遍数管理器
- class llvmlite.binding.PassBuilder(target_machine, pipeline_tuning_options)
一个遍数构建器,使用给定的
TargetMachine
和PipelineTuningOptions
实例。- getModulePassManager()
根据 PTO 设置返回一个已填充的
ModulePassManager
对象。
- getFunctionPassManager()
根据 PTO 设置返回一个已填充的
FunctionPassManager
对象。
- start_pass_timing()
启用遍数计时器。
- finish_pass_timing()
返回一个包含 LLVM 生成的计时报告的字符串,并禁用遍数计时器。
ModulePassManager
和 FunctionPassManager
类实现了模块和函数遍数管理器
- class llvmlite.binding.ModulePassManager
一个用于在 LLVM 模块上运行优化遍数的遍数管理器。
- add_verifier()
添加模块验证器 (Module Verifier) 遍数。
- class llvmlite.binding.FunctionPassManager
一个用于在 LLVM 函数上运行优化遍数的遍数管理器。
可以通过使用 PassBuilder.getModulePassManager()
和 PassBuilder.getFunctionPassManager()
方法来创建已填充遍数的这些管理器,或者实例化未填充的管理器,然后使用 add_*
方法添加遍数。
要实例化未填充的实例,请使用
- llvmlite.binding.create_new_module_pass_manager()
创建一个未填充的
ModulePassManager
实例。
和
- llvmlite.binding.create_new_function_pass_manager()
创建一个未填充的
FunctionPassManager
实例。
这两个遍数管理器类都支持的 add_*
方法有
- add_aa_eval_pass()
添加穷举别名分析精度评估器 (Exhaustive Alias Analysis Precision Evaluator) 遍数。
- add_loop_unroll_pass()
添加循环展开 (Loop Unroll) 遍数。
- add_loop_rotate_pass()
添加循环旋转 (Loop Rotate) 遍数。
- add_instruction_combine_pass()
- add_jump_threading_pass()
添加跳转穿线 (Jump Threading) 遍数。
- add_simplify_cfg_pass()
添加简化控制流图 (Simplify CFG) 遍数。
- add_refprune_pass()
添加引用剪枝 (Reference pruning) 遍数。
旧遍数管理器API
要实例化这些遍数管理器中的任何一个,您首先需要创建并配置一个 PassManagerBuilder
。
- class llvmlite.binding.PassManagerBuilder
创建一个新的遍数管理器构建器。此对象集中管理优化设置。
populate
方法可用- populate(pm)
使用此遍数管理器构建器中配置的优化遍数填充遍数管理器 *pm*。
以下是可用的可写属性
- class llvmlite.binding.PassManager
遍数管理器的基类。使用各个
add_*
方法或PassManagerBuilder.populate()
来添加优化遍数。- add_constant_merge_pass()
- add_dead_arg_elimination_pass()
- add_function_attrs_pass()
- add_function_inlining_pass(self)
参见inline 遍数文档。
- add_global_dce_pass()
- add_global_optimizer_pass()
- add_ipsccp_pass()
参见ipsccp 遍数文档。
- add_cfg_simplification_pass()
- add_instruction_combining_pass()
- add_sroa_pass()
-
虽然 scalarrepl 遍数文档描述了此函数添加的遍数执行的转换,但此遍数对应于
opt -sroa
命令行选项,而不是opt -scalarrepl
。
- add_type_based_alias_analysis_pass()
参见tbaa 元数据文档。
- add_basic_alias_analysis_pass()
参见basicaa 遍数文档。
- add_instruction_namer_pass()
- add_refprune_pass()
添加引用剪枝 (Reference pruning) 遍数。
- class llvmlite.binding.ModulePassManager
创建一个新的遍数管理器,用于在模块上运行优化遍数。
run
方法可用- run(module)
在*模块*(一个
ModuleRef
实例)上运行优化遍数。如果优化对模块进行了任何修改,则返回
True
。否则返回False
。