diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index c0831a734a9..3dbedba7b96 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -1970,28 +1970,25 @@ static bool translateX86CC(ISD::CondCode SetCCOpcode, bool isFP, 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 diff --git a/test/CodeGen/X86/2008-10-24-FlippedCompare.ll b/test/CodeGen/X86/2008-10-24-FlippedCompare.ll new file mode 100644 index 00000000000..8a7987db599 --- /dev/null +++ b/test/CodeGen/X86/2008-10-24-FlippedCompare.ll @@ -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 ; [#uses=1] + %1 = tail call i32 @g(i32 44) ; [#uses=3] + %2 = inttoptr i32 %1 to i8* ; [#uses=2] + br i1 %0, label %bb, label %bb1 + +bb: ; preds = %entry + ret void + +bb1: ; preds = %entry + ret void +} + +declare i32 @g(i32)