全域指令選擇¶
警告
本文档為正在進行中的工作。它反映了當前實作的狀態,以及未解決的設計和實作問題。
簡介¶
GlobalISel 是一個框架,為指令選擇提供一組可重複使用的Pass和工具 — 從 LLVM IR 轉換為目標特定的機器碼中繼表示(MIR)。
GlobalISel 旨在取代 SelectionDAG 和 FastISel,以解決三個主要問題
效能 — SelectionDAG 引入了專用的中間表示,這會產生編譯時間成本。
GlobalISel 直接在程式碼產生器其餘部分使用的 post-isel 表示 MIR 上運作。它確實需要擴展該表示以支援任意傳入的 IR:通用機器碼中繼表示。
粒度 — SelectionDAG 和 FastISel 在個別基本區塊上運作,失去了一些全域最佳化機會。
GlobalISel 在整個函式上運作。
模組化 — SelectionDAG 和 FastISel 截然不同,並且共享很少的程式碼。
GlobalISel 的建構方式能夠實現程式碼重用。例如,最佳化和快速選擇器都共享核心管線,並且目標可以配置該管線以更好地滿足其需求。
設計與實作參考¶
有關 GlobalISel 設計和實作的更多資訊,請參閱以下章節。
有關特定Pass的更多資訊,請參閱以下章節
進展與未來工作¶
最初的目標是在 AArch64 上取代 FastISel。下一步將是取代 SelectionDAG 作為最佳化的 ISel。
注意
:在我們迭代 GlobalISel 時,我們力求避免影響 SelectionDAG、FastISel 或其他 MIR Pass 的效能。例如,通用虛擬暫存器的類型儲存在 MachineRegisterInfo
的單獨表格中,該表格在 InstructionSelect 之後被銷毀。
FastISel 取代¶
對於最初的 FastISel 取代,我們打算在選擇失敗時回退到 SelectionDAG。
目前,快速管線的編譯時間在 FastISel 的 1.5 倍以內。我們樂觀地認為可以達到 1.1/1.2 倍以內,但考慮到多Pass方法,要擊敗 FastISel 將會很有挑戰性。儘管如此,支援所有 IR(透過完整的 legalizer)並避免在最壞情況下回退到 SelectionDAG 應該能夠實現比 SelectionDAG+FastISel 更好的攤銷效能。
注意
:我們考慮過永遠不回退到 SelectionDAG,而是儘早決定給定函式是否受 GlobalISel 支援。該決定將基於 Legalizer 查詢。我們基於兩個原因放棄了這種做法:a) 在 IR 輸入上,我們基本上需要模擬 IRTranslator;b) 為了穩健應對不可預見的失敗並實現迭代改進。