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