Skip to content

Commit

Permalink
[InstSimplify] fold fcmp with infinity constant using isKnownNeverInf…
Browse files Browse the repository at this point in the history
…inity

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
  • Loading branch information
rotateright committed Jul 19, 2020
1 parent d12ec0f commit 7393d75
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 13 deletions.
7 changes: 7 additions & 0 deletions llvm/lib/Analysis/InstructionSimplify.cpp
Expand Up @@ -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!");
Expand Down
21 changes: 8 additions & 13 deletions llvm/test/Transforms/InstSimplify/floating-point-compare.ll
Expand Up @@ -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
Expand All @@ -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:%.*]], <float 4.200000e+01, float 4.200000e+01>
; CHECK-NEXT: [[R:%.*]] = fcmp oeq <2 x float> [[X42]], <float 0xFFF0000000000000, float 0xFFF0000000000000>
; CHECK-NEXT: ret <2 x i1> [[R]]
; CHECK-NEXT: ret <2 x i1> zeroinitializer
;
%x42 = fadd ninf <2 x float> %x, <float 42.0, float 42.0>
%r = fcmp oeq <2 x float> %x42, <float 0xFFF0000000000000, float 0xFFF0000000000000>
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
Expand All @@ -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
Expand All @@ -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> <float 0x7FF0000000000000, float 0x7FF0000000000000>, [[CAST]]
; CHECK-NEXT: ret <2 x i1> [[R]]
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
;
%cast = uitofp <2 x i8> %x to <2 x float>
%r = fcmp une <2 x float> <float 0x7FF0000000000000, float 0x7FF0000000000000>, %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]]
Expand Down

0 comments on commit 7393d75

Please sign in to comment.