Skip to content

Commit 55f1229

Browse files
authored
ValueTracking: Recognize fcmp ole/ugt with inf as a class test (#79095)
These were missed and hopefully avoids assertions when dc3faf0 is recommitted.
1 parent d2398cc commit 55f1229

File tree

4 files changed

+35
-24
lines changed

4 files changed

+35
-24
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4065,7 +4065,7 @@ llvm::fcmpToClassTest(FCmpInst::Predicate Pred, const Function &F, Value *LHS,
40654065
case FCmpInst::FCMP_ULE: // isnan(x) || x <= 0
40664066
return {LHS, fcNegative | fcPosZero | fcNan};
40674067
default:
4068-
break;
4068+
llvm_unreachable("all compare types are handled");
40694069
}
40704070

40714071
return {nullptr, fcAllFlags};
@@ -4184,8 +4184,22 @@ llvm::fcmpToClassTest(FCmpInst::Predicate Pred, const Function &F, Value *LHS,
41844184
Mask = fcNone;
41854185
break;
41864186
}
4187+
case FCmpInst::FCMP_OLE:
4188+
case FCmpInst::FCMP_UGT: {
4189+
if (ConstRHS->isNegative()) {
4190+
Mask = IsFabs ? fcNone : fcNegInf;
4191+
break;
4192+
}
4193+
4194+
// fcmp ole x, +inf -> fcmp ord x, x
4195+
// fcmp ole fabs(x), +inf -> fcmp ord x, x
4196+
// fcmp ole x, -inf -> fcmp oeq x, -inf
4197+
// fcmp ole fabs(x), -inf -> false
4198+
Mask = ~fcNan;
4199+
break;
4200+
}
41874201
default:
4188-
return {nullptr, fcAllFlags};
4202+
llvm_unreachable("all compare types are handled");
41894203
}
41904204
} else if (ConstRHS->isSmallestNormalized() && !ConstRHS->isNegative()) {
41914205
// Match pattern that's used in __builtin_isnormal.

llvm/test/Transforms/Attributor/nofpclass-implied-by-fcmp.ll

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2400,8 +2400,8 @@ define float @assume_oeq_smallest_normal_known_pos(float nofpclass(ninf nsub nno
24002400
;---------------------------------------------------------------------
24012401

24022402
define float @assume_ole_pinf(float %arg) {
2403-
; CHECK-LABEL: define float @assume_ole_pinf(
2404-
; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2403+
; CHECK-LABEL: define nofpclass(nan) float @assume_ole_pinf(
2404+
; CHECK-SAME: float returned nofpclass(nan) [[ARG:%.*]]) #[[ATTR3]] {
24052405
; CHECK-NEXT: [[FCMP:%.*]] = fcmp ole float [[ARG]], 0x7FF0000000000000
24062406
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[FCMP]]) #[[ATTR5]]
24072407
; CHECK-NEXT: ret float [[ARG]]
@@ -2412,8 +2412,8 @@ define float @assume_ole_pinf(float %arg) {
24122412
}
24132413

24142414
define float @assume_ole_ninf(float %arg) {
2415-
; CHECK-LABEL: define float @assume_ole_ninf(
2416-
; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2415+
; CHECK-LABEL: define nofpclass(nan pinf zero sub norm) float @assume_ole_ninf(
2416+
; CHECK-SAME: float returned nofpclass(nan pinf zero sub norm) [[ARG:%.*]]) #[[ATTR3]] {
24172417
; CHECK-NEXT: [[FCMP:%.*]] = fcmp ole float [[ARG]], 0xFFF0000000000000
24182418
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[FCMP]]) #[[ATTR5]]
24192419
; CHECK-NEXT: ret float [[ARG]]
@@ -2424,8 +2424,8 @@ define float @assume_ole_ninf(float %arg) {
24242424
}
24252425

24262426
define float @assume_ugt_pinf(float %arg) {
2427-
; CHECK-LABEL: define float @assume_ugt_pinf(
2428-
; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2427+
; CHECK-LABEL: define nofpclass(inf zero sub norm) float @assume_ugt_pinf(
2428+
; CHECK-SAME: float returned nofpclass(inf zero sub norm) [[ARG:%.*]]) #[[ATTR3]] {
24292429
; CHECK-NEXT: [[FCMP:%.*]] = fcmp ugt float [[ARG]], 0x7FF0000000000000
24302430
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[FCMP]]) #[[ATTR5]]
24312431
; CHECK-NEXT: ret float [[ARG]]
@@ -2436,8 +2436,8 @@ define float @assume_ugt_pinf(float %arg) {
24362436
}
24372437

24382438
define float @assume_ugt_ninf(float %arg) {
2439-
; CHECK-LABEL: define float @assume_ugt_ninf(
2440-
; CHECK-SAME: float returned [[ARG:%.*]]) #[[ATTR3]] {
2439+
; CHECK-LABEL: define nofpclass(ninf) float @assume_ugt_ninf(
2440+
; CHECK-SAME: float returned nofpclass(ninf) [[ARG:%.*]]) #[[ATTR3]] {
24412441
; CHECK-NEXT: [[FCMP:%.*]] = fcmp ugt float [[ARG]], 0xFFF0000000000000
24422442
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[FCMP]]) #[[ATTR5]]
24432443
; CHECK-NEXT: ret float [[ARG]]
@@ -2448,8 +2448,8 @@ define float @assume_ugt_ninf(float %arg) {
24482448
}
24492449

24502450
define float @assume_fabs_ole_pinf(float %arg) {
2451-
; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @assume_fabs_ole_pinf(
2452-
; CHECK-SAME: float returned nofpclass(ninf nzero nsub nnorm) [[ARG:%.*]]) #[[ATTR3]] {
2451+
; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @assume_fabs_ole_pinf(
2452+
; CHECK-SAME: float returned nofpclass(nan ninf nzero nsub nnorm) [[ARG:%.*]]) #[[ATTR3]] {
24532453
; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
24542454
; CHECK-NEXT: [[FCMP:%.*]] = fcmp ole float [[FABS]], 0x7FF0000000000000
24552455
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[FCMP]]) #[[ATTR5]]
@@ -2462,8 +2462,8 @@ define float @assume_fabs_ole_pinf(float %arg) {
24622462
}
24632463

24642464
define float @assume_fabs_ole_ninf(float %arg) {
2465-
; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @assume_fabs_ole_ninf(
2466-
; CHECK-SAME: float returned nofpclass(ninf nzero nsub nnorm) [[ARG:%.*]]) #[[ATTR3]] {
2465+
; CHECK-LABEL: define nofpclass(all) float @assume_fabs_ole_ninf(
2466+
; CHECK-SAME: float returned nofpclass(all) [[ARG:%.*]]) #[[ATTR3]] {
24672467
; CHECK-NEXT: call void @llvm.assume(i1 noundef false) #[[ATTR5]]
24682468
; CHECK-NEXT: ret float [[ARG]]
24692469
;
@@ -2474,8 +2474,8 @@ define float @assume_fabs_ole_ninf(float %arg) {
24742474
}
24752475

24762476
define float @assume_fabs_ugt_pinf(float %arg) {
2477-
; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @assume_fabs_ugt_pinf(
2478-
; CHECK-SAME: float returned nofpclass(ninf nzero nsub nnorm) [[ARG:%.*]]) #[[ATTR3]] {
2477+
; CHECK-LABEL: define nofpclass(inf zero sub norm) float @assume_fabs_ugt_pinf(
2478+
; CHECK-SAME: float returned nofpclass(inf zero sub norm) [[ARG:%.*]]) #[[ATTR3]] {
24792479
; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[ARG]]) #[[ATTR4]]
24802480
; CHECK-NEXT: [[FCMP:%.*]] = fcmp ugt float [[FABS]], 0x7FF0000000000000
24812481
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[FCMP]]) #[[ATTR5]]

llvm/test/Transforms/InstCombine/and-fcmp.ll

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4820,10 +4820,7 @@ define i1 @clang_builtin_isnormal_inf_check_olt(half %x) {
48204820

48214821
define i1 @clang_builtin_isnormal_inf_check_ole(half %x) {
48224822
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_ole(
4823-
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4824-
; CHECK-NEXT: [[ORD:%.*]] = fcmp ord half [[X]], 0xH0000
4825-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ole half [[FABS_X]], 0xH7C00
4826-
; CHECK-NEXT: [[AND:%.*]] = and i1 [[ORD]], [[CMP]]
4823+
; CHECK-NEXT: [[AND:%.*]] = fcmp ord half [[X:%.*]], 0xH0000
48274824
; CHECK-NEXT: ret i1 [[AND]]
48284825
;
48294826
%fabs.x = call half @llvm.fabs.f16(half %x)

llvm/unittests/Analysis/ValueTrackingTest.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1945,14 +1945,14 @@ TEST_F(ComputeKnownFPClassTest, FCmpToClassTest_PInf) {
19451945
auto [OleVal, OleClass] =
19461946
fcmpToClassTest(CmpInst::FCMP_OLE, *A3->getFunction(), A3->getOperand(0),
19471947
A3->getOperand(1));
1948-
EXPECT_EQ(nullptr, OleVal);
1949-
EXPECT_EQ(fcAllFlags, OleClass);
1948+
EXPECT_EQ(A->getOperand(0), OleVal);
1949+
EXPECT_EQ(~fcNan, OleClass);
19501950

19511951
auto [UgtVal, UgtClass] =
19521952
fcmpToClassTest(CmpInst::FCMP_UGT, *A4->getFunction(), A4->getOperand(0),
19531953
A4->getOperand(1));
1954-
EXPECT_EQ(nullptr, UgtVal);
1955-
EXPECT_EQ(fcAllFlags, UgtClass);
1954+
EXPECT_EQ(A4->getOperand(0), UgtVal);
1955+
EXPECT_EQ(fcNan, UgtClass);
19561956
}
19571957

19581958
TEST_F(ComputeKnownFPClassTest, SqrtNszSignBit) {

0 commit comments

Comments
 (0)