经典的基于图着色模型的寄存器分配

经典的基于图着色模型的寄存器分配:


1、如果变量(在指令/语句序列中,或称程序“基本块”?)不再被use(def也是use),则它dead
2、否则变量live(活着)
3、如果2个变量在一个block/program中都是live,则不能赋以相同的寄存器,在对应的RIG(register inference graph)中,在这2个变量节点之间连接一条边

由上面的描述可以看到,这里的寄存器分配实际上是一个全局算法。并不是只针对单个basic block的。

OK,设限制为k个寄存器,则寄存器分配问题转换为RIG的k-着色问题。NP-hard。

评论:这里的寄存器分配似乎没有涉及到IR?并且是把程序代码中的变量直接映射为机器物理寄存器?对于早期的偏重于数值计算的Fortran语言来说,当然很合理。但是现代语言早已不是这个样子的了:OOP、并发、FP、VM、IR、SSA。那么关于上面的基本约束:如果2个变量同时live,则不能赋以相同寄存器。这条约束是否还有意义呢?

基于图着色模型的寄存器分配算法仅仅是个理论模型,实际所谓的最优并不可能达到,从而需要使用某些启发式。既然如此,为什么不一开始就直接使用某些实用的固定规则呢?假如这样得到的寄存器分配效率并不差多少?


Spilling:将(全局范围的)变量分配到内存而不是寄存器,这样每次用到时都需要先load最后将更新后的值store回去。这将使得一个大的program可以拆分为多个小的sub range,每个range内可使用更少的k-着色。(不过这种思路实在有点见鬼,为什么不在一开始就直接利用利用启发式这么做呢?非得等全局的图着色寄存器分配算法分析过后再rollback?)

你可能感兴趣的:(编译器技术)