[PeepholeOptimizer] Look through PHIs to find additional register sources
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Mon, 27 Jul 2015 14:39:46 +0000 (14:39 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Mon, 27 Jul 2015 14:39:46 +0000 (14:39 +0000)
commit4abd22ba6bbda9156bda19f6db7528bf6cfe1fe9
tree00cf0caeee474e559000adb2ce497032a843b41a
parent541d0799474b0e800fa0df10b70cba11264b99f5
[PeepholeOptimizer] Look through PHIs to find additional register sources

Reapply r242295 with fixes in the implementation.

- Teaches the ValueTracker in the PeepholeOptimizer to look through PHI
instructions.
- Add findNextSourceAndRewritePHI method to lookup into multiple sources
returnted by the ValueTracker and rewrite PHIs with new sources.

With these changes we can find more register sources and rewrite more
copies to allow coaslescing of bitcast instructions. Hence, we eliminate
unnecessary VR64 <-> GR64 copies in x86, but it could be extended to
other archs by marking "isBitcast" on target specific instructions. The
x86 example follows:

A:
  psllq %mm1, %mm0
  movd  %mm0, %r9
  jmp C

B:
  por %mm1, %mm0
  movd  %mm0, %r9
  jmp C

C:
  movd  %r9, %mm0
  pshufw  $238, %mm0, %mm0

Becomes:

A:
  psllq %mm1, %mm0
  jmp C

B:
  por %mm1, %mm0
  jmp C

C:
  pshufw  $238, %mm0, %mm0

Differential Revision: http://reviews.llvm.org/D11197
rdar://problem/20404526

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243271 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Target/TargetInstrInfo.h
lib/CodeGen/PeepholeOptimizer.cpp
lib/Target/X86/X86InstrMMX.td
test/CodeGen/X86/mmx-coalescing.ll [new file with mode: 0644]