RegBankSelect

このパスは、汎用命令の汎用仮想レジスタオペランドを、いくつかのレジスタバンクに制約します。

これは、オペランドごとのバンク割り当てのセットに命令を繰り返しマッピングします。可能なマッピングは、ターゲットが提供するRegisterBankInfoによって決定されます。その後、マッピングが適用され、必要に応じてCOPY命令が導入される可能性があります。

このパスはMachineFunctionをトップダウンでトラバースするため、命令を分析する際には、すべてのオペランドが既にマッピングされています。

このパスは、有益な場合はターゲット固有の命令も再マッピングできます。将来的には、複数のバンクで使用可能な命令の最適なバリアントを直接選択できるため、ExeDepsFixパスを置き換えることができます。

API: RegisterBankInfo

RegisterBankInfoクラスは、レジスタバンクの複数の側面を記述します。

  • **バンク:** addRegBankCoverage — 各レジスタクラスをカバーするレジスタバンク。

  • **バンク間のコピー:** copyCost — あるバンクから別のバンクへのCOPYのコスト。

  • **デフォルトマッピング:** getInstrMapping — 特定の命令のデフォルトのバンク割り当て。

  • **代替マッピング:** getInstrAlternativeMapping — 特定の命令の他の可能なバンク割り当て。

TODO: これらの情報は最終的に静的になり、主にバンクの説明を拡張した既存の情報を使用してTableGenによって生成される必要があります。

TODO: getInstrMappingは現在getInstrAlternativeMappingとは別になっていますが、後者はより高価です。静的なマッピング情報に移行するにつれて、両方のメソッドは無料になり、マージする必要があります。

RegBankSelectモード

RegBankSelectには現在2つのモードがあります。

  • **高速:** 各命令について、ターゲットが提供する「デフォルト」のバンク割り当てを選択します。これは-O0でのデフォルトです。

  • **貪欲:** 各命令について、ターゲットが提供する複数のバンク割り当ての代替案の中で最も安価なものを選択します。

最終的には、追加の最適化モードを導入する予定です。

  • **グローバル:** 複数の命令にわたって、バンク割り当ての組み合わせの中で最も安価なものを選択します。

NOTE: AArch64では、-O0(またはバックエンドの-O1)でも貪欲モードを使用することを検討しています。低レベル型は浮動小数点と整数スカラーを区別しないため、ロードとストアのデフォルトの割り当ては整数バンクであり、ほとんどの浮動小数点演算でバンク間のコピーが導入されます。