[llvm-commits] [llvm] r58092 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp test/CodeGen/X86/2008-10-24-FlippedCompare.ll

Evan Cheng evan.cheng at apple.com
Fri Oct 24 08:38:42 PDT 2008


Nice catch! Thanks.

Evan

On Oct 24, 2008, at 6:03 AM, Duncan Sands wrote:

> Author: baldrick
> Date: Fri Oct 24 08:03:10 2008
> New Revision: 58092
>
> URL: http://llvm.org/viewvc/llvm-project?rev=58092&view=rev
> Log:
> Fix translateX86CC: if SetCCOpcode is SETULE and
> LHS is a foldable load, then LHS and RHS are swapped
> and SetCCOpcode is changed to SETUGT.  But the later
> code is expecting operands to be the wrong way round
> for SETUGT, but they are not in this case, resulting
> in an inverted compare.  The solution is to move the
> load normalization before the correction for SETUGT.
> This bug was tickled by LegalizeTypes which happened
> to legalize the testcase slightly differently to
> LegalizeDAG.
>
> Added:
>    llvm/trunk/test/CodeGen/X86/2008-10-24-FlippedCompare.ll
> Modified:
>    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>
> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=58092&r1=58091&r2=58092&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Fri Oct 24  
> 08:03:10 2008
> @@ -1970,28 +1970,25 @@
>     case ISD::SETUGE: X86CC = X86::COND_AE; break;
>     }
>   } else {
> -    // First determine if it requires or is profitable to flip the  
> operands.
> -    bool Flip = false;
> +    // First determine if it is required or is profitable to flip  
> the operands.
> +
> +    // If LHS is a foldable load, but RHS is not, flip the condition.
> +    if ((ISD::isNON_EXTLoad(LHS.getNode()) && LHS.hasOneUse()) &&
> +        !(ISD::isNON_EXTLoad(RHS.getNode()) && RHS.hasOneUse())) {
> +      SetCCOpcode = getSetCCSwappedOperands(SetCCOpcode);
> +      std::swap(LHS, RHS);
> +    }
> +
>     switch (SetCCOpcode) {
>     default: break;
>     case ISD::SETOLT:
>     case ISD::SETOLE:
>     case ISD::SETUGT:
>     case ISD::SETUGE:
> -      Flip = true;
> +      std::swap(LHS, RHS);
>       break;
>     }
>
> -    // If LHS is a foldable load, but RHS is not, flip the condition.
> -    if (!Flip &&
> -        (ISD::isNON_EXTLoad(LHS.getNode()) && LHS.hasOneUse()) &&
> -        !(ISD::isNON_EXTLoad(RHS.getNode()) && RHS.hasOneUse())) {
> -      SetCCOpcode = getSetCCSwappedOperands(SetCCOpcode);
> -      Flip = true;
> -    }
> -    if (Flip)
> -      std::swap(LHS, RHS);
> -
>     // On a floating point condition, the flags are set as follows:
>     // ZF  PF  CF   op
>     //  0 | 0 | 0 | X > Y
>
> Added: llvm/trunk/test/CodeGen/X86/2008-10-24-FlippedCompare.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2008-10-24-FlippedCompare.ll?rev=58092&view=auto
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/test/CodeGen/X86/2008-10-24-FlippedCompare.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/2008-10-24-FlippedCompare.ll Fri Oct  
> 24 08:03:10 2008
> @@ -0,0 +1,17 @@
> +; RUN: llvm-as < %s | llc -enable-legalize-types -march=x86 -mattr= 
> +sse2 -o - | not grep {ucomiss\[^,\]*esp}
> +
> +define void @f(float %wt) {
> +entry:
> +	%0 = fcmp ogt float %wt, 0.000000e+00		; <i1> [#uses=1]
> +	%1 = tail call i32 @g(i32 44)		; <i32> [#uses=3]
> +	%2 = inttoptr i32 %1 to i8*		; <i8*> [#uses=2]
> +	br i1 %0, label %bb, label %bb1
> +
> +bb:		; preds = %entry
> +	ret void
> +
> +bb1:		; preds = %entry
> +	ret void
> +}
> +
> +declare i32 @g(i32)
>
>
> _______________________________________________
> 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