[GlobalISel][AArch64] Improve register bank mappings for G_SELECT
authorJessica Paquette <jpaquette@apple.com>
Fri, 24 May 2019 19:35:25 +0000 (19:35 +0000)
committerJessica Paquette <jpaquette@apple.com>
Fri, 24 May 2019 19:35:25 +0000 (19:35 +0000)
commit56503865ed4d034d46efd84b274c42428fb61d9f
tree24d8cf694c4461a987e8a135ecb700d0dde02f25
parent0cdc5dddca009422ee6a1d72b487fb5c54a654db
[GlobalISel][AArch64] Improve register bank mappings for G_SELECT

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 a 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.

Also update the regbank-select.mir to check that we end up with the right
select instruction.

Differential Revision: https://reviews.llvm.org/D62267

llvm-svn: 361665
llvm/lib/Target/AArch64/AArch64RegisterBankInfo.cpp
llvm/test/CodeGen/AArch64/GlobalISel/regbank-select.mir