From bb521e63afe78633bf155f472f3fc439318115c3 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Wed, 7 Nov 2018 15:44:26 +0000 Subject: [PATCH] [InstCombine] peek through fabs() when checking isnan() That should be the end of the missing cases for this fold. See earlier patches in this series: rL346321 rL346324 llvm-svn: 346327 --- llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 7 ++++++- llvm/test/Transforms/InstCombine/fcmp.ll | 6 ++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index be26d5e81241..7a56313000d8 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -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: diff --git a/llvm/test/Transforms/InstCombine/fcmp.ll b/llvm/test/Transforms/InstCombine/fcmp.ll index b8cf6e42b2fd..15d9368f49ed 100644 --- a/llvm/test/Transforms/InstCombine/fcmp.ll +++ b/llvm/test/Transforms/InstCombine/fcmp.ll @@ -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) -- 2.34.1