[Peephole] Rewrite copies to avoid cross register banks copies.
authorQuentin Colombet <qcolombet@apple.com>
Fri, 13 Sep 2013 18:26:31 +0000 (18:26 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Fri, 13 Sep 2013 18:26:31 +0000 (18:26 +0000)
commit0df68423f9567b3d3eafb3b26668f783b07f687f
tree7dc78dfa4e7836681d82e8a5e2d4ca784acf73f0
parentcbe40cfe96a6bb3f2da56445269c2c71e55e0e56
[Peephole] Rewrite copies to avoid cross register banks copies.

By definition copies across register banks are not coalescable. Still, it may be
possible to get rid of such a copy when the value is available in another
register of the same register file.
Consider the following example, where capital and lower letters denote different
register file:
b = copy A <-- cross-bank copy
...
C = copy b <-- cross-bank copy

This could have been optimized this way:
b = copy A  <-- cross-bank copy
...
C = copy A <-- same-bank copy

Note: b and C's definitions may be in different basic blocks.

This patch adds a peephole optimization that looks through a chain of copies
leading to a cross-bank copy and reuses a source that is on the same register
file if available.

This solution could also be used to get rid of some copies (e.g., A could have
been used instead of C). However, we do not do so because:
- It may over constrain the coloring of the source register for coalescing.
- The register allocator may not be able to find a nice split point for the
  longer live-range, leading to more spill.

<rdar://problem/14742333>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190713 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/PeepholeOptimizer.cpp