如何获取LLVM中O1、O2、O3优化等级对应的Pass执行顺序
获取LLVM O级优化Pass执行顺序的方法
方法1:过滤调试输出得到有序Pass列表
默认opt -O3 -debug-pass-manager输出冗余内容较多,可以通过管道过滤得到仅含Pass名称的执行顺序列表,对应命令如下:
# 以O3为例,将参数替换为O1/O2即可得到对应优化等级的结果 opt -O3 -disable-output -debug-pass-manager 2>&1 | grep "Running pass" | awk -F "'" '{print $2}'
输出的每一行就是按执行顺序排列的Pass完整名称。
注:该方法同时适配新、旧版本Pass Manager
方法2:直接获取逗号分隔的短名称Pass列表
如果你需要类似mem2reg,dce,always-inline格式的、可直接用于传参的Pass列表,可以直接使用-print-pipeline-passes参数,无需手动过滤冗余输出:
# 查看O2的Pass管线,将-O2替换为对应优化等级即可 opt -O2 -print-pipeline-passes < /dev/null
该命令会直接输出按执行顺序排列、逗号分隔的Pass短名称列表,完全匹配你需要的格式。
注:-print-pipeline-passes为新Pass Manager的参数,适用于LLVM 12及以上版本
相关参考说明路径
- 最准确的Pass管线定义在LLVM源码的
llvm/lib/Passes/PassBuilder.cpp文件中,各个优化等级的Pass组装逻辑、执行顺序都有明确的代码实现,不同LLVM版本的管线调整都会同步更新到该文件,直接对照源码对比你自己设计的Pass顺序准确性最高。 - LLVM官方文档的Pass章节提供了所有内置Pass的功能说明、调用参数信息,你可以对应查询每个Pass的作用。
内容的提问来源于stack exchange,提问作者Shane
相关产品推荐
相关产品推荐

