我正在尋找關於編譯器中的寄存器分配的主題。一種廣泛使用的寄存器分配算法是通過簡化迭代圖着色。在寄存器分配狀態的書Modern Compiler Implementation in Java由Andrew W.阿佩爾,第11章:寄存器分配中的預着色節點 - 每種顏色的最大值之一?
干涉圖中的每個節點都代表一個臨時值。
[...]
一些臨時工是預着色 - 它們代表了機器寄存器。例如,前端在跨模塊邊界接口到標準調用約定時會生成這些約定。對於用於某些特定目的的每個實際寄存器,如幀指針,標準變元1寄存器,標準變元2寄存器等等,
Codegen
或Frame
模塊應使用特定的臨時永久綁定到該註冊表。 對於任何給定的顏色(即,對於任何給定的機器寄存器),應該只有一種顏色的預着色節點。
我不完全理解上面引用中的指定行。我可以想象有多個臨時對象會被同一個寄存器預先着色的情況。例如,x86 mul
指令將結果存儲在EDX:EAX
寄存器對中,但函數也會返回EAX
寄存器中的值。所以我有不同的具有相同顏色的臨時對象。我認爲EAX
的這些不同用途必須是不同的節點,或者我錯了嗎?
有人可以解釋突出顯示的句子,也許出現一些例子嗎?
因此,概括:在一個方法中用於多種不同目的的相同變量(虛擬臨時或機器寄存器)只能用干擾圖中的一個單一節點表示? – Virtlink
我不認爲你的泛化是有效的。它適用於爲預着色目的代表特定寄存器的臨時對象。 – ibid