4

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

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

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

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

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

4

1 回答 1

2

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

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

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

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

于 2013-01-15T04:23:04.147 回答