全域指令選擇

警告

本文件仍在編寫中。它反映了實作的當前狀態,以及開放的設計和實作問題。

簡介

GlobalISel 是一個框架,它提供了一組可重複使用的過程和工具,用於指令選擇——從 LLVM IR 轉換為目標特定的機器 IR (MIR)。

GlobalISel 旨在取代 SelectionDAG 和 FastISel,以解決三個主要問題

  • **效能**——SelectionDAG 引入了一個專用的中間表示,這會產生編譯時間成本。

    GlobalISel 直接對其餘程式碼產生器 MIR 使用的後 isel 表示進行操作。它確實需要擴展該表示以支援任意傳入的 IR:通用機器 IR

  • **粒度**——SelectionDAG 和 FastISel 對個別的基本區塊進行操作,失去了一些全域最佳化的機會。

    GlobalISel 對整個函式進行操作。

  • **模組化**——SelectionDAG 和 FastISel 截然不同,共用的程式碼很少。

    GlobalISel 的建構方式能夠實現程式碼重複使用。例如,最佳化選擇器和快速選擇器都共用核心管線,並且目標可以配置該管線以更好地滿足其需求。

設計與實作參考

有關 GlobalISel 設計和實作的更多資訊,請參閱以下章節。

有關特定過程的更多資訊,請參閱以下章節

進度和未來工作

最初的目標是在 AArch64 上替換 FastISel。下一步將是替換 SelectionDAG 作為最佳化的 ISel。

注意:在我們迭代 GlobalISel 時,我們努力避免影響 SelectionDAG、FastISel 或其他 MIR 過程的效能。例如,通用虛擬暫存器 的類型儲存在 MachineRegisterInfo 的單獨表格中,該表格在 InstructionSelect 之後被銷毀。

FastISel 替換

對於最初的 FastISel 替換,我們打算在選擇失敗時回退到 SelectionDAG。

目前,快速管線的編譯時間在 FastISel 的 1.5 倍以內。我們樂觀地認為可以達到 1.1/1.2 倍以內,但考慮到多遍方法,要超越 FastISel 將具有挑戰性。儘管如此,支援所有 IR(透過完整的合法化器)並避免在最壞情況下回退到 SelectionDAG 應該能夠實現比 SelectionDAG+FastISel 更好的攤銷效能。

注意:我們曾考慮過永遠不要回退到 SelectionDAG,而是在早期就決定 GlobalISel 是否支援給定的函數。該決定將基於 合法化器 查詢。我們放棄這種做法有兩個原因:a) 在 IR 輸入上,我們基本上需要模擬 IR 轉譯器;b) 為了增強對不可預見的故障的抵抗力並實現迭代改進。