2

我正在尋找關於編譯器中的寄存器分配的主題。一種廣泛使用的寄存器分配算法是通過簡化迭代圖着色。在寄存器分配狀態的書Modern Compiler Implementation in Java由Andrew W.阿佩爾,第11章:寄存器分配中的預着色節點 - 每種顏色的最大值之一?

干涉圖中的每個節點都代表一個臨時值。

[...]

一些臨時工是預着色 - 它們代表了機器寄存器。例如,前端在跨模塊邊界接口到標準調用約定時會生成這些約定。對於用於某些特定目的的每個實際寄存器,如幀指針,標準變元1寄存器,標準變元2寄存器等等,CodegenFrame模塊應使用特定的臨時永久綁定到該註冊表。 對於任何給定的顏色(即,對於任何給定的機器寄存器),應該只有一種顏色的預着色節點。

我不完全理解上面引用中的指定行。我可以想象有多個臨時對象會被同一個寄存器預先着色的情況。例如,x86 mul指令將結果存儲在EDX:EAX寄存器對中,但函數也會返回EAX寄存器中的值。所以我有不同的具有相同顏色的臨時對象。我認爲EAX的這些不同用途必須是不同的節點,或者我錯了嗎?

有人可以解釋突出顯示的句子,也許出現一些例子嗎?

回答

0

在這本書中,想法是,您將擁有一個臨時EAX,您可以使用這兩個臨時EAX,並使用和返回值。當某個值需要在給定的寄存器中時,您會從包含該值的臨時值到代表該寄存器的臨時值生成一個移動;同樣,一旦某個值已經到達某個特定的寄存器(例如,一個函數已經返回),就會生成一個從寄存器的臨時位置移動到臨時位置的臨時位置,該臨時位置將保留該位置的值。參見本書中的圖11.7。

+0

因此,概括:在一個方法中用於多種不同目的的相同變量(虛擬臨時或機器寄存器)只能用干擾圖中的一個單一節點表示? – Virtlink

+0

我不認爲你的泛化是有效的。它適用於爲預着色目的代表特定寄存器的臨時對象。 – ibid

相關問題