2

我正在研究有关编译器中寄存器分配的主题。一种广泛使用的寄存器分配算法是通过简化的迭代图着色。在Andrew W. Appel所著的Modern Compiler Implementation in Java一书中,关于寄存器分配的第 11 章指出:

干扰图中的每个节点代表一个临时值。

[...]

一些临时对象是预着色的——它们代表机器寄存器。例如,当跨模块边界与标准调用约定接口时,前端会生成这些。对于用于某些特定目的的每个实际寄存器,例如帧指针、标准参数 1 寄存器、标准参数 2 寄存器等,CodegenFrame模块应使用永久绑定的特定临时寄存器到那个寄存器。对于任何给定的颜色(即,对于任何给定的机器寄存器),应该只有一个该颜色的预着色节点。

我不完全理解上面引用中的指示行。我可以想象有多个临时对象将使用相同的寄存器预着色的情况。例如,x86mul指令将结果存储在EDX:EAX寄存器对中,但函数也在EAX寄存器中返回值。所以我有不同的临时工有相同的颜色。我认为那些不同的用途EAX必须是不同的节点,还是我错了?

有人可以解释突出显示的句子,或者举一些例子吗?

4

1 回答 1

0

在本书中,想法是,您将拥有一个临时 EAX,您可以将其mul用于返回值和用于返回值。当某个值需要在给定寄存器中时,您会生成从包含该值的临时值到表示该寄存器的临时值的移动;类似地,一旦一个值到达特定寄存器(例如,一个函数返回),您将生成从寄存器的临时到将从此保存该值的临时的移动。参见书中的图 11.7。

于 2012-11-29T09:30:11.493 回答