[llvm-commits] [llvm] r147512 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp test/CodeGen/X86/jump_sign.ll
Duncan Sands
baldrick at free.fr
Wed Jan 4 01:09:51 PST 2012
Hi Evan,
> For x86, canonicalize max
> (x> y) ? x : y
> =>
> (x>= y) ? x : y
maybe it is useful to handle
(x < y) ? y : x
too, or will that have been canonicalized to
(y > x) ? y : x
by the IR optimizers already?
Ciao, Duncan.
>
> So for something like
> (x - y)> 0 : (x - y) ? 0
> It will be
> (x - y)>= 0 : (x - y) ? 0
>
> This makes is possible to test sign-bit and eliminate a comparison against
> zero. e.g.
> subl %esi, %edi
> testl %edi, %edi
> movl $0, %eax
> cmovgl %edi, %eax
> =>
> xorl %eax, %eax
> subl %esi, $edi
> cmovsl %eax, %edi
>
> rdar://10633221
>
> Modified:
> llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
> llvm/trunk/test/CodeGen/X86/jump_sign.ll
>
> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=147512&r1=147511&r2=147512&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Jan 3 19:41:39 2012
> @@ -13139,6 +13139,37 @@
> }
> }
>
> + // Canonicalize max and min:
> + // (x> y) ? x : y -> (x>= y) ? x : y
> + // (x< y) ? x : y -> (x<= y) ? x : y
> + // This allows use of COND_S / COND_NS (see TranslateX86CC) which eliminates
> + // the need for an extra compare
> + // against zero. e.g.
> + // (x - y)> 0 : (x - y) ? 0 -> (x - y)>= 0 : (x - y) ? 0
> + // subl %esi, %edi
> + // testl %edi, %edi
> + // movl $0, %eax
> + // cmovgl %edi, %eax
> + // =>
> + // xorl %eax, %eax
> + // subl %esi, $edi
> + // cmovsl %eax, %edi
> + if (N->getOpcode() == ISD::SELECT&& Cond.getOpcode() == ISD::SETCC&&
> + DAG.isEqualTo(LHS, Cond.getOperand(0))&&
> + DAG.isEqualTo(RHS, Cond.getOperand(1))) {
> + ISD::CondCode CC = cast<CondCodeSDNode>(Cond.getOperand(2))->get();
> + switch (CC) {
> + default: break;
> + case ISD::SETLT:
> + case ISD::SETGT: {
> + ISD::CondCode NewCC = (CC == ISD::SETLT) ? ISD::SETLE : ISD::SETGE;
> + Cond = DAG.getSetCC(Cond.getDebugLoc(), Cond.getValueType(),
> + Cond.getOperand(0), Cond.getOperand(1), NewCC);
> + return DAG.getNode(ISD::SELECT, DL, VT, Cond, LHS, RHS);
> + }
> + }
> + }
> +
> return SDValue();
> }
>
>
> Modified: llvm/trunk/test/CodeGen/X86/jump_sign.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/jump_sign.ll?rev=147512&r1=147511&r2=147512&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/jump_sign.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/jump_sign.ll Tue Jan 3 19:41:39 2012
> @@ -1,7 +1,9 @@
> -; RUN: llc< %s -march=x86 | grep jns
> +; RUN: llc< %s -march=x86 | FileCheck %s
>
> define i32 @f(i32 %X) {
> entry:
> +; CHECK: f:
> +; CHECK: jns
> %tmp1 = add i32 %X, 1 ;<i32> [#uses=1]
> %tmp = icmp slt i32 %tmp1, 0 ;<i1> [#uses=1]
> br i1 %tmp, label %cond_true, label %cond_next
> @@ -18,3 +20,15 @@
> declare i32 @bar(...)
>
> declare i32 @baz(...)
> +
> +; rdar://10633221
> +define i32 @g(i32 %a, i32 %b) nounwind {
> +entry:
> +; CHECK: g:
> +; CHECK-NOT: test
> +; CHECK: cmovs
> + %sub = sub nsw i32 %a, %b
> + %cmp = icmp sgt i32 %sub, 0
> + %cond = select i1 %cmp, i32 %sub, i32 0
> + ret i32 %cond
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list