Skip to content
  • Chris Lattner's avatar
    Significantly simplify this code and make it more aggressive. Instead of having · 6871b23d
    Chris Lattner authored
    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
    
    llvm-svn: 24115
    6871b23d
Loading