From 61f353dbdc2dcd7e804e0194e65a461561ab4c95 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 12 Apr 2005 02:19:10 +0000 Subject: [PATCH] Emit comparisons against the sign bit better. Codegen this: bool %test1(long %X) { %A = setlt long %X, 0 ret bool %A } like this: test1: cmpl $0, 8(%esp) setl %al movzbl %al, %eax ret instead of: test1: movl 8(%esp), %ecx cmpl $0, %ecx setl %al movzbw %al, %ax cmpl $0, 4(%esp) setb %dl movzbw %dl, %dx cmpl $0, %ecx cmove %dx, %ax movzbl %al, %eax ret llvm-svn: 21243 --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 3bd2494ceaa..7965e141a54 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -768,6 +768,16 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { DAG.getConstant(0, Tmp1.getValueType())); break; default: + // If this is a comparison of the sign bit, just look at the top part. + // X > -1, x < 0 + if (ConstantSDNode *CST = dyn_cast(Node->getOperand(1))) + if ((cast(Node)->getCondition() == ISD::SETLT && + CST->getValue() == 0) || // X < 0 + (cast(Node)->getCondition() == ISD::SETGT && + (CST->isAllOnesValue()))) // X > -1 + return DAG.getSetCC(cast(Node)->getCondition(), + Node->getValueType(0), LHSHi, RHSHi); + // FIXME: This generated code sucks. ISD::CondCode LowCC; switch (cast(Node)->getCondition()) {