无限多个虚拟寄存器 映射到 有限的 物理寄存器 上面 多对一。 选择的问题。 无法映射的 保存到内存。溢出。spiled 组合优化的问题。遵守约定,约束条件,正确性,优化目标 生成代码的质量。内存访问与寄存器访问,尽可能少的触碰内存。np hard.各种约束下面。
算法核心思想:在同一个程序点上活跃的(之后可能会被用到)变量是有冲突的,不能分配到同一个寄存器。
活跃区间 live interval 在控制流上去找 而不是在线性的代码里
计算每个变量的活跃区间,在任意的程序点上 哪些变量是活跃的
活跃 live
对于给定的变量x,考虑从其一个定义点p到使用点q的路径l.对于该路径l上的任意点r,如果r和q之间没有对变量x的其他定义,则称x在程序点r上是活跃的。
若再定义,就覆盖了。
livein(s) liveout(s) 折行代码执行前后 哪些代码是活跃的
线性扫描分配算法 三大关键操作:占用 释放 溢出
- 占用: 把一个物理寄存器分配给一个变量 Or 这个变量占用了这个寄存器
- 释放: 程序点 到达 到达 变量不活跃的 点 释放它所占用的 寄存器
- 溢出 : 没有新的寄存器可用了。不同策略。待分配的变量直接溢出到内存;已经占用的那些变量里面挑一个(一般选择右端点最远的,活跃区间很大 更有可能和其他寄存器产生冲突)放到物理内存里;