我正在研究有关编译器中寄存器分配的主题。一种广泛使用的寄存器分配算法是通过简化的迭代图着色。在Andrew W. Appel所著的Modern Compiler Implementation in Java一书中,关于寄存器分配的第 11 章指出:
干扰图中的每个节点代表一个临时值。
[...]
一些临时对象是预着色的——它们代表机器寄存器。例如,当跨模块边界与标准调用约定接口时,前端会生成这些。对于用于某些特定目的的每个实际寄存器,例如帧指针、标准参数 1 寄存器、标准参数 2 寄存器等,
Codegen
或Frame
模块应使用永久绑定的特定临时寄存器到那个寄存器。对于任何给定的颜色(即,对于任何给定的机器寄存器),应该只有一个该颜色的预着色节点。
我不完全理解上面引用中的指示行。我可以想象有多个临时对象将使用相同的寄存器预着色的情况。例如,x86mul
指令将结果存储在EDX:EAX
寄存器对中,但函数也在EAX
寄存器中返回值。所以我有不同的临时工有相同的颜色。我认为那些不同的用途EAX
必须是不同的节点,还是我错了?
有人可以解释突出显示的句子,或者举一些例子吗?