Skip to content

Commit 0637b00

Browse files
committed
InstSimplify: Use correct interested FP classes when simplifying fcmp
We are interested in the cases that we don't want, so this was backwards. Fixes regression reported after ddb3f12
1 parent 239fb20 commit 0637b00

File tree

2 files changed

+10
-15
lines changed

2 files changed

+10
-15
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4129,7 +4129,7 @@ static Value *simplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
41294129
// compare isn't a complete class test. e.g. > 1.0 implies fcPositive, but
41304130
// isn't implementable as a class call.
41314131
if (C->isNegative() && !C->isNegZero()) {
4132-
FPClassTest Interested = fcPositive | fcNan;
4132+
FPClassTest Interested = KnownFPClass::OrderedLessThanZeroMask;
41334133

41344134
// FIXME: This assert won't always hold if we depend on the context
41354135
// instruction above
@@ -4210,11 +4210,13 @@ static Value *simplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
42104210
// TODO: Could fold this with above if there were a matcher which returned all
42114211
// classes in a non-splat vector.
42124212
if (match(RHS, m_AnyZeroFP())) {
4213-
FPClassTest Interested = FMF.noNaNs() ? fcPositive : fcPositive | fcNan;
4214-
42154213
switch (Pred) {
42164214
case FCmpInst::FCMP_OGE:
42174215
case FCmpInst::FCMP_ULT: {
4216+
FPClassTest Interested = KnownFPClass::OrderedLessThanZeroMask;
4217+
if (!FMF.noNaNs())
4218+
Interested |= fcNan;
4219+
42184220
KnownFPClass Known = computeLHSClass(Interested);
42194221

42204222
// Positive or zero X >= 0.0 --> true
@@ -4226,6 +4228,7 @@ static Value *simplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
42264228
}
42274229
case FCmpInst::FCMP_UGE:
42284230
case FCmpInst::FCMP_OLT: {
4231+
FPClassTest Interested = KnownFPClass::OrderedLessThanZeroMask;
42294232
KnownFPClass Known = computeLHSClass(Interested);
42304233

42314234
// Positive or zero or nan X >= 0.0 --> true

llvm/test/Transforms/InstSimplify/floating-point-compare.ll

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,9 +1587,7 @@ define float @fast_square_must_be_positive_daz(float %arg, float %arg1) #0 {
15871587
; CHECK-NEXT: [[I:%.*]] = fmul float [[ARG:%.*]], [[ARG]]
15881588
; CHECK-NEXT: [[I2:%.*]] = fmul float [[ARG1:%.*]], [[ARG1]]
15891589
; CHECK-NEXT: [[I3:%.*]] = fadd float [[I2]], [[I]]
1590-
; CHECK-NEXT: [[I4:%.*]] = fcmp olt float [[I3]], 0.000000e+00
1591-
; CHECK-NEXT: [[I5:%.*]] = select i1 [[I4]], float 0.000000e+00, float [[I3]]
1592-
; CHECK-NEXT: ret float [[I5]]
1590+
; CHECK-NEXT: ret float [[I3]]
15931591
;
15941592
bb:
15951593
%i = fmul float %arg, %arg
@@ -1607,9 +1605,7 @@ define float @fast_square_must_be_positive_daz_nnan(float %arg, float %arg1) #0
16071605
; CHECK-NEXT: [[I:%.*]] = fmul float [[ARG:%.*]], [[ARG]]
16081606
; CHECK-NEXT: [[I2:%.*]] = fmul float [[ARG1:%.*]], [[ARG1]]
16091607
; CHECK-NEXT: [[I3:%.*]] = fadd float [[I2]], [[I]]
1610-
; CHECK-NEXT: [[I4:%.*]] = fcmp nnan olt float [[I3]], 0.000000e+00
1611-
; CHECK-NEXT: [[I5:%.*]] = select i1 [[I4]], float 0.000000e+00, float [[I3]]
1612-
; CHECK-NEXT: ret float [[I5]]
1608+
; CHECK-NEXT: ret float [[I3]]
16131609
;
16141610
bb:
16151611
%i = fmul float %arg, %arg
@@ -1627,9 +1623,7 @@ define float @must_be_olt_negative_constant_daz(float %arg, float %arg1) #0 {
16271623
; CHECK-NEXT: [[I:%.*]] = fmul float [[ARG:%.*]], [[ARG]]
16281624
; CHECK-NEXT: [[I2:%.*]] = fmul float [[ARG1:%.*]], [[ARG1]]
16291625
; CHECK-NEXT: [[I3:%.*]] = fadd float [[I2]], [[I]]
1630-
; CHECK-NEXT: [[I4:%.*]] = fcmp olt float [[I3]], -1.000000e+00
1631-
; CHECK-NEXT: [[I5:%.*]] = select i1 [[I4]], float 0.000000e+00, float [[I3]]
1632-
; CHECK-NEXT: ret float [[I5]]
1626+
; CHECK-NEXT: ret float [[I3]]
16331627
;
16341628
bb:
16351629
%i = fmul float %arg, %arg
@@ -1647,9 +1641,7 @@ define float @must_be_olt_negative_constant_daz_nnan(float %arg, float %arg1) #0
16471641
; CHECK-NEXT: [[I:%.*]] = fmul float [[ARG:%.*]], [[ARG]]
16481642
; CHECK-NEXT: [[I2:%.*]] = fmul float [[ARG1:%.*]], [[ARG1]]
16491643
; CHECK-NEXT: [[I3:%.*]] = fadd float [[I2]], [[I]]
1650-
; CHECK-NEXT: [[I4:%.*]] = fcmp nnan olt float [[I3]], -1.000000e+00
1651-
; CHECK-NEXT: [[I5:%.*]] = select i1 [[I4]], float 0.000000e+00, float [[I3]]
1652-
; CHECK-NEXT: ret float [[I5]]
1644+
; CHECK-NEXT: ret float [[I3]]
16531645
;
16541646
bb:
16551647
%i = fmul float %arg, %arg

0 commit comments

Comments
 (0)