4

對於我的編譯器課程,我正在構建基於MIPS架構圖着色的寄存器分配器。對於我的實施,我正在遵循Muchnick的處理方法。圖着色寄存器分配器

對於如何在這些分配器中處理函數的參數,Muchnick一直有點模糊。

我做了一些假設,並認爲我會澄清相同的。

  1. 有這個步驟可以從中級IR轉換到較低級別的IR。嵌套函數調用尚未處理。我的想法是從右向左掃描函數調用,並向外放置最內層調用的IR。通過這種方式,我可以使用MIPS調用約定爲參數寄存器分配前幾個參數,其餘的以最小量的溢出(僅爲1)進行堆棧。
  2. 書中的註冊合併處理對我來說並不直觀,因爲它沒有解決處理固定參數寄存器的移動函數參數的LIR代碼的方式。經過深思熟慮之後,我得出結論:我不應該爲參數傳遞動作進行註冊合併。

對這些假設的反饋/想法非常感謝。

回答

2

我想你不想做的寄存器分配寄存器前合併爲(或者,在函數入口複製反之亦然函數調用形式參數)參數傳遞從虛擬寄存器移動到參數寄存器進行關於函數調用的實際參數。

但是,當您看到這樣的動作時,您可以給分配器添加一個提示,以便移動目標參數寄存器是首選選項。當首選選項不會適當地干擾*時,您可以將其用於分配,結果分配後您將擁有一個move rx,rx,您可以稍後輕鬆消除該分配。 (當然,你可能會發現不止一個這樣的提示,所以你採取最適用的提示,大多數(通常是全部)他們將被排除其他干擾:相同的寄存器傳遞給多個呼叫;呼叫在一個循環等等。)

(*適當的意思是說,參數(真正的)寄存器不會在虛擬寄存器的生命週期中被其他方式使用或拋出,例如通過嵌套函數調用或其他。識別這個可以像檢查虛擬寄存器的干擾一樣簡單。))