diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-08-21 17:41:11 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-08-21 17:41:11 +0000 | 
| commit | 0500e362bf1be3aa626e9d4f5f8d8246770dbae0 (patch) | |
| tree | f6f0dd180f015d6a539c46faa6e3bf207498e94b /llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp | |
| parent | 7b6b326b2c441bfa27fefe4d0122c39a83f8edf9 (diff) | |
| download | bcm5719-llvm-0500e362bf1be3aa626e9d4f5f8d8246770dbae0.tar.gz bcm5719-llvm-0500e362bf1be3aa626e9d4f5f8d8246770dbae0.zip | |
If the false value for a select_cc is really simple (has no inputs), evaluate
it in the block.  This codegens:
int %test(bool %c) {
        %retval = select bool %c, int 17, int 1
        ret int %retval
}
as:
_test:
        rlwinm r2, r3, 0, 31, 31
        li r2, 17
        cmpwi cr0, r3, 0
        bne .LBB_test_2 ;
.LBB_test_1:    ;
        li r2, 1
.LBB_test_2:    ;
        or r3, r2, r2
        blr
instead of:
_test:
        rlwinm r2, r3, 0, 31, 31
        li r2, 17
        li r4, 1
        cmpwi cr0, r3, 0
        bne .LBB_test_2 ;
.LBB_test_1:    ;
        or r2, r4, r4
.LBB_test_2:    ;
        or r3, r2, r2
        blr
... which is one fewer instruction.  The savings are more significant for
global address and constantfp nodes.
llvm-svn: 22946
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp | 17 | 
1 files changed, 16 insertions, 1 deletions
| diff --git a/llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp b/llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp index caf6b3981d0..4362a1d26cf 100644 --- a/llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp +++ b/llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp @@ -1675,7 +1675,16 @@ unsigned ISel::SelectExpr(SDOperand N, bool Recording) {      // selecting it in the fallthrough basic block rather than here, which      // increases register pressure.      unsigned TrueValue = SelectExpr(N.getOperand(2)); -    unsigned FalseValue = SelectExpr(N.getOperand(3)); +    unsigned FalseValue; + +    // If the false value is simple enough, evaluate it inline in the false +    // block. +    if (isa<ConstantSDNode>(N.getOperand(3)) || +        isa<ConstantFPSDNode>(N.getOperand(3)) || +        isa<GlobalAddressSDNode>(N.getOperand(3))) +      FalseValue = 0; +    else +      FalseValue = SelectExpr(N.getOperand(3));      unsigned CCReg = SelectCC(N.getOperand(0), N.getOperand(1), CC);      Opc = getBCCForSetCC(CC); @@ -1706,6 +1715,12 @@ unsigned ISel::SelectExpr(SDOperand N, bool Recording) {      //   %FalseValue = ...      //   # fallthrough to sinkMBB      BB = copy0MBB; + +    // If the false value is simple enough, evaluate it here, to avoid it being +    // evaluated on the true edge. +    if (FalseValue == 0) +      FalseValue = SelectExpr(N.getOperand(3)); +      // Update machine-CFG edges      BB->addSuccessor(sinkMBB); | 

