Fix combine of uno && ord -> false so that the ordering of the fcmps doesn't
authorChad Rosier <mcrosier@apple.com>
Wed, 6 Jun 2012 17:22:40 +0000 (17:22 +0000)
committerChad Rosier <mcrosier@apple.com>
Wed, 6 Jun 2012 17:22:40 +0000 (17:22 +0000)
matter.
rdar://11579835

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

lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
test/Transforms/InstCombine/and-fcmp.ll

index 0f10d7376c3d62a26e58a768dae5b2353ca131f1..3bafc6661b02923103b9733b22d2991f97f288c8 100644 (file)
@@ -986,6 +986,9 @@ Value *InstCombiner::FoldAndOfFCmps(FCmpInst *LHS, FCmpInst *RHS) {
     bool Op1Ordered;
     unsigned Op0Pred = getFCmpCode(Op0CC, Op0Ordered);
     unsigned Op1Pred = getFCmpCode(Op1CC, Op1Ordered);
+    // uno && ord -> false
+    if (Op0Pred == 0 && Op1Pred == 0 && Op0Ordered != Op1Ordered)
+        return ConstantInt::get(CmpInst::makeCmpResultType(LHS->getType()), 0);
     if (Op1Pred == 0) {
       std::swap(LHS, RHS);
       std::swap(Op0Pred, Op1Pred);
@@ -998,7 +1001,6 @@ Value *InstCombiner::FoldAndOfFCmps(FCmpInst *LHS, FCmpInst *RHS) {
         return RHS;
       
       // uno && oeq -> uno && (ord && eq) -> false
-      // uno && ord -> false
       if (!Op0Ordered)
         return ConstantInt::get(CmpInst::makeCmpResultType(LHS->getType()), 0);
       // ord && ueq -> ord && (uno || eq) -> oeq
index f6a226e3b58ff88ca45d6ef0f34115530b3428fd..282e88b53d0811ae61241af278351bd4960d468c 100644 (file)
@@ -56,3 +56,13 @@ define zeroext i8 @t5(float %x, float %y) nounwind {
 ; CHECK: t5
 ; CHECK: ret i8 0
 }
+
+define zeroext i8 @t6(float %x, float %y) nounwind {
+       %a = fcmp uno float %x, %y
+       %b = fcmp ord float %x, %y
+       %c = and i1 %a, %b
+       %retval = zext i1 %c to i8
+       ret i8 %retval
+; CHECK: t6
+; CHECK: ret i8 0
+}