From 7393d7574c0911b2fd88dd10d093af3efe4dd0cf Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Sun, 19 Jul 2020 09:24:03 -0400 Subject: [PATCH] [InstSimplify] fold fcmp with infinity constant using isKnownNeverInfinity This is a step towards trying to remove unnecessary FP compares with infinity when compiling with -ffinite-math-only or similar. I'm intentionally not checking FMF on the fcmp itself because I'm assuming that will go away eventually. The analysis part of this was added with rGcd481136 for use with isKnownNeverNaN. Similarly, that could be an enhancement here to get predicates like 'one' and 'ueq'. Differential Revision: https://reviews.llvm.org/D84035 --- llvm/lib/Analysis/InstructionSimplify.cpp | 7 +++++++ .../InstSimplify/floating-point-compare.ll | 21 ++++++++------------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index d3bdf9d..8fbcee8 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -3703,6 +3703,13 @@ static Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, break; } } + + // LHS == Inf + if (Pred == FCmpInst::FCMP_OEQ && isKnownNeverInfinity(LHS, Q.TLI)) + return getFalse(RetTy); + // LHS != Inf + if (Pred == FCmpInst::FCMP_UNE && isKnownNeverInfinity(LHS, Q.TLI)) + return getTrue(RetTy); } if (C->isNegative() && !C->isNegZero()) { assert(!C->isNaN() && "Unexpected NaN constant!"); diff --git a/llvm/test/Transforms/InstSimplify/floating-point-compare.ll b/llvm/test/Transforms/InstSimplify/floating-point-compare.ll index 4f73347..718a442 100644 --- a/llvm/test/Transforms/InstSimplify/floating-point-compare.ll +++ b/llvm/test/Transforms/InstSimplify/floating-point-compare.ll @@ -1041,9 +1041,7 @@ define <2 x i1> @unorderedCompareWithNaNVector_undef_elt(<2 x double> %A) { define i1 @is_infinite(float %x) { ; CHECK-LABEL: @is_infinite( -; CHECK-NEXT: [[XABS:%.*]] = call ninf float @llvm.fabs.f32(float [[X:%.*]]) -; CHECK-NEXT: [[R:%.*]] = fcmp oeq float [[XABS]], 0x7FF0000000000000 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 false ; %xabs = call ninf float @llvm.fabs.f32(float %x) %r = fcmp oeq float %xabs, 0x7FF0000000000000 @@ -1052,15 +1050,15 @@ define i1 @is_infinite(float %x) { define <2 x i1> @is_infinite_neg(<2 x float> %x) { ; CHECK-LABEL: @is_infinite_neg( -; CHECK-NEXT: [[X42:%.*]] = fadd ninf <2 x float> [[X:%.*]], -; CHECK-NEXT: [[R:%.*]] = fcmp oeq <2 x float> [[X42]], -; CHECK-NEXT: ret <2 x i1> [[R]] +; CHECK-NEXT: ret <2 x i1> zeroinitializer ; %x42 = fadd ninf <2 x float> %x, %r = fcmp oeq <2 x float> %x42, ret <2 x i1> %r } +; Negative test - but this could be reduced to 'uno' outside of instsimplify. + define i1 @is_infinite_or_nan(float %x) { ; CHECK-LABEL: @is_infinite_or_nan( ; CHECK-NEXT: [[X42:%.*]] = fadd ninf float [[X:%.*]], 4.200000e+01 @@ -1074,10 +1072,7 @@ define i1 @is_infinite_or_nan(float %x) { define i1 @is_finite_or_nan(i1 %c, double %x) { ; CHECK-LABEL: @is_finite_or_nan( -; CHECK-NEXT: [[XX:%.*]] = fmul ninf double [[X:%.*]], [[X]] -; CHECK-NEXT: [[S:%.*]] = select i1 [[C:%.*]], double 4.200000e+01, double [[XX]] -; CHECK-NEXT: [[R:%.*]] = fcmp une double [[S]], 0x7FF0000000000000 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 true ; %xx = fmul ninf double %x, %x %s = select i1 %c, double 42.0, double %xx @@ -1087,15 +1082,15 @@ define i1 @is_finite_or_nan(i1 %c, double %x) { define <2 x i1> @is_finite_or_nan_commute(<2 x i8> %x) { ; CHECK-LABEL: @is_finite_or_nan_commute( -; CHECK-NEXT: [[CAST:%.*]] = uitofp <2 x i8> [[X:%.*]] to <2 x float> -; CHECK-NEXT: [[R:%.*]] = fcmp une <2 x float> , [[CAST]] -; CHECK-NEXT: ret <2 x i1> [[R]] +; CHECK-NEXT: ret <2 x i1> ; %cast = uitofp <2 x i8> %x to <2 x float> %r = fcmp une <2 x float> , %cast ret <2 x i1> %r } +; Negative test - but this could be reduced to 'ord' outside of instsimplify. + define i1 @is_finite_and_ordered(double %x) { ; CHECK-LABEL: @is_finite_and_ordered( ; CHECK-NEXT: [[XX:%.*]] = fmul ninf double [[X:%.*]], [[X]] -- 2.7.4