[AArch64][GlobalISel] Teach tryOptSelect to handle G_ICMP
authorJessica Paquette <jpaquette@apple.com>
Tue, 2 Jul 2019 19:44:16 +0000 (19:44 +0000)
committerJessica Paquette <jpaquette@apple.com>
Tue, 2 Jul 2019 19:44:16 +0000 (19:44 +0000)
commit99316043bbce99081d977a276e8a4c879cfa9de2
tree040521fd186ef53ab613e166e364012a632bc76c
parenta70043632335f697b0cbbb12d5ef0c5fe0fb999a
[AArch64][GlobalISel] Teach tryOptSelect to handle G_ICMP

This teaches `tryOptSelect` to handle folding G_ICMP, and removes the
requirement that the G_SELECT we're dealing with is floating point.

Some refactoring to make this work nicely as well:

- Factor out the scalar case from the selection code for G_ICMP into
  `emitIntegerCompare`.
- Make `tryOptCMN` return a MachineInstr* instead of a bool.
- Make `tryOptCMN` not modify the instruction being selected.
- Factor out the CMN emission into `emitCMN` for readability.

By doing this this way, we can get all of the compare selection optimizations
in select emission.

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

llvm-svn: 364961
llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
llvm/test/CodeGen/AArch64/GlobalISel/fold-fp-select.mir
llvm/test/CodeGen/AArch64/GlobalISel/fold-select.mir [new file with mode: 0644]
llvm/test/CodeGen/AArch64/GlobalISel/opt-fold-cmn.mir