【问题标题】:Graph coloring register allocator图形着色寄存器分配器
【发布时间】:2012-11-11 23:21:10
【问题描述】:

对于我的编译器课程,我正在为 MIPS 架构构建一个基于图形着色的寄存器分配器。我在执行时遵循 Muchnick 的处理方法。

Muchnick 对如何处理这些分配器中的函数参数有点模糊。

我做了一些假设,并认为我会澄清相同的。

  1. 有此步骤可将中级 IR 转换为低级 IR。尚未处理嵌套函数调用。我的想法是从右到左扫描函数调用,并为最里面的向外调用设置 IR。通过这种方式,我可以使用 MIPS 调用约定,将前几个参数分配给参数寄存器,将其余参数分配给堆栈,溢出量最少(只有 1 个)。
  2. 本书中的寄存器合并处理对我来说并不直观,因为它没有说明如何处理将函数参数移动到固定参数寄存器的 LIR 代码。经过深思熟虑,我得出的结论是,我不应该为参数传递动作进行寄存器合并。

非常感谢您对这些假设的反馈/想法。

【问题讨论】:

    标签: compiler-construction compiler-optimization register-allocation


    【解决方案1】:

    我认为您不想在寄存器分配之前为参数传递从虚拟寄存器移动到关于函数调用实际参数的参数寄存器进行寄存器合并(或者,对于函数调用,在函数入口处复制反之亦然的形式参数)。

    但是,当您看到这样的移动时,您可以给分配器标记一个提示,即移动目标参数寄存器是首选。当首选选项没有适当干扰时*,您可以将其用于分配,结果分配后您将拥有一个move rx,rx,您可以在以后轻松消除它。

    (当然,你可能会发现不止一个这样的提示,那么你就选择最适用的一个,它们中的大多数(通常是全部)都会被排除在其他干扰之外:同一个寄存器传递给多个调用;调用循环等。)

    (* 适当地表示在虚拟寄存器的生命周期内不会使用或丢弃参数(真实)寄存器,例如通过嵌套函数调用或其他方式。(识别这一点可以像检查干扰一样简单虚拟寄存器。))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      相关资源
      最近更新 更多