Skip to content

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: 放弃合并(删掉虚线边)

Comments