Fix PR9127 by reversing the operands even if they have more then one use.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 3 Feb 2011 03:58:05 +0000 (03:58 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 3 Feb 2011 03:58:05 +0000 (03:58 +0000)
Reversing the operands allows us to fold, but doesn't force us to. Also, at
this point the DAG is still being optimized, so the check for hasOneUse is not
very precise.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124773 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/pr9127.ll [new file with mode: 0644]

index ab75db28eae4925cbc13d4b9bbb91ee82284d960..c14e9db1bd321012b3651e2362ca8a71c4490fc9 100644 (file)
@@ -2712,8 +2712,8 @@ static unsigned TranslateX86CC(ISD::CondCode SetCCOpcode, bool isFP,
   // 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())) {
+  if (ISD::isNON_EXTLoad(LHS.getNode()) &&
+      !ISD::isNON_EXTLoad(RHS.getNode())) {
     SetCCOpcode = getSetCCSwappedOperands(SetCCOpcode);
     std::swap(LHS, RHS);
   }
diff --git a/test/CodeGen/X86/pr9127.ll b/test/CodeGen/X86/pr9127.ll
new file mode 100644 (file)
index 0000000..af08490
--- /dev/null
@@ -0,0 +1,12 @@
+; RUN: llc < %s | FileCheck %s
+
+define i8 @foobar(double %d, double* %x) {
+entry:
+  %tmp2 = load double* %x, align 8
+  %cmp = fcmp oeq double %tmp2, %d
+  %conv3 = zext i1 %cmp to i8
+  ret i8 %conv3
+}
+
+; test that the load is folded.
+; CHECK: ucomisd       (%rdi), %xmm0