| .. _regbankselect: |
| |
| RegBankSelect |
| ------------- |
| |
| This pass constrains the :ref:`gmir-gvregs` operands of generic |
| instructions to some :ref:`gmir-regbank`. |
| |
| It iteratively maps instructions to a set of per-operand bank assignment. |
| The possible mappings are determined by the target-provided |
| :ref:`RegisterBankInfo <api-registerbankinfo>`. |
| The mapping is then applied, possibly introducing ``COPY`` instructions if |
| necessary. |
| |
| It traverses the ``MachineFunction`` top down so that all operands are already |
| mapped when analyzing an instruction. |
| |
| This pass could also remap target-specific instructions when beneficial. |
| In the future, this could replace the ExeDepsFix pass, as we can directly |
| select the best variant for an instruction that's available on multiple banks. |
| |
| .. _api-registerbankinfo: |
| |
| API: RegisterBankInfo |
| ^^^^^^^^^^^^^^^^^^^^^ |
| |
| The ``RegisterBankInfo`` class describes multiple aspects of register banks. |
| |
| * **Banks**: ``addRegBankCoverage`` --- which register bank covers each |
| register class. |
| |
| * **Cross-Bank Copies**: ``copyCost`` --- the cost of a ``COPY`` from one bank |
| to another. |
| |
| * **Default Mapping**: ``getInstrMapping`` --- the default bank assignments for |
| a given instruction. |
| |
| * **Alternative Mapping**: ``getInstrAlternativeMapping`` --- the other |
| possible bank assignments for a given instruction. |
| |
| ``TODO``: |
| All this information should eventually be static and generated by TableGen, |
| mostly using existing information augmented by bank descriptions. |
| |
| ``TODO``: |
| ``getInstrMapping`` is currently separate from ``getInstrAlternativeMapping`` |
| because the latter is more expensive: as we move to static mapping info, |
| both methods should be free, and we should merge them. |
| |
| .. _regbankselect-modes: |
| |
| RegBankSelect Modes |
| ^^^^^^^^^^^^^^^^^^^ |
| |
| ``RegBankSelect`` currently has two modes: |
| |
| * **Fast** --- For each instruction, pick a target-provided "default" bank |
| assignment. This is the default at -O0. |
| |
| * **Greedy** --- For each instruction, pick the cheapest of several |
| target-provided bank assignment alternatives. |
| |
| We intend to eventually introduce an additional optimizing mode: |
| |
| * **Global** --- Across multiple instructions, pick the cheapest combination of |
| bank assignments. |
| |
| ``NOTE``: |
| On AArch64, we are considering using the Greedy mode even at -O0 (or perhaps at |
| backend -O1): because :ref:`gmir-llt` doesn't distinguish floating point from |
| integer scalars, the default assignment for loads and stores is the integer |
| bank, introducing cross-bank copies on most floating point operations. |
| |