RegBankSelect

此過程將通用指令的 通用虛擬暫存器 運算元約束到某些 暫存器庫

它迭代地將指令映射到一組每個運算元的庫分配。可能的映射由目標提供的 RegisterBankInfo 決定。然後應用映射,如果需要,可能會引入 COPY 指令。

它由上而下遍歷 MachineFunction,以便在分析指令時所有運算元都已映射。

當有益時,此過程還可以重新映射特定於目標的指令。將來,這可以取代 ExeDepsFix 過程,因為我們可以直接為多個庫上可用的指令選擇最佳變體。

API:RegisterBankInfo

RegisterBankInfo 類別描述了暫存器庫的多個方面。

  • addRegBankCoverage — 哪個暫存器庫涵蓋每個暫存器類別。

  • 跨庫複製copyCost — 從一個庫 COPY 到另一個庫的成本。

  • 預設映射getInstrMapping — 給定指令的預設庫分配。

  • 替代映射getInstrAlternativeMapping — 給定指令的其他可能庫分配。

TODO:所有這些信息最終都應該是靜態的,並由 TableGen 生成,主要使用現有信息,並輔以庫描述。

TODOgetInstrMapping 目前與 getInstrAlternativeMapping 分開,因為後者成本更高:當我們轉移到靜態映射信息時,這兩種方法應該是免費的,我們應該將它們合併。

RegBankSelect 模式

RegBankSelect 目前有兩種模式

  • 快速 — 為每個指令選擇一個目標提供的“預設”庫分配。這是 -O0 的預設值。

  • 貪婪 — 為每個指令選擇幾個目標提供的庫分配方案中最便宜的一個。

我們打算最終引入一種額外的優化模式

  • 全域 — 在多個指令中,選擇最便宜的庫分配組合。

注意:在 AArch64 架構上,我們正在考慮即使在 -O0(或後端 -O1)也使用 Greedy 模式:因為低級別類型沒有區分浮點數和整數純量,載入和儲存的預設分配是整數 bank,這會在大部分浮點運算中引入跨 bank 複製。