在编译器的中间表示中,一般会设定虚拟寄存器有无限多个(方便优化),而真实的物理寄存器是有限的,因而编译器后端在将中间表示翻译成目标指令集的时候会进行寄存器分配,也就是将无限的虚拟寄存器映射到有限的物理寄存器上。例如:
a := c + d
e := a + b
f := e - 1
a + b
后a
的寄存器可以被复用,e - 1
后e
的寄存器可以被复用,因而a
、e
、f
可以分配相同的寄存器。
r1 := r2 + r3
r1 := r1 + r4
r1 := r1 - 1
如果两个两个临时变量t1
和t2
在不同的程序点只有一个是活跃的,则t1
和t2
可以分配相同的物理寄存器。否则,如果t1
和t2
如果同时活跃,则不能分配相同的物理寄存器。
接下来介绍图着色的寄存器分配算法。图着色算法首先要进行活跃分析,得到冲突图,然后通过对冲突图进行着色来解决寄存器分配问题。
变量的活跃分析采用数据流分析的方法,具体可以参阅。这里直接给出活跃分析结果:
因篇幅问题不能全部显示,请点此查看更多更全内容