Changes in directory llvm/lib/CodeGen/SelectionDAG:
DAGCombiner.cpp updated: 1.286 -> 1.287 --- Log message: Teach the codegen to turn [aez]ext (setcc) -> selectcc of 1/0, which often allows other simplifications. For example, this compiles: int isnegative(unsigned int X) { return !(X < 2147483648U); } Into this code: x86: movl 4(%esp), %eax shrl $31, %eax ret arm: mov r0, r0, lsr #31 bx lr thumb: lsr r0, r0, #31 bx lr instead of: x86: cmpl $0, 4(%esp) sets %al movzbl %al, %eax ret arm: mov r3, #0 cmp r0, #0 movlt r3, #1 mov r0, r3 bx lr thumb: mov r2, #1 mov r1, #0 cmp r0, #0 blt LBB1_2 @entry LBB1_1: @entry cpy r2, r1 LBB1_2: @entry cpy r0, r2 bx lr Testcase here: test/CodeGen/Generic/ispositive.ll --- Diffs of the changes: (+29 -0) DAGCombiner.cpp | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.286 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.287 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.286 Wed Apr 11 00:11:38 2007 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Apr 11 00:32:27 2007 @@ -2130,6 +2130,15 @@ } } + // sext(setcc x,y,cc) -> select_cc x, y, -1, 0, cc + if (N0.getOpcode() == ISD::SETCC) { + SDOperand SCC = + SimplifySelectCC(N0.getOperand(0), N0.getOperand(1), + DAG.getConstant(~0ULL, VT), DAG.getConstant(0, VT), + cast<CondCodeSDNode>(N0.getOperand(2))->get()); + if (SCC.Val) return SCC; + } + return SDOperand(); } @@ -2210,6 +2219,16 @@ ExtLoad.getValue(1)); return SDOperand(N, 0); // Return N so it doesn't get rechecked! } + + // zext(setcc x,y,cc) -> select_cc x, y, 1, 0, cc + if (N0.getOpcode() == ISD::SETCC) { + SDOperand SCC = + SimplifySelectCC(N0.getOperand(0), N0.getOperand(1), + DAG.getConstant(1, VT), DAG.getConstant(0, VT), + cast<CondCodeSDNode>(N0.getOperand(2))->get()); + if (SCC.Val) return SCC; + } + return SDOperand(); } @@ -2294,6 +2313,16 @@ ExtLoad.getValue(1)); return SDOperand(N, 0); // Return N so it doesn't get rechecked! } + + // aext(setcc x,y,cc) -> select_cc x, y, 1, 0, cc + if (N0.getOpcode() == ISD::SETCC) { + SDOperand SCC = + SimplifySelectCC(N0.getOperand(0), N0.getOperand(1), + DAG.getConstant(1, VT), DAG.getConstant(0, VT), + cast<CondCodeSDNode>(N0.getOperand(2))->get()); + if (SCC.Val) return SCC; + } + return SDOperand(); } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits