Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 图着色寄存器分配器_Compiler Construction_Compiler Optimization_Register Allocation - Fatal编程技术网

Compiler construction 图着色寄存器分配器

Compiler construction 图着色寄存器分配器,compiler-construction,compiler-optimization,register-allocation,Compiler Construction,Compiler Optimization,Register Allocation,在我的编译器课程中,我正在为MIPS体系结构构建一个基于图着色的寄存器分配器。我正在遵循Muchnick对我的实施的相同处理 Muchnick对如何处理这些分配器中的函数参数有些模糊 我已经做了一些假设,我想我会澄清同样的问题 有一个步骤可以将中级IR转换为低级IR。嵌套函数调用尚未处理。我的想法是从右到左扫描函数调用,并为最内部的向外调用设置IRs。通过这种方式,我可以使用MIPS调用约定,将前几个参数分配给参数寄存器,剩余的参数分配给堆栈,溢出量最小(只有1个) 书中的寄存器合并处理对我来说

在我的编译器课程中,我正在为MIPS体系结构构建一个基于图着色的寄存器分配器。我正在遵循Muchnick对我的实施的相同处理

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

我已经做了一些假设,我想我会澄清同样的问题

  • 有一个步骤可以将中级IR转换为低级IR。嵌套函数调用尚未处理。我的想法是从右到左扫描函数调用,并为最内部的向外调用设置IRs。通过这种方式,我可以使用MIPS调用约定,将前几个参数分配给参数寄存器,剩余的参数分配给堆栈,溢出量最小(只有1个)
  • 书中的寄存器合并处理对我来说并不直观,因为它没有说明如何处理将函数参数移动到固定参数寄存器的LIR代码。经过深思熟虑,我得出结论,我不应该为通过辩论的动作进行注册合并
    非常感谢您对这些假设的反馈/想法。

    我认为您不希望在寄存器分配之前对参数进行寄存器合并,将函数调用的实际参数从虚拟寄存器传递到参数寄存器(或者,对于函数调用,在函数项上复制的形式参数,反之亦然)

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

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

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