Skip to content

Commit 733fa90

Browse files
committed
[InstSimplify] fold uno/ord comparison if fpclass is always NaN
1 parent a881a30 commit 733fa90

File tree

3 files changed

+14
-6
lines changed

3 files changed

+14
-6
lines changed

llvm/include/llvm/Analysis/ValueTracking.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ struct KnownFPClass {
276276
return (KnownFPClasses & Mask) == fcNone;
277277
}
278278

279+
bool isKnownAlways(FPClassTest Mask) const { return isKnownNever(~Mask); }
280+
279281
bool isUnknown() const {
280282
return KnownFPClasses == fcAllFlags && !SignBit;
281283
}
@@ -285,6 +287,9 @@ struct KnownFPClass {
285287
return isKnownNever(fcNan);
286288
}
287289

290+
/// Return true if it's known this must always be a nan.
291+
bool isKnownAlwaysNaN() const { return isKnownAlways(fcNan); }
292+
288293
/// Return true if it's known this can never be an infinity.
289294
bool isKnownNeverInfinity() const {
290295
return isKnownNever(fcInf);

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4117,9 +4117,14 @@ static Value *simplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
41174117
// This catches the 2 variable input case, constants are handled below as a
41184118
// class-like compare.
41194119
if (Pred == FCmpInst::FCMP_ORD || Pred == FCmpInst::FCMP_UNO) {
4120-
if (FMF.noNaNs() || (isKnownNeverNaN(RHS, /*Depth=*/0, Q) &&
4121-
isKnownNeverNaN(LHS, /*Depth=*/0, Q)))
4120+
KnownFPClass RHSClass = computeKnownFPClass(RHS, fcAllFlags, 0, Q);
4121+
KnownFPClass LHSClass = computeKnownFPClass(LHS, fcAllFlags, 0, Q);
4122+
if (FMF.noNaNs() ||
4123+
(RHSClass.isKnownNeverNaN() && LHSClass.isKnownNeverNaN()))
41224124
return ConstantInt::get(RetTy, Pred == FCmpInst::FCMP_ORD);
4125+
4126+
if (RHSClass.isKnownAlwaysNaN() || LHSClass.isKnownAlwaysNaN())
4127+
return ConstantInt::get(RetTy, Pred == CmpInst::FCMP_UNO);
41234128
}
41244129

41254130
const APFloat *C = nullptr;

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -678,8 +678,7 @@ define i1 @assume_nan_x2_uno(float %x, float %y) {
678678
; CHECK-NEXT: call void @llvm.assume(i1 [[UNO_X]])
679679
; CHECK-NEXT: [[UNO_Y:%.*]] = fcmp uno float [[Y:%.*]], 0.000000e+00
680680
; CHECK-NEXT: call void @llvm.assume(i1 [[UNO_Y]])
681-
; CHECK-NEXT: [[CMP:%.*]] = fcmp uno float [[X]], [[Y]]
682-
; CHECK-NEXT: ret i1 [[CMP]]
681+
; CHECK-NEXT: ret i1 true
683682
;
684683
%uno.x = fcmp uno float %x, 0.0
685684
call void @llvm.assume(i1 %uno.x)
@@ -695,8 +694,7 @@ define i1 @assume_nan_x2_ord(float %x, float %y) {
695694
; CHECK-NEXT: call void @llvm.assume(i1 [[UNO_X]])
696695
; CHECK-NEXT: [[UNO_Y:%.*]] = fcmp uno float [[Y:%.*]], 0.000000e+00
697696
; CHECK-NEXT: call void @llvm.assume(i1 [[UNO_Y]])
698-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ord float [[X]], [[Y]]
699-
; CHECK-NEXT: ret i1 [[CMP]]
697+
; CHECK-NEXT: ret i1 false
700698
;
701699
%uno.x = fcmp uno float %x, 0.0
702700
call void @llvm.assume(i1 %uno.x)

0 commit comments

Comments
 (0)