针对目标体系结构的优化
针对于目标体系结构的优化,也就是后端的优化。
pass 顺序与最优解
不用想了。pass 的排序什么只能在约束的环境下可能有一个最优解,但是在开放的条件下,很难有一套理论说明哪个是最优解。因此 pass 的排序安排应该是一个实践性的问题,应该是长期以来的实验结果决定的。如果要进行搜索,可能也是要自己设计一套性能模型去搜,然后选出最好的。
我认为在编译领域里选最优的问题就完全是开放问题了,对于理论推倒的要求太高,不能再进行下去了。
编译器后端
编译器后端需要做 4 件大事。
- 指令选择:从体系结构无关到体系结构有关。
- 控制流合并和布局:合并是对控制流的优化,可能是能将 if 转成 cmov 这类的吧。布局则是针对体系结构的 BTB 设计进行冷热代码的布局。
- 指令调度:合理的排布指令的顺序。
- 寄存器分配: 虚拟寄存器到物理寄存器。
这 4 个是后端最需要做的事。剩下的可能就是一些针对体系结构特征的专用优化。
指令调度和寄存器分配
这两个东西互相矛盾的。如果先进行全面的指令调度,寄存器分配的压力可能就变得很大。如果先进行寄存器分配,在分配完成之后,引入了 WAW 等依赖关系,指令调度又很难优化。所以现在的做法是指令调度在寄存器分配的前后各做一次,分别称为 pre-ra 和 post-ra。pre-ra 只做简单的调度,并且在调度的时候有模型在计算寄存器压力,是考虑寄存器压力的调度。然后进行寄存器分配,寄存器分配有他自己的算法。然后进行 post-ra 的调度,这个时候针对处理器模型什么的进行全面的调度。现在的主流做法应该是这样。
结论
理论性太强,还是学学中端优化吧。