[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