11. 寄存器分配
Simplify With Coloring

假设一共K个寄存器
Simplify: 每次随便选一个度数小于K的节点压入栈,然后删掉这个点和相连的所有边。不断迭代直到整张图删完。
Spill: 如果到某一步,发现节点度数>=K (称为significant node) 那 可能 不能用K个寄存器放下了
- 如果选择颜色时邻居恰好用K种不同颜色染色,那就必定有冲突(称为actual spill)。要把这个变量放到栈上。
- 但是如果邻居有相同颜色,也有可能不需要spill 这种情况称为potential spill
Select: 不断弹栈并尝试分配颜色
- 如果度数都
=K也可能成功。 - 如果真的出现冲突(actual spill) 不给这个节点分配颜色,但继续递归处理其他节点
Actual spill会产生新的临时变量(load-store用到)和live rage,那么就需要重做liveness analysis
Coalece
mov a,b 就把a,b连虚线边。删除的时候不能删move-related nodes

Briggs 有小于K个 度数>=K的邻居

George

freeze: 放弃合并(删掉虚线边)