Skip to content

Chapter 11: Register Allocation

图着色解决寄存器分配

NP-Compelete 问题

Build

构建冲突图(Chapter 10)

Simplify

如何简化冲突图

  • K - number of machine register
  • 删去邻居数小于 K 的结点(必定能被 K-1 个邻居的颜色之外的颜色着色)
  • 删除了一些结点后,又有一些新的结点可以被删除,直到成为空图
  • 剩下的结点度数都 >= K - Spill(may more than once)

邻居数 >= K 的结点 - significant degree node

Spill

Spill - 把一些结点存到内存中

  • 乐观着色 - 如果邻居的颜色总数 < K,可以找到一个颜色给溢出结点,不会真正溢出
  • 反之 actual spill

Select

按顺序 pop 出来着色

  • 如果发现 actual spill,需要重写程序,回到 Build

Coalescing

合并

  • Move 指令的源节点和目标结点可以合并,用一个寄存器
  • Problem - 新结点的度数可能增加,可能会增大 K 的值
  • 安全合并 - 不会减少图的可着色性

安全合并策略

  • Briggs
    • 尝试合并 a, b
    • 看 a, b 的有 >= K 个结点的邻居
    • 如果这种邻居的个数 < K,则 safe
    • 原因:insignificant nodes 可以先删去,可以找到一个颜色给 a&b
  • George
    • 对于 a 的每个邻居 t
    • 要么 t 也和 b 有一条边(合并成一条)
    • 或 t degree < K(可以提前删)
    • 则 a, b 合并安全

对于非预着色结点,使用 Briggs,

对预着色结点使用 george,此时总是把另一个结点看成 a

图着色流程

alt text

Precolored Nodes

提前分配颜色的结点(如 FP),不能删去