【发布时间】:2013-02-28 17:34:24
【问题描述】:
我想知道为什么不建议在寄存器分配 (RA) 之后进行持续传播。经过几次优化(后 RA)后,就有了窥孔优化的空间,例如恒定传播/死代码消除等。 我只能想到两个原因,
- 这些优化很容易在 SSA 表单上进行。
- 窥视孔选项。 post RA 将导致编译时间增加。
还有其他原因吗?
如果可以执行窥视孔选择。发布 RA 那么数据结构/算法应该是什么(任何论文、参考资料等都会有所帮助)。
编辑: 响应 500 - Internal Server Error 的评论。 在 phi 消除(例如,在 llvm-clang 中,与寄存器分配合并)等优化通过之后,全局调度如:将指令拉到父基本块等。
EDIT2:
如图所示的例子:
寄存器分配器发现 v1 和 v2 具有相同的值,因此将相同的寄存器 (r1) 分配给它们。寄存器分配后一个公共子表达式消除
pass 可以从基本块#4中消除r2 = r1。
【问题讨论】:
-
一个更好的问题是:寄存器分配之后的持续传播在寄存器分配之前有什么好处?
-
在以前无法轻易(可能更容易)检测到的寄存器分配之后,可以发现哪些持续传播的潜力?
-
@Mysticial,我不赞成一种方法。我想知道为什么我们没有两者(一般来说)。
-
基本上我的意思是在寄存器分配之后执行它不太可能比以前提供更好的结果。那么,如果您以前可以一次完成所有操作,为什么还要费心呢?
-
这不是不可能的,我已经看到了 const 的范围。支柱。在程序集中生成;这就是我一开始好奇的原因。我试图推测 w.r.t 的权衡取舍。实现,编译时间等。
标签: c++ assembly compiler-construction llvm compiler-optimization