InstCombine: fix a bug when combining (fcmp cc0 x, y) && (fcmp cc1 x, y).
authorManman Ren <mren@apple.com>
Thu, 14 Jun 2012 05:57:42 +0000 (05:57 +0000)
committerManman Ren <mren@apple.com>
Thu, 14 Jun 2012 05:57:42 +0000 (05:57 +0000)
uno && ueq was converted to ueq, it should be converted to uno.

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

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

index 3bafc6661b02923103b9733b22d2991f97f288c8..7d0af0d80226f06f3cc4fd1edabac3e44d79cd98 100644 (file)
@@ -995,9 +995,11 @@ Value *InstCombiner::FoldAndOfFCmps(FCmpInst *LHS, FCmpInst *RHS) {
       std::swap(Op0Ordered, Op1Ordered);
     }
     if (Op0Pred == 0) {
-      // uno && ueq -> uno && (uno || eq) -> ueq
+      // uno && ueq -> uno && (uno || eq) -> uno
       // ord && olt -> ord && (ord && lt) -> olt
-      if (Op0Ordered == Op1Ordered)
+      if (!Op0Ordered && (Op0Ordered == Op1Ordered))
+        return LHS;
+      if (Op0Ordered && (Op0Ordered == Op1Ordered))
         return RHS;
       
       // uno && oeq -> uno && (ord && eq) -> false
index 89e309d160693e200d84a1bfb6eabc82780ac6ea..e7026791c9533e975e5b79609b6248d0be53195d 100644 (file)
@@ -10,7 +10,25 @@ define i32 @test(i32 %a) {
         %b = icmp sgt i32 %a, -1
         %abs = select i1 %b, i32 %a, i32 %tmp1neg
         ret i32 %abs
-; CHECK:  movs r0, r0
+; CHECK:  cmp
 ; CHECK:  rsbmi r0, r0, #0
 ; CHECK:  bx lr
 }
+
+; rdar://11633193
+; 3 instructions will be generated for the following case:
+;   subs
+;   rsbmi
+;   bx
+define i32 @test2(i32 %a, i32 %b) nounwind readnone ssp {
+entry:
+; CHECK: test2
+; CHECK-NEXT: subs
+; CHECK-NEXT: rsbmi
+; CHECK-NEXT: bx
+  %sub = sub nsw i32 %a, %b
+  %cmp = icmp sgt i32 %sub, -1
+  %sub1 = sub nsw i32 0, %sub
+  %cond = select i1 %cmp, i32 %sub, i32 %sub1
+  ret i32 %cond
+}
index 282e88b53d0811ae61241af278351bd4960d468c..838c2f73fb910c3b91d540a10fae6f7ef53a4b63 100644 (file)
@@ -66,3 +66,14 @@ define zeroext i8 @t6(float %x, float %y) nounwind {
 ; CHECK: t6
 ; CHECK: ret i8 0
 }
+
+define zeroext i8 @t7(float %x, float %y) nounwind {
+       %a = fcmp uno float %x, %y
+       %b = fcmp ult float %x, %y
+       %c = and i1 %a, %b
+       %retval = zext i1 %c to i8
+       ret i8 %retval
+; CHECK: t7
+; CHECK: fcmp uno
+; CHECK-NOT: fcmp ult
+}