| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 
 | .. _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.
 |