Skip to content
  • Chris Lattner's avatar
    Make IVUseShouldUsePostIncValue more aggressive when the use is a PHI. In · f07a587c
    Chris Lattner authored
    particular, it should realize that phi's use their values in the pred block
    not the phi block itself.  This change turns our em3d loop from this:
    
    _test:
            cmpwi cr0, r4, 0
            bgt cr0, LBB_test_2     ; entry.no_exit_crit_edge
    LBB_test_1:     ; entry.loopexit_crit_edge
            li r2, 0
            b LBB_test_6    ; loopexit
    LBB_test_2:     ; entry.no_exit_crit_edge
            li r6, 0
    LBB_test_3:     ; no_exit
            or r2, r6, r6
            lwz r6, 0(r3)
            cmpw cr0, r6, r5
            beq cr0, LBB_test_6     ; loopexit
    LBB_test_4:     ; endif
            addi r3, r3, 4
            addi r6, r2, 1
            cmpw cr0, r6, r4
            blt cr0, LBB_test_3     ; no_exit
    LBB_test_5:     ; endif.loopexit.loopexit_crit_edge
            addi r3, r2, 1
            blr
    LBB_test_6:     ; loopexit
            or r3, r2, r2
            blr
    
    into:
    
    _test:
            cmpwi cr0, r4, 0
            bgt cr0, LBB_test_2     ; entry.no_exit_crit_edge
    LBB_test_1:     ; entry.loopexit_crit_edge
            li r2, 0
            b LBB_test_5    ; loopexit
    LBB_test_2:     ; entry.no_exit_crit_edge
            li r6, 0
    LBB_test_3:     ; no_exit
            lwz r2, 0(r3)
            cmpw cr0, r2, r5
            or r2, r6, r6
            beq cr0, LBB_test_5     ; loopexit
    LBB_test_4:     ; endif
            addi r3, r3, 4
            addi r6, r6, 1
            cmpw cr0, r6, r4
            or r2, r6, r6
            blt cr0, LBB_test_3     ; no_exit
    LBB_test_5:     ; loopexit
            or r3, r2, r2
            blr
    
    
    Unfortunately, this is actually worse code, because the register coallescer
    is getting confused somehow.  If it were doing its job right, it could turn the
    code into this:
    
    _test:
            cmpwi cr0, r4, 0
            bgt cr0, LBB_test_2     ; entry.no_exit_crit_edge
    LBB_test_1:     ; entry.loopexit_crit_edge
            li r6, 0
            b LBB_test_5    ; loopexit
    LBB_test_2:     ; entry.no_exit_crit_edge
            li r6, 0
    LBB_test_3:     ; no_exit
            lwz r2, 0(r3)
            cmpw cr0, r2, r5
            beq cr0, LBB_test_5     ; loopexit
    LBB_test_4:     ; endif
            addi r3, r3, 4
            addi r6, r6, 1
            cmpw cr0, r6, r4
            blt cr0, LBB_test_3     ; no_exit
    LBB_test_5:     ; loopexit
            or r3, r6, r6
            blr
    
    ... which I'll work on next. :)
    
    llvm-svn: 23604
    f07a587c
Loading