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

Duncan Sands baldrick at free.fr
Fri Oct 24 06:03:11 PDT 2008


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)





More information about the llvm-commits mailing list