Swap fp comparison operands and change predicate to allow load folding.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55521 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 8f7b668..26c9cd7 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -1909,7 +1909,6 @@
 }
 
 
-
 /// translateX86CC - do a one to one translation of a ISD::CondCode to the X86
 /// specific condition code. It returns a false if it cannot do a direct
 /// translation. X86CC is the translated CondCode.  LHS/RHS are modified as
@@ -1936,7 +1935,10 @@
         return true;
       }
     }
+  }
 
+  bool Flip = false;
+  if (!isFP) {
     switch (SetCCOpcode) {
     default: break;
     case ISD::SETEQ:  X86CC = X86::COND_E;  break;
@@ -1957,7 +1959,6 @@
     //  0 | 0 | 1 | X < Y
     //  1 | 0 | 0 | X == Y
     //  1 | 1 | 1 | unordered
-    bool Flip = false;
     switch (SetCCOpcode) {
     default: break;
     case ISD::SETUEQ:
@@ -1979,11 +1980,24 @@
     case ISD::SETUO: X86CC = X86::COND_P;  break;
     case ISD::SETO:  X86CC = X86::COND_NP; break;
     }
-    if (Flip)
-      std::swap(LHS, RHS);
   }
 
-  return X86CC != X86::COND_INVALID;
+  if (X86CC == X86::COND_INVALID)
+    return false;
+
+  if (Flip)
+    std::swap(LHS, RHS);
+
+  if (isFP) {
+    bool LHSCanFold = ISD::isNON_EXTLoad(LHS.getNode()) && LHS.hasOneUse();
+    bool RHSCanFold = ISD::isNON_EXTLoad(RHS.getNode()) && RHS.hasOneUse();
+    if (LHSCanFold && !RHSCanFold) {
+      X86CC = X86::GetSwappedBranchCondition(static_cast<X86::CondCode>(X86CC));
+      std::swap(LHS, RHS);
+    }
+  }
+
+  return true;
 }
 
 /// hasFPCMov - is there a floating point cmov for the specific X86 condition