参考书:《Getting Started with LLVM Core Libraries》
一、优化参数:
- -O0 : 不优化,用于代码调试
- -O1 :介于 O0 和 O2之间
- -O2 :中等优化
- -Os :类似于 O2 ,体积更小
- -Oz :类似于 Os , 体积最小
- -O3 :类似于 O2 ,代码体积大于 O2,但是运行速度更快
- -O4 :类似于 O3 ,增加了链接时优化。
其他优化参数:
- -std-compile-opts : 标准编译时优化
- -std-link-opts : 标准链接时优化
二、PASS 依赖
- Optimizations are usually composed of analysis and transform passes.
优化主要由分析类pass和转化类pass组成 - 显示依赖:
pass manager 全局管理pass类,如果一个pass依赖其他pass,pass manager 会先静默加载其他的pass,然后在运行这个pass - 隐式依赖:
一些转化和分析类pass依赖某些特定用法的IR代码,比如一个pass被指定只能在某个pass之后工作,这就诞生了隐式依赖。
这一段不好理解,我看了书中这一段很多次才有点理解
显示依赖就是强依赖,这些依赖必须满足,否则报错;
隐式依赖就是弱依赖,不满足会跳过正常执行。
三、PASS API
pass类是实现优化的主要类,但是这个pass类并不是直接使用,而是靠它的子类实现,下面是一些公共的子类:
ModulePass : 这是一个最普遍的pass,它允许你立即分析某个module,而无需任何特定的函数顺序。要使用它需要写一个子类继承ModulePass,必须要重写函数runOnModule()
FunctionPass : 这是一个用的最多的pass类型,允许一次处理一个函数,而不需要特定的顺序,它禁止修改其他函数、函数删除、全局量量的删除。使用它要重写runOnFunction()
BasicBlockPass :他处理基础块,类似于FunctionPass,它禁止修改其他BasicBlock,BasicBloc删除。使用时要重写runOnBasicBlock()
重写的入口函数:runOnModule、runOnFunction、runOnBasicBlock返回一个bool值,false表示操作的基本单元(module、function、basicblock)未改变,true表示改变