グローバル命令選択

警告

このドキュメントは作成中です。これは、実装の現状、および未解決の設計および実装上の問題を反映しています。

はじめに

GlobalISel は、命令選択のための再利用可能なパスとユーティリティのセットを提供するフレームワークです。つまり、LLVM IR からターゲット固有のマシン IR (MIR) への変換を行います。

GlobalISel は、SelectionDAG と FastISel の代替として、次の 3 つの主要な問題を解決することを目的としています。

  • パフォーマンス — SelectionDAG は専用の中間表現を導入しており、コンパイル時にコストがかかります。

    GlobalISel は、コードジェネレーターの残りの部分で使用される、isel 後の表現である MIR を直接操作します。任意の入力 IR をサポートするために、その表現の拡張が必要です: 汎用マシン IR

  • 粒度 — SelectionDAG と FastISel は個々の基本ブロックで動作するため、いくつかのグローバル最適化の機会を失います。

    GlobalISel は関数全体で動作します。

  • モジュール性 — SelectionDAG と FastISel は根本的に異なり、共有するコードはほとんどありません。

    GlobalISel は、コードの再利用を可能にする方法で構築されています。たとえば、最適化されたセレクターと高速セレクターの両方が コアパイプライン を共有し、ターゲットはそのパイプラインをニーズに合わせてより適切に構成できます。

設計と実装のリファレンス

GlobalISel の設計と実装の詳細については、以下のセクションをご覧ください。

特定のパスの詳細については、以下のセクションをご覧ください

進捗と今後の作業

最初の目標は、AArch64 で FastISel を置き換えることです。次のステップは、最適化された ISel として SelectionDAG を置き換えることです。

: GlobalISel を反復処理する間、SelectionDAG、FastISel、または他の MIR パスのパフォーマンスに影響を与えないように努めています。たとえば、汎用仮想レジスタ の型は、MachineRegisterInfo の別のテーブルに格納され、InstructionSelect の後に破棄されます。

FastISelの置き換え

最初の FastISel の置き換えでは、選択に失敗した場合に SelectionDAG にフォールバックする予定です。

現在、高速パイプラインのコンパイル時間は FastISel の 1.5 倍以内です。1.1/1.2 倍以内に到達できると楽観視していますが、マルチパスアプローチを考えると FastISel を打ち負かすのは難しいでしょう。それでも、すべてをサポートし(完全なリーガライザーを介して)、最悪の場合に SelectionDAG へのフォールバックを回避することで、SelectionDAG + FastISelよりも優れた償却パフォーマンスを可能にするはずです。

: SelectionDAG へのフォールバックを一切しないことを検討しました。代わりに、特定の関数が GlobalISel でサポートされているかどうかを早期に決定します。この決定は、Legalizer クエリに基づいて行われます。私たちは2つの理由からそれを断念しました。a) IR入力では、基本的に IRTranslator をシミュレートする必要がありました。b) 予期しない障害に対して堅牢であり、反復的な改善を可能にするためです。