There are times when the coalescer would not coalesce away a copy but the copy
authorEvan Cheng <evan.cheng@apple.com>
Sat, 3 Nov 2007 07:20:12 +0000 (07:20 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Sat, 3 Nov 2007 07:20:12 +0000 (07:20 +0000)
commitc92da3882ee4e18153bb36fcdf33af393aba8259
treecfa61b666bad819e19da4b419ff10dd14365c76b
parent111c4f897eb9a42eac6aceea830b8e76058afd73
There are times when the coalescer would not coalesce away a copy but the copy
can be eliminated by the allocator is the destination and source targets the
same register. The most common case is when the source and destination registers
are in different class. For example, on x86 mov32to32_ targets GR32_ which
contains a subset of the registers in GR32.

The allocator can do 2 things:
1. Set the preferred allocation for the destination of a copy to that of its source.
2. After allocation is done, change the allocation of a copy destination (if
   legal) so the copy can be eliminated.

This eliminates 443 extra moves from 403.gcc.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43662 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/CodeGen/LiveIntervalAnalysis.h
lib/CodeGen/LiveIntervalAnalysis.cpp
lib/CodeGen/RegAllocLinearScan.cpp
test/CodeGen/X86/postalloc-coalescing.ll [new file with mode: 0644]