RegBankSelect¶
此過程將通用指令的 通用虛擬暫存器 運算元約束到某些 暫存器庫。
它迭代地將指令映射到一組每個運算元的庫分配。可能的映射由目標提供的 RegisterBankInfo 決定。然後應用映射,如果需要,可能會引入 COPY
指令。
它由上而下遍歷 MachineFunction
,以便在分析指令時所有運算元都已映射。
當有益時,此過程還可以重新映射特定於目標的指令。將來,這可以取代 ExeDepsFix 過程,因為我們可以直接為多個庫上可用的指令選擇最佳變體。
API:RegisterBankInfo¶
RegisterBankInfo
類別描述了暫存器庫的多個方面。
庫:
addRegBankCoverage
— 哪個暫存器庫涵蓋每個暫存器類別。跨庫複製:
copyCost
— 從一個庫COPY
到另一個庫的成本。預設映射:
getInstrMapping
— 給定指令的預設庫分配。替代映射:
getInstrAlternativeMapping
— 給定指令的其他可能庫分配。
TODO
:所有這些信息最終都應該是靜態的,並由 TableGen 生成,主要使用現有信息,並輔以庫描述。
TODO
:getInstrMapping
目前與 getInstrAlternativeMapping
分開,因為後者成本更高:當我們轉移到靜態映射信息時,這兩種方法應該是免費的,我們應該將它們合併。
RegBankSelect 模式¶
RegBankSelect
目前有兩種模式
快速 — 為每個指令選擇一個目標提供的“預設”庫分配。這是 -O0 的預設值。
貪婪 — 為每個指令選擇幾個目標提供的庫分配方案中最便宜的一個。
我們打算最終引入一種額外的優化模式
全域 — 在多個指令中,選擇最便宜的庫分配組合。
注意
:在 AArch64 架構上,我們正在考慮即使在 -O0(或後端 -O1)也使用 Greedy 模式:因為低級別類型沒有區分浮點數和整數純量,載入和儲存的預設分配是整數 bank,這會在大部分浮點運算中引入跨 bank 複製。