From 0500e362bf1be3aa626e9d4f5f8d8246770dbae0 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 21 Aug 2005 17:41:11 +0000 Subject: 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 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp') 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(N.getOperand(3)) || + isa(N.getOperand(3)) || + isa(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); -- cgit v1.2.3