线性扫描算法本质是一种贪心算法。通常来说贪心算法得出的是局部最优解,不一定是全局最优。不过文中的线性扫描算法描述比较简单,并没有提及最优化的目标(使用的寄存器最少?寄存器的利用率最高?spill和reload次数最少?)以及选择空闲寄存器的策略是什么。针对不同的优化目标,选择空闲寄存器的策略或许会有不同?
看到下一讲中的例子想到一种情况。比如有这样的代码:
let x = ...
if (...) {
... = x ...
} else {
...
}
... = x ...
活跃性分析会认为在整个if语句中变量x都是活跃的。但其实在else语句块中并不需要x,x所占用的寄存器或许就可以给else中的临时变量使用。如果最优化的目标是使用最少的寄存器的话,这里就是一个可以被进一步优化的点。不过我觉得这个是活跃性分析算法的问题,合并了不同代码块中同一个变量的不同生存期。更精确的分析应该还是要对不同变量之间的依赖关系建图。