The fcsel and csel instructions differ in only the register banks they work on. So, they're entirely interchangeable otherwise.
With this in mind, this does two things:
- Teach AArch64RegisterBankInfo to consider the inputs to G_SELECT as well as the outputs.
- Teach it to choose the best register bank mapping based off the constraints of the inputs and outputs.
The "best" in this case means the one that requires the smallest number of copies to properly emit a fcsel/csel.
For example, if the inputs are all already going to be on FPRs, we should emit an fcsel, even if the output is a GPR. This costs one copy to produce the result, but saves us from copying the inputs into GPRs.
This saves some copies in optimized builds.