我想知道为什么不建议在寄存器分配(RA)之后进行持续传播。经过几次优化(后 RA)之后,就有了窥视孔优化的空间,比如不断传播/死代码消除等。我只能想到两个原因,
- 这些优化很容易在 SSA 表单上进行。
- 窥视孔选择。post RA 将导致编译时间增加。
还有其他原因吗?
如果可以执行窥视孔选择。发布 RA 那么数据结构/算法应该是什么(任何论文、参考资料等都会有所帮助)。
编辑:响应 500 - Internal Server Error 的评论。在 phi 消除(例如,在 llvm-clang 中,与寄存器分配合并)等优化通过之后,全局调度如:将指令拉到父基本块等。
编辑2:
在图中所示的示例中:寄存器分配器计算出 v1 和 v2 具有相同的值,因此,将相同的寄存器 (r1) 分配给它们。在寄存器分配之后,公共子表达式消除过程可以r2 = r1
从基本块#4 中消除。