OSDN Git Service

[InstCombine] peek through fabs() when checking isnan()
authorSanjay Patel <spatel@rotateright.com>
Wed, 7 Nov 2018 15:44:26 +0000 (15:44 +0000)
committerSanjay Patel <spatel@rotateright.com>
Wed, 7 Nov 2018 15:44:26 +0000 (15:44 +0000)
That should be the end of the missing cases for this fold.
See earlier patches in this series:
rL346321
rL346324

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

lib/Transforms/InstCombine/InstCombineCompares.cpp
test/Transforms/InstCombine/fcmp.ll

index be26d5e..7a56313 100644 (file)
@@ -5328,8 +5328,13 @@ static Instruction *foldFabsWithFcmpZero(FCmpInst &I) {
   case FCmpInst::FCMP_UEQ:
   case FCmpInst::FCMP_ONE:
   case FCmpInst::FCMP_UNE:
-    // fabs(X) == 0.0 --> X == 0.0
+  case FCmpInst::FCMP_ORD:
+  case FCmpInst::FCMP_UNO:
+    // Look through the fabs() because it doesn't change anything but the sign.
+    // fabs(X) == 0.0 --> X == 0.0,
     // fabs(X) != 0.0 --> X != 0.0
+    // isnan(fabs(X)) --> isnan(X)
+    // !isnan(fabs(X) --> !isnan(X)
     return new FCmpInst(I.getPredicate(), X, I.getOperand(1));
 
   default:
index b8cf6e4..15d9368 100644 (file)
@@ -298,8 +298,7 @@ define <2 x i1> @fabs_ueq(<2 x float> %a) {
 
 define <2 x i1> @fabs_ord(<2 x float> %a) {
 ; CHECK-LABEL: @fabs_ord(
-; CHECK-NEXT:    [[CALL:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[A:%.*]])
-; CHECK-NEXT:    [[CMP:%.*]] = fcmp arcp ord <2 x float> [[CALL]], zeroinitializer
+; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord <2 x float> [[A:%.*]], zeroinitializer
 ; CHECK-NEXT:    ret <2 x i1> [[CMP]]
 ;
   %call = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)
@@ -309,8 +308,7 @@ define <2 x i1> @fabs_ord(<2 x float> %a) {
 
 define <2 x i1> @fabs_uno(<2 x float> %a) {
 ; CHECK-LABEL: @fabs_uno(
-; CHECK-NEXT:    [[CALL:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[A:%.*]])
-; CHECK-NEXT:    [[CMP:%.*]] = fcmp arcp uno <2 x float> [[CALL]], zeroinitializer
+; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno <2 x float> [[A:%.*]], zeroinitializer
 ; CHECK-NEXT:    ret <2 x i1> [[CMP]]
 ;
   %call = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)