Skip to content

Commit f2b995c

Browse files
committed
fix: Handle ninf values (update test)
1 parent 11c4c53 commit f2b995c

File tree

2 files changed

+26
-33
lines changed

2 files changed

+26
-33
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8055,9 +8055,11 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
80558055
case FCmpInst::FCMP_OEQ:
80568056
case FCmpInst::FCMP_OGE:
80578057
case FCmpInst::FCMP_OLE: {
8058-
BinaryOperator *SubI = cast<BinaryOperator>(LHSI);
8059-
if (!isKnownNeverInfOrNaN(SubI->getOperand(0), 0, SQ) &&
8060-
!isKnownNeverInfOrNaN(SubI->getOperand(1), 0, SQ))
8058+
if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8059+
!isKnownNeverInfinity(LHSI->getOperand(0), /*Depth=*/0,
8060+
getSimplifyQuery().getWithInstruction(&I)) &&
8061+
!isKnownNeverInfinity(LHSI->getOperand(1), /*Depth=*/0,
8062+
getSimplifyQuery().getWithInstruction(&I)))
80618063
break;
80628064
}
80638065
LLVM_FALLTHROUGH;
@@ -8068,8 +8070,11 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
80688070
case FCmpInst::FCMP_UGE:
80698071
case FCmpInst::FCMP_ULE:
80708072
if (match(RHSC, m_AnyZeroFP()) &&
8071-
match(LHSI, m_FSub(m_Value(X), m_Value(Y))))
8072-
return new FCmpInst(Pred, X, Y, "", &I);
8073+
match(LHSI, m_FSub(m_Value(X), m_Value(Y)))) {
8074+
replaceOperand(I, 0, X);
8075+
replaceOperand(I, 1, Y);
8076+
return &I;
8077+
}
80738078
break;
80748079
}
80758080
break;

llvm/test/Transforms/InstCombine/fcmp.ll

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1645,8 +1645,7 @@ define <8 x i1> @fcmp_ueq_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
16451645

16461646
define <8 x i1> @fcmp_oge_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
16471647
; CHECK-LABEL: @fcmp_oge_fsub_const_ninf_vec(
1648-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1649-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oge <8 x float> [[FS]], zeroinitializer
1648+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oge <8 x float> [[X:%.*]], [[Y:%.*]]
16501649
; CHECK-NEXT: ret <8 x i1> [[CMP]]
16511650
;
16521651
%fs = fsub ninf <8 x float> %x, %y
@@ -1656,8 +1655,7 @@ define <8 x i1> @fcmp_oge_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
16561655

16571656
define <8 x i1> @fcmp_ole_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
16581657
; CHECK-LABEL: @fcmp_ole_fsub_const_ninf_vec(
1659-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1660-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ole <8 x float> [[FS]], zeroinitializer
1658+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ole <8 x float> [[X:%.*]], [[Y:%.*]]
16611659
; CHECK-NEXT: ret <8 x i1> [[CMP]]
16621660
;
16631661
%fs = fsub ninf <8 x float> %x, %y
@@ -1667,8 +1665,7 @@ define <8 x i1> @fcmp_ole_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
16671665

16681666
define <8 x i1> @fcmp_oeq_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
16691667
; CHECK-LABEL: @fcmp_oeq_fsub_const_ninf_vec(
1670-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1671-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oeq <8 x float> [[FS]], zeroinitializer
1668+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oeq <8 x float> [[X:%.*]], [[Y:%.*]]
16721669
; CHECK-NEXT: ret <8 x i1> [[CMP]]
16731670
;
16741671
%fs = fsub ninf <8 x float> %x, %y
@@ -1708,8 +1705,7 @@ define <8 x i1> @fcmp_one_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
17081705

17091706
define <8 x i1> @fcmp_ugt_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
17101707
; CHECK-LABEL: @fcmp_ugt_fsub_const_ninf_vec(
1711-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1712-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ugt <8 x float> [[FS]], zeroinitializer
1708+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ugt <8 x float> [[X:%.*]], [[Y:%.*]]
17131709
; CHECK-NEXT: ret <8 x i1> [[CMP]]
17141710
;
17151711
%fs = fsub ninf <8 x float> %x, %y
@@ -1719,8 +1715,7 @@ define <8 x i1> @fcmp_ugt_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
17191715

17201716
define <8 x i1> @fcmp_ult_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
17211717
; CHECK-LABEL: @fcmp_ult_fsub_const_ninf_vec(
1722-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1723-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ult <8 x float> [[FS]], zeroinitializer
1718+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ult <8 x float> [[X:%.*]], [[Y:%.*]]
17241719
; CHECK-NEXT: ret <8 x i1> [[CMP]]
17251720
;
17261721
%fs = fsub ninf <8 x float> %x, %y
@@ -1730,8 +1725,7 @@ define <8 x i1> @fcmp_ult_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
17301725

17311726
define <8 x i1> @fcmp_une_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
17321727
; CHECK-LABEL: @fcmp_une_fsub_const_ninf_vec(
1733-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1734-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf une <8 x float> [[FS]], zeroinitializer
1728+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf une <8 x float> [[X:%.*]], [[Y:%.*]]
17351729
; CHECK-NEXT: ret <8 x i1> [[CMP]]
17361730
;
17371731
%fs = fsub ninf <8 x float> %x, %y
@@ -1771,8 +1765,7 @@ define <8 x i1> @fcmp_ueq_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
17711765

17721766
define <8 x i1> @fcmp_oge_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
17731767
; CHECK-LABEL: @fcmp_oge_fsub_const_nnan_vec(
1774-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
1775-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge <8 x float> [[FS]], zeroinitializer
1768+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge <8 x float> [[X:%.*]], [[Y:%.*]]
17761769
; CHECK-NEXT: ret <8 x i1> [[CMP]]
17771770
;
17781771
%fs = fsub nnan <8 x float> %x, %y
@@ -1782,8 +1775,7 @@ define <8 x i1> @fcmp_oge_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
17821775

17831776
define <8 x i1> @fcmp_ole_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
17841777
; CHECK-LABEL: @fcmp_ole_fsub_const_nnan_vec(
1785-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
1786-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ole <8 x float> [[FS]], zeroinitializer
1778+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ole <8 x float> [[X:%.*]], [[Y:%.*]]
17871779
; CHECK-NEXT: ret <8 x i1> [[CMP]]
17881780
;
17891781
%fs = fsub nnan <8 x float> %x, %y
@@ -1793,8 +1785,7 @@ define <8 x i1> @fcmp_ole_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
17931785

17941786
define <8 x i1> @fcmp_oeq_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
17951787
; CHECK-LABEL: @fcmp_oeq_fsub_const_nnan_vec(
1796-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
1797-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oeq <8 x float> [[FS]], zeroinitializer
1788+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oeq <8 x float> [[X:%.*]], [[Y:%.*]]
17981789
; CHECK-NEXT: ret <8 x i1> [[CMP]]
17991790
;
18001791
%fs = fsub nnan <8 x float> %x, %y
@@ -1834,8 +1825,7 @@ define <8 x i1> @fcmp_one_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
18341825

18351826
define <8 x i1> @fcmp_ugt_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
18361827
; CHECK-LABEL: @fcmp_ugt_fsub_const_nnan_vec(
1837-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
1838-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ugt <8 x float> [[FS]], zeroinitializer
1828+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ugt <8 x float> [[X:%.*]], [[Y:%.*]]
18391829
; CHECK-NEXT: ret <8 x i1> [[CMP]]
18401830
;
18411831
%fs = fsub nnan <8 x float> %x, %y
@@ -1845,22 +1835,20 @@ define <8 x i1> @fcmp_ugt_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
18451835

18461836
define <8 x i1> @fcmp_ult_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
18471837
; CHECK-LABEL: @fcmp_ult_fsub_const_nnan_vec(
1848-
; CHECK-NEXT: [[FS:%.*]] = fsub fast <8 x float> [[X:%.*]], [[Y:%.*]]
1849-
; CHECK-NEXT: [[CMP:%.*]] = fcmp fast ult <8 x float> [[FS]], zeroinitializer
1838+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ult <8 x float> [[X:%.*]], [[Y:%.*]]
18501839
; CHECK-NEXT: ret <8 x i1> [[CMP]]
18511840
;
1852-
%fs = fsub fast <8 x float> %x, %y
1853-
%cmp = fcmp fast ult <8 x float> %fs, zeroinitializer
1841+
%fs = fsub nnan <8 x float> %x, %y
1842+
%cmp = fcmp nnan ult <8 x float> %fs, zeroinitializer
18541843
ret <8 x i1> %cmp
18551844
}
18561845

18571846
define <8 x i1> @fcmp_une_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
18581847
; CHECK-LABEL: @fcmp_une_fsub_const_nnan_vec(
1859-
; CHECK-NEXT: [[FS:%.*]] = fsub fast <8 x float> [[X:%.*]], [[Y:%.*]]
1860-
; CHECK-NEXT: [[CMP:%.*]] = fcmp fast une <8 x float> [[FS]], zeroinitializer
1848+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan une <8 x float> [[X:%.*]], [[Y:%.*]]
18611849
; CHECK-NEXT: ret <8 x i1> [[CMP]]
18621850
;
1863-
%fs = fsub fast <8 x float> %x, %y
1864-
%cmp = fcmp fast une <8 x float> %fs, zeroinitializer
1851+
%fs = fsub nnan <8 x float> %x, %y
1852+
%cmp = fcmp nnan une <8 x float> %fs, zeroinitializer
18651853
ret <8 x i1> %cmp
18661854
}

0 commit comments

Comments
 (0)