[GlobalISel][AArch64] Contract trivial same-size cross-bank copies into G_STOREs
authorJessica Paquette <jpaquette@apple.com>
Sat, 20 Jul 2019 01:55:35 +0000 (01:55 +0000)
committerJessica Paquette <jpaquette@apple.com>
Sat, 20 Jul 2019 01:55:35 +0000 (01:55 +0000)
commit41affad967d48b8223dd8cfee254ee787b87a7e6
tree7817950d7af9ac443fa7ef8b1811709c76f6ed25
parent5204f7611f4ad6549921f9fa757823e77f39ce32
[GlobalISel][AArch64] Contract trivial same-size cross-bank copies into G_STOREs

Sometimes, you can end up with cross-bank copies between same-sized GPRs and
FPRs, which feed into G_STOREs. When these copies feed only into stores, they
aren't necessary; we can just store using the original register bank.

This provides some minor code size savings for some floating point SPEC
benchmarks. (Around 0.2% for 453.povray and 450.soplex)

This issue doesn't seem to show up due to regbankselect or anything similar. So,
this patch introduces an early select function, `contractCrossBankCopyIntoStore`
which performs the contraction when possible. The selector then continues
normally and selects the correct store opcode, eliminating needless copies
along the way.

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

llvm-svn: 366625
llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
llvm/test/CodeGen/AArch64/GlobalISel/contract-store.mir [new file with mode: 0644]