Significantly simplify this code and make it more aggressive. Instead of having
authorChris Lattner <sabre@nondot.org>
Sun, 30 Oct 2005 19:42:35 +0000 (19:42 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 30 Oct 2005 19:42:35 +0000 (19:42 +0000)
commitbf209489ad3f7a38ce6b2159b22d8727500e60c2
treebea0ea10cb942e50d803cf178dbb919fb49cd339
parent65026a72ef4dceb2ccb813ebcf3cc55cbc55e26b
Significantly simplify this code and make it more aggressive.  Instead of having
a special case hack for X86, make the hack more general: if an incoming argument
register is not used in any block other than the entry block, don't copy it to
a vreg.  This helps us compile code like this:

%struct.foo = type { int, int, [0 x ubyte] }
int %test(%struct.foo* %X) {
        %tmp1 = getelementptr %struct.foo* %X, int 0, uint 2, int 100
        %tmp = load ubyte* %tmp1                ; <ubyte> [#uses=1]
        %tmp2 = cast ubyte %tmp to int          ; <int> [#uses=1]
        ret int %tmp2
}

to:

_test:
        lbz r3, 108(r3)
        blr

instead of:

_test:
        lbz r2, 108(r3)
        or r3, r2, r2
        blr

The (dead) copy emitted to copy r3 into a vreg for extra-block uses was
increasing the live range of r3 past the load, preventing the coallescing.

This implements CodeGen/PowerPC/reg-coallesce-simple.ll

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