Skip to content

Commit 18ab29f

Browse files
committed
[InstCombine] Canonicalize fcmp with inf
1 parent ae8f280 commit 18ab29f

File tree

5 files changed

+80
-39
lines changed

5 files changed

+80
-39
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7751,6 +7751,48 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
77517751
if (match(Op1, m_AnyZeroFP()) && !match(Op1, m_PosZeroFP()))
77527752
return replaceOperand(I, 1, ConstantFP::getZero(OpType));
77537753

7754+
// Canonicalize:
7755+
// fcmp olt X, +inf -> fcmp one X, +inf
7756+
// fcmp ole X, +inf -> fcmp ord X, 0
7757+
// fcmp ogt X, +inf -> false
7758+
// fcmp oge X, +inf -> fcmp oeq X, +inf
7759+
// fcmp ult X, +inf -> fcmp une X, +inf
7760+
// fcmp ule X, +inf -> true
7761+
// fcmp ugt X, +inf -> fcmp uno X, 0
7762+
// fcmp uge X, +inf -> fcmp ueq X, +inf
7763+
// fcmp olt X, -inf -> false
7764+
// fcmp ole X, -inf -> fcmp oeq X, -inf
7765+
// fcmp ogt X, -inf -> fcmp one X, -inf
7766+
// fcmp oge X, -inf -> fcmp ord X, 0
7767+
// fcmp ult X, -inf -> fcmp uno X, 0
7768+
// fcmp ule X, -inf -> fcmp ueq X, -inf
7769+
// fcmp ugt X, -inf -> fcmp une X, -inf
7770+
// fcmp uge X, -inf -> true
7771+
const APFloat *C;
7772+
if (match(Op1, m_APFloat(C)) && C->isInfinity()) {
7773+
switch (C->isNegative() ? FCmpInst::getSwappedPredicate(Pred) : Pred) {
7774+
default:
7775+
break;
7776+
case FCmpInst::FCMP_OGT:
7777+
case FCmpInst::FCMP_ULE:
7778+
llvm_unreachable("Should be simplified by InstSimplify");
7779+
case FCmpInst::FCMP_OLT:
7780+
return new FCmpInst(FCmpInst::FCMP_ONE, Op0, Op1, "", &I);
7781+
case FCmpInst::FCMP_OLE:
7782+
return new FCmpInst(FCmpInst::FCMP_ORD, Op0, ConstantFP::getZero(OpType),
7783+
"", &I);
7784+
case FCmpInst::FCMP_OGE:
7785+
return new FCmpInst(FCmpInst::FCMP_OEQ, Op0, Op1, "", &I);
7786+
case FCmpInst::FCMP_ULT:
7787+
return new FCmpInst(FCmpInst::FCMP_UNE, Op0, Op1, "", &I);
7788+
case FCmpInst::FCMP_UGT:
7789+
return new FCmpInst(FCmpInst::FCMP_UNO, Op0, ConstantFP::getZero(OpType),
7790+
"", &I);
7791+
case FCmpInst::FCMP_UGE:
7792+
return new FCmpInst(FCmpInst::FCMP_UEQ, Op0, Op1, "", &I);
7793+
}
7794+
}
7795+
77547796
// Ignore signbit of bitcasted int when comparing equality to FP 0.0:
77557797
// fcmp oeq/une (bitcast X), 0.0 --> (and X, SignMaskC) ==/!= 0
77567798
if (match(Op1, m_PosZeroFP()) &&
@@ -7864,7 +7906,6 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
78647906
// TODO: Simplify if the copysign constant is 0.0 or NaN.
78657907
// TODO: Handle non-zero compare constants.
78667908
// TODO: Handle other predicates.
7867-
const APFloat *C;
78687909
if (match(Op0, m_OneUse(m_Intrinsic<Intrinsic::copysign>(m_APFloat(C),
78697910
m_Value(X)))) &&
78707911
match(Op1, m_AnyZeroFP()) && !C->isZero() && !C->isNaN()) {

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

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4614,7 +4614,7 @@ define i1 @intersect_fmf_4(double %a, double %b) {
46144614
define i1 @clang_builtin_isnormal_inf_check(half %x) {
46154615
; CHECK-LABEL: @clang_builtin_isnormal_inf_check(
46164616
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4617-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[FABS_X]], 0xH7C00
4617+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[FABS_X]], 0xH7C00
46184618
; CHECK-NEXT: ret i1 [[AND]]
46194619
;
46204620
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4627,7 +4627,7 @@ define i1 @clang_builtin_isnormal_inf_check(half %x) {
46274627
define <2 x i1> @clang_builtin_isnormal_inf_check_vector(<2 x half> %x) {
46284628
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_vector(
46294629
; CHECK-NEXT: [[FABS_X:%.*]] = call <2 x half> @llvm.fabs.v2f16(<2 x half> [[X:%.*]])
4630-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge <2 x half> [[FABS_X]], <half 0xH7C00, half 0xH7C00>
4630+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq <2 x half> [[FABS_X]], <half 0xH7C00, half 0xH7C00>
46314631
; CHECK-NEXT: ret <2 x i1> [[AND]]
46324632
;
46334633
%fabs.x = call <2 x half> @llvm.fabs.v2f16(<2 x half> %x)
@@ -4640,7 +4640,7 @@ define <2 x i1> @clang_builtin_isnormal_inf_check_vector(<2 x half> %x) {
46404640
define i1 @clang_builtin_isnormal_inf_check_commute(half %x) {
46414641
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_commute(
46424642
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4643-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[FABS_X]], 0xH7C00
4643+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[FABS_X]], 0xH7C00
46444644
; CHECK-NEXT: ret i1 [[AND]]
46454645
;
46464646
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4653,7 +4653,7 @@ define i1 @clang_builtin_isnormal_inf_check_commute(half %x) {
46534653
define i1 @clang_builtin_isnormal_inf_check_commute_nsz_rhs(half %x) {
46544654
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_commute_nsz_rhs(
46554655
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4656-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[FABS_X]], 0xH7C00
4656+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[FABS_X]], 0xH7C00
46574657
; CHECK-NEXT: ret i1 [[AND]]
46584658
;
46594659
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4666,7 +4666,7 @@ define i1 @clang_builtin_isnormal_inf_check_commute_nsz_rhs(half %x) {
46664666
define i1 @clang_builtin_isnormal_inf_check_commute_nsz_lhs(half %x) {
46674667
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_commute_nsz_lhs(
46684668
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4669-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[FABS_X]], 0xH7C00
4669+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[FABS_X]], 0xH7C00
46704670
; CHECK-NEXT: ret i1 [[AND]]
46714671
;
46724672
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4690,7 +4690,7 @@ define i1 @clang_builtin_isnormal_inf_check_commute_nofabs_ueq(half %x) {
46904690
define i1 @clang_builtin_isnormal_inf_check_commute_nsz(half %x) {
46914691
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_commute_nsz(
46924692
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4693-
; CHECK-NEXT: [[AND:%.*]] = fcmp nsz oge half [[FABS_X]], 0xH7C00
4693+
; CHECK-NEXT: [[AND:%.*]] = fcmp nsz oeq half [[FABS_X]], 0xH7C00
46944694
; CHECK-NEXT: ret i1 [[AND]]
46954695
;
46964696
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4716,7 +4716,7 @@ define i1 @clang_builtin_isnormal_inf_check_ugt(half %x) {
47164716
define i1 @clang_builtin_isnormal_inf_check_ult(half %x) {
47174717
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_ult(
47184718
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4719-
; CHECK-NEXT: [[AND:%.*]] = fcmp olt half [[FABS_X]], 0xH7C00
4719+
; CHECK-NEXT: [[AND:%.*]] = fcmp one half [[FABS_X]], 0xH7C00
47204720
; CHECK-NEXT: ret i1 [[AND]]
47214721
;
47224722
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4820,8 +4820,8 @@ 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: [[AND:%.*]] = fcmp ord half [[X:%.*]], 0xH0000
4824-
; CHECK-NEXT: ret i1 [[AND]]
4823+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ord half [[X:%.*]], 0xH0000
4824+
; CHECK-NEXT: ret i1 [[CMP]]
48254825
;
48264826
%fabs.x = call half @llvm.fabs.f16(half %x)
48274827
%ord = fcmp ord half %fabs.x, 0.0
@@ -4846,7 +4846,7 @@ define i1 @clang_builtin_isnormal_inf_check_oeq(half %x) {
48464846
define i1 @clang_builtin_isnormal_inf_check_unnececcary_fabs(half %x) {
48474847
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_unnececcary_fabs(
48484848
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4849-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[FABS_X]], 0xH7C00
4849+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[FABS_X]], 0xH7C00
48504850
; CHECK-NEXT: ret i1 [[AND]]
48514851
;
48524852
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4871,7 +4871,7 @@ define i1 @clang_builtin_isnormal_inf_check_not_ord(half %x) {
48714871

48724872
define i1 @clang_builtin_isnormal_inf_check_missing_fabs(half %x) {
48734873
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_missing_fabs(
4874-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[X:%.*]], 0xH7C00
4874+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[X:%.*]], 0xH7C00
48754875
; CHECK-NEXT: ret i1 [[AND]]
48764876
;
48774877
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4912,7 +4912,7 @@ define i1 @clang_builtin_isnormal_inf_check_not_inf(half %x) {
49124912
define i1 @clang_builtin_isnormal_inf_check_nsz_lhs(half %x) {
49134913
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_nsz_lhs(
49144914
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4915-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[FABS_X]], 0xH7C00
4915+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[FABS_X]], 0xH7C00
49164916
; CHECK-NEXT: ret i1 [[AND]]
49174917
;
49184918
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4925,7 +4925,7 @@ define i1 @clang_builtin_isnormal_inf_check_nsz_lhs(half %x) {
49254925
define i1 @clang_builtin_isnormal_inf_check_nsz_rhs(half %x) {
49264926
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_nsz_rhs(
49274927
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4928-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[FABS_X]], 0xH7C00
4928+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[FABS_X]], 0xH7C00
49294929
; CHECK-NEXT: ret i1 [[AND]]
49304930
;
49314931
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4938,7 +4938,7 @@ define i1 @clang_builtin_isnormal_inf_check_nsz_rhs(half %x) {
49384938
define i1 @clang_builtin_isnormal_inf_check_nsz(half %x) {
49394939
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_nsz(
49404940
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4941-
; CHECK-NEXT: [[AND:%.*]] = fcmp nsz oge half [[FABS_X]], 0xH7C00
4941+
; CHECK-NEXT: [[AND:%.*]] = fcmp nsz oeq half [[FABS_X]], 0xH7C00
49424942
; CHECK-NEXT: ret i1 [[AND]]
49434943
;
49444944
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4950,7 +4950,7 @@ define i1 @clang_builtin_isnormal_inf_check_nsz(half %x) {
49504950

49514951
define i1 @clang_builtin_isnormal_inf_check_fneg(half %x) {
49524952
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_fneg(
4953-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[X:%.*]], 0xH7C00
4953+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[X:%.*]], 0xH7C00
49544954
; CHECK-NEXT: ret i1 [[AND]]
49554955
;
49564956
%fneg.x = fneg half %x
@@ -4963,7 +4963,7 @@ define i1 @clang_builtin_isnormal_inf_check_fneg(half %x) {
49634963
define i1 @clang_builtin_isnormal_inf_check_copysign(half %x, half %y) {
49644964
; CHECK-LABEL: @clang_builtin_isnormal_inf_check_copysign(
49654965
; CHECK-NEXT: [[COPYSIGN_X:%.*]] = call half @llvm.copysign.f16(half [[X:%.*]], half [[Y:%.*]])
4966-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[COPYSIGN_X]], 0xH7C00
4966+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[COPYSIGN_X]], 0xH7C00
49674967
; CHECK-NEXT: ret i1 [[AND]]
49684968
;
49694969
%copysign.x = call half @llvm.copysign.f16(half %x, half %y)
@@ -4976,7 +4976,7 @@ define i1 @clang_builtin_isnormal_inf_check_copysign(half %x, half %y) {
49764976
define i1 @isnormal_logical_select_0(half %x) {
49774977
; CHECK-LABEL: @isnormal_logical_select_0(
49784978
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4979-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[FABS_X]], 0xH7C00
4979+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[FABS_X]], 0xH7C00
49804980
; CHECK-NEXT: ret i1 [[AND]]
49814981
;
49824982
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -4989,7 +4989,7 @@ define i1 @isnormal_logical_select_0(half %x) {
49894989
define i1 @isnormal_logical_select_1(half %x) {
49904990
; CHECK-LABEL: @isnormal_logical_select_1(
49914991
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
4992-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[FABS_X]], 0xH7C00
4992+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[FABS_X]], 0xH7C00
49934993
; CHECK-NEXT: ret i1 [[AND]]
49944994
;
49954995
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -5002,7 +5002,7 @@ define i1 @isnormal_logical_select_1(half %x) {
50025002
define i1 @isnormal_logical_select_0_fmf0(half %x) {
50035003
; CHECK-LABEL: @isnormal_logical_select_0_fmf0(
50045004
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
5005-
; CHECK-NEXT: [[AND:%.*]] = fcmp reassoc nsz arcp oge half [[FABS_X]], 0xH7C00
5005+
; CHECK-NEXT: [[AND:%.*]] = fcmp reassoc nsz arcp oeq half [[FABS_X]], 0xH7C00
50065006
; CHECK-NEXT: ret i1 [[AND]]
50075007
;
50085008
%fabs.x = call half @llvm.fabs.f16(half %x)
@@ -5015,7 +5015,7 @@ define i1 @isnormal_logical_select_0_fmf0(half %x) {
50155015
define i1 @isnormal_logical_select_0_fmf1(half %x) {
50165016
; CHECK-LABEL: @isnormal_logical_select_0_fmf1(
50175017
; CHECK-NEXT: [[FABS_X:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
5018-
; CHECK-NEXT: [[AND:%.*]] = fcmp oge half [[FABS_X]], 0xH7C00
5018+
; CHECK-NEXT: [[AND:%.*]] = fcmp oeq half [[FABS_X]], 0xH7C00
50195019
; CHECK-NEXT: ret i1 [[AND]]
50205020
;
50215021
%fabs.x = call half @llvm.fabs.f16(half %x)

llvm/test/Transforms/InstCombine/canonicalize-fcmp-inf.ll

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
define i1 @olt_pinf(half %x) {
55
; CHECK-LABEL: define i1 @olt_pinf(
66
; CHECK-SAME: half [[X:%.*]]) {
7-
; CHECK-NEXT: [[CMP:%.*]] = fcmp olt half [[X]], 0xH7C00
7+
; CHECK-NEXT: [[CMP:%.*]] = fcmp one half [[X]], 0xH7C00
88
; CHECK-NEXT: ret i1 [[CMP]]
99
;
1010
%cmp = fcmp olt half %x, 0xH7c00
@@ -14,7 +14,7 @@ define i1 @olt_pinf(half %x) {
1414
define i1 @ole_pinf(half %x) {
1515
; CHECK-LABEL: define i1 @ole_pinf(
1616
; CHECK-SAME: half [[X:%.*]]) {
17-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ole half [[X]], 0xH7C00
17+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ord half [[X]], 0xH0000
1818
; CHECK-NEXT: ret i1 [[CMP]]
1919
;
2020
%cmp = fcmp ole half %x, 0xH7c00
@@ -33,7 +33,7 @@ define i1 @ogt_pinf(half %x) {
3333
define i1 @oge_pinf(half %x) {
3434
; CHECK-LABEL: define i1 @oge_pinf(
3535
; CHECK-SAME: half [[X:%.*]]) {
36-
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge half [[X]], 0xH7C00
36+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq half [[X]], 0xH7C00
3737
; CHECK-NEXT: ret i1 [[CMP]]
3838
;
3939
%cmp = fcmp oge half %x, 0xH7c00
@@ -43,7 +43,7 @@ define i1 @oge_pinf(half %x) {
4343
define i1 @ult_pinf(half %x) {
4444
; CHECK-LABEL: define i1 @ult_pinf(
4545
; CHECK-SAME: half [[X:%.*]]) {
46-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ult half [[X]], 0xH7C00
46+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une half [[X]], 0xH7C00
4747
; CHECK-NEXT: ret i1 [[CMP]]
4848
;
4949
%cmp = fcmp ult half %x, 0xH7c00
@@ -62,7 +62,7 @@ define i1 @ule_pinf(half %x) {
6262
define i1 @ugt_pinf(half %x) {
6363
; CHECK-LABEL: define i1 @ugt_pinf(
6464
; CHECK-SAME: half [[X:%.*]]) {
65-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt half [[X]], 0xH7C00
65+
; CHECK-NEXT: [[CMP:%.*]] = fcmp uno half [[X]], 0xH0000
6666
; CHECK-NEXT: ret i1 [[CMP]]
6767
;
6868
%cmp = fcmp ugt half %x, 0xH7c00
@@ -72,7 +72,7 @@ define i1 @ugt_pinf(half %x) {
7272
define i1 @uge_pinf(half %x) {
7373
; CHECK-LABEL: define i1 @uge_pinf(
7474
; CHECK-SAME: half [[X:%.*]]) {
75-
; CHECK-NEXT: [[CMP:%.*]] = fcmp uge half [[X]], 0xH7C00
75+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ueq half [[X]], 0xH7C00
7676
; CHECK-NEXT: ret i1 [[CMP]]
7777
;
7878
%cmp = fcmp uge half %x, 0xH7c00
@@ -91,7 +91,7 @@ define i1 @olt_ninf(half %x) {
9191
define i1 @ole_ninf(half %x) {
9292
; CHECK-LABEL: define i1 @ole_ninf(
9393
; CHECK-SAME: half [[X:%.*]]) {
94-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ole half [[X]], 0xHFC00
94+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq half [[X]], 0xHFC00
9595
; CHECK-NEXT: ret i1 [[CMP]]
9696
;
9797
%cmp = fcmp ole half %x, 0xHfc00
@@ -101,7 +101,7 @@ define i1 @ole_ninf(half %x) {
101101
define i1 @ogt_ninf(half %x) {
102102
; CHECK-LABEL: define i1 @ogt_ninf(
103103
; CHECK-SAME: half [[X:%.*]]) {
104-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt half [[X]], 0xHFC00
104+
; CHECK-NEXT: [[CMP:%.*]] = fcmp one half [[X]], 0xHFC00
105105
; CHECK-NEXT: ret i1 [[CMP]]
106106
;
107107
%cmp = fcmp ogt half %x, 0xHfc00
@@ -111,7 +111,7 @@ define i1 @ogt_ninf(half %x) {
111111
define i1 @oge_ninf(half %x) {
112112
; CHECK-LABEL: define i1 @oge_ninf(
113113
; CHECK-SAME: half [[X:%.*]]) {
114-
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge half [[X]], 0xHFC00
114+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ord half [[X]], 0xH0000
115115
; CHECK-NEXT: ret i1 [[CMP]]
116116
;
117117
%cmp = fcmp oge half %x, 0xHfc00
@@ -121,7 +121,7 @@ define i1 @oge_ninf(half %x) {
121121
define i1 @ult_ninf(half %x) {
122122
; CHECK-LABEL: define i1 @ult_ninf(
123123
; CHECK-SAME: half [[X:%.*]]) {
124-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ult half [[X]], 0xHFC00
124+
; CHECK-NEXT: [[CMP:%.*]] = fcmp uno half [[X]], 0xH0000
125125
; CHECK-NEXT: ret i1 [[CMP]]
126126
;
127127
%cmp = fcmp ult half %x, 0xHfc00
@@ -131,7 +131,7 @@ define i1 @ult_ninf(half %x) {
131131
define i1 @ule_ninf(half %x) {
132132
; CHECK-LABEL: define i1 @ule_ninf(
133133
; CHECK-SAME: half [[X:%.*]]) {
134-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ule half [[X]], 0xHFC00
134+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ueq half [[X]], 0xHFC00
135135
; CHECK-NEXT: ret i1 [[CMP]]
136136
;
137137
%cmp = fcmp ule half %x, 0xHfc00
@@ -141,7 +141,7 @@ define i1 @ule_ninf(half %x) {
141141
define i1 @ugt_ninf(half %x) {
142142
; CHECK-LABEL: define i1 @ugt_ninf(
143143
; CHECK-SAME: half [[X:%.*]]) {
144-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt half [[X]], 0xHFC00
144+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une half [[X]], 0xHFC00
145145
; CHECK-NEXT: ret i1 [[CMP]]
146146
;
147147
%cmp = fcmp ugt half %x, 0xHfc00
@@ -160,7 +160,7 @@ define i1 @uge_ninf(half %x) {
160160
define i1 @olt_pinf_fmf(half %x) {
161161
; CHECK-LABEL: define i1 @olt_pinf_fmf(
162162
; CHECK-SAME: half [[X:%.*]]) {
163-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nsz olt half [[X]], 0xH7C00
163+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nsz one half [[X]], 0xH7C00
164164
; CHECK-NEXT: ret i1 [[CMP]]
165165
;
166166
%cmp = fcmp nsz olt half %x, 0xH7c00
@@ -170,7 +170,7 @@ define i1 @olt_pinf_fmf(half %x) {
170170
define i1 @oge_pinf_fmf(half %x) {
171171
; CHECK-LABEL: define i1 @oge_pinf_fmf(
172172
; CHECK-SAME: half [[X:%.*]]) {
173-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge half [[X]], 0xH7C00
173+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oeq half [[X]], 0xH7C00
174174
; CHECK-NEXT: ret i1 [[CMP]]
175175
;
176176
%cmp = fcmp nnan oge half %x, 0xH7c00

llvm/test/Transforms/InstCombine/create-class-from-logic-fcmp.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,7 +1343,7 @@ define i1 @oge_eq_inf_or_uno(half %x) #0 {
13431343
define i1 @ult_fabs_eq_inf_and_ord(half %x) #0 {
13441344
; CHECK-LABEL: @ult_fabs_eq_inf_and_ord(
13451345
; CHECK-NEXT: [[FABS:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
1346-
; CHECK-NEXT: [[AND:%.*]] = fcmp olt half [[FABS]], 0xH7C00
1346+
; CHECK-NEXT: [[AND:%.*]] = fcmp one half [[FABS]], 0xH7C00
13471347
; CHECK-NEXT: ret i1 [[AND]]
13481348
;
13491349
%fabs = call half @llvm.fabs.f16(half %x)
@@ -1355,7 +1355,7 @@ define i1 @ult_fabs_eq_inf_and_ord(half %x) #0 {
13551355

13561356
define i1 @ult_eq_inf_and_ord(half %x) #0 {
13571357
; CHECK-LABEL: @ult_eq_inf_and_ord(
1358-
; CHECK-NEXT: [[AND:%.*]] = fcmp olt half [[X:%.*]], 0xH7C00
1358+
; CHECK-NEXT: [[AND:%.*]] = fcmp one half [[X:%.*]], 0xH7C00
13591359
; CHECK-NEXT: ret i1 [[AND]]
13601360
;
13611361
%ult.fabs.inf = fcmp ult half %x, 0xH7C00

llvm/test/Transforms/InstCombine/fold-select-fmul-if-zero.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_fmul_known_never_nan_inf_neg(float %
659659
define float @fmul_by_var_if_0_oeq_zero_f32_assume_finite_fmul_nsz(float %x, float %y) {
660660
; CHECK-LABEL: @fmul_by_var_if_0_oeq_zero_f32_assume_finite_fmul_nsz(
661661
; CHECK-NEXT: [[FABS_Y:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]])
662-
; CHECK-NEXT: [[IS_FINITE:%.*]] = fcmp olt float [[FABS_Y]], 0x7FF0000000000000
662+
; CHECK-NEXT: [[IS_FINITE:%.*]] = fcmp one float [[FABS_Y]], 0x7FF0000000000000
663663
; CHECK-NEXT: call void @llvm.assume(i1 [[IS_FINITE]])
664664
; CHECK-NEXT: ret float [[X:%.*]]
665665
;
@@ -676,7 +676,7 @@ define float @fmul_by_var_if_0_oeq_zero_f32_assume_finite_fmul_nsz(float %x, flo
676676
define float @fmul_by_var_if_not_one_0_zero_f32_assume_finite_fmul_nsz(float %x, float %y) {
677677
; CHECK-LABEL: @fmul_by_var_if_not_one_0_zero_f32_assume_finite_fmul_nsz(
678678
; CHECK-NEXT: [[FABS_Y:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]])
679-
; CHECK-NEXT: [[IS_FINITE:%.*]] = fcmp olt float [[FABS_Y]], 0x7FF0000000000000
679+
; CHECK-NEXT: [[IS_FINITE:%.*]] = fcmp one float [[FABS_Y]], 0x7FF0000000000000
680680
; CHECK-NEXT: call void @llvm.assume(i1 [[IS_FINITE]])
681681
; CHECK-NEXT: ret float [[X:%.*]]
682682
;

0 commit comments

Comments
 (0)