blob: 94a7129c0a01d2301d53412fe469e868655003df [file] [view] [edit]
(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.