[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