Skip to content

Commit bf21f85

Browse files
committed
fix: Handle ninf values (update test)
1 parent 54de447 commit bf21f85

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
@@ -8046,9 +8046,11 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
80468046
case FCmpInst::FCMP_OEQ:
80478047
case FCmpInst::FCMP_OGE:
80488048
case FCmpInst::FCMP_OLE: {
8049-
BinaryOperator *SubI = cast<BinaryOperator>(LHSI);
8050-
if (!isKnownNeverInfOrNaN(SubI->getOperand(0), 0, SQ) &&
8051-
!isKnownNeverInfOrNaN(SubI->getOperand(1), 0, SQ))
8049+
if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8050+
!isKnownNeverInfinity(LHSI->getOperand(0), /*Depth=*/0,
8051+
getSimplifyQuery().getWithInstruction(&I)) &&
8052+
!isKnownNeverInfinity(LHSI->getOperand(1), /*Depth=*/0,
8053+
getSimplifyQuery().getWithInstruction(&I)))
80528054
break;
80538055
}
80548056
LLVM_FALLTHROUGH;
@@ -8059,8 +8061,11 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
80598061
case FCmpInst::FCMP_UGE:
80608062
case FCmpInst::FCMP_ULE:
80618063
if (match(RHSC, m_AnyZeroFP()) &&
8062-
match(LHSI, m_FSub(m_Value(X), m_Value(Y))))
8063-
return new FCmpInst(Pred, X, Y, "", &I);
8064+
match(LHSI, m_FSub(m_Value(X), m_Value(Y)))) {
8065+
replaceOperand(I, 0, X);
8066+
replaceOperand(I, 1, Y);
8067+
return &I;
8068+
}
80648069
break;
80658070
}
80668071
break;

llvm/test/Transforms/InstCombine/fcmp.ll

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

18481848
define <8 x i1> @fcmp_oge_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
18491849
; CHECK-LABEL: @fcmp_oge_fsub_const_ninf_vec(
1850-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1851-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oge <8 x float> [[FS]], zeroinitializer
1850+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oge <8 x float> [[X:%.*]], [[Y:%.*]]
18521851
; CHECK-NEXT: ret <8 x i1> [[CMP]]
18531852
;
18541853
%fs = fsub ninf <8 x float> %x, %y
@@ -1858,8 +1857,7 @@ define <8 x i1> @fcmp_oge_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
18581857

18591858
define <8 x i1> @fcmp_ole_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
18601859
; CHECK-LABEL: @fcmp_ole_fsub_const_ninf_vec(
1861-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1862-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ole <8 x float> [[FS]], zeroinitializer
1860+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ole <8 x float> [[X:%.*]], [[Y:%.*]]
18631861
; CHECK-NEXT: ret <8 x i1> [[CMP]]
18641862
;
18651863
%fs = fsub ninf <8 x float> %x, %y
@@ -1869,8 +1867,7 @@ define <8 x i1> @fcmp_ole_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
18691867

18701868
define <8 x i1> @fcmp_oeq_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
18711869
; CHECK-LABEL: @fcmp_oeq_fsub_const_ninf_vec(
1872-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1873-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oeq <8 x float> [[FS]], zeroinitializer
1870+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oeq <8 x float> [[X:%.*]], [[Y:%.*]]
18741871
; CHECK-NEXT: ret <8 x i1> [[CMP]]
18751872
;
18761873
%fs = fsub ninf <8 x float> %x, %y
@@ -1910,8 +1907,7 @@ define <8 x i1> @fcmp_one_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
19101907

19111908
define <8 x i1> @fcmp_ugt_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
19121909
; CHECK-LABEL: @fcmp_ugt_fsub_const_ninf_vec(
1913-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1914-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ugt <8 x float> [[FS]], zeroinitializer
1910+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ugt <8 x float> [[X:%.*]], [[Y:%.*]]
19151911
; CHECK-NEXT: ret <8 x i1> [[CMP]]
19161912
;
19171913
%fs = fsub ninf <8 x float> %x, %y
@@ -1921,8 +1917,7 @@ define <8 x i1> @fcmp_ugt_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
19211917

19221918
define <8 x i1> @fcmp_ult_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
19231919
; CHECK-LABEL: @fcmp_ult_fsub_const_ninf_vec(
1924-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1925-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ult <8 x float> [[FS]], zeroinitializer
1920+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ult <8 x float> [[X:%.*]], [[Y:%.*]]
19261921
; CHECK-NEXT: ret <8 x i1> [[CMP]]
19271922
;
19281923
%fs = fsub ninf <8 x float> %x, %y
@@ -1932,8 +1927,7 @@ define <8 x i1> @fcmp_ult_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
19321927

19331928
define <8 x i1> @fcmp_une_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
19341929
; CHECK-LABEL: @fcmp_une_fsub_const_ninf_vec(
1935-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1936-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf une <8 x float> [[FS]], zeroinitializer
1930+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf une <8 x float> [[X:%.*]], [[Y:%.*]]
19371931
; CHECK-NEXT: ret <8 x i1> [[CMP]]
19381932
;
19391933
%fs = fsub ninf <8 x float> %x, %y
@@ -1973,8 +1967,7 @@ define <8 x i1> @fcmp_ueq_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
19731967

19741968
define <8 x i1> @fcmp_oge_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
19751969
; CHECK-LABEL: @fcmp_oge_fsub_const_nnan_vec(
1976-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
1977-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge <8 x float> [[FS]], zeroinitializer
1970+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge <8 x float> [[X:%.*]], [[Y:%.*]]
19781971
; CHECK-NEXT: ret <8 x i1> [[CMP]]
19791972
;
19801973
%fs = fsub nnan <8 x float> %x, %y
@@ -1984,8 +1977,7 @@ define <8 x i1> @fcmp_oge_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
19841977

19851978
define <8 x i1> @fcmp_ole_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
19861979
; CHECK-LABEL: @fcmp_ole_fsub_const_nnan_vec(
1987-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
1988-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ole <8 x float> [[FS]], zeroinitializer
1980+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ole <8 x float> [[X:%.*]], [[Y:%.*]]
19891981
; CHECK-NEXT: ret <8 x i1> [[CMP]]
19901982
;
19911983
%fs = fsub nnan <8 x float> %x, %y
@@ -1995,8 +1987,7 @@ define <8 x i1> @fcmp_ole_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
19951987

19961988
define <8 x i1> @fcmp_oeq_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
19971989
; CHECK-LABEL: @fcmp_oeq_fsub_const_nnan_vec(
1998-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
1999-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oeq <8 x float> [[FS]], zeroinitializer
1990+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oeq <8 x float> [[X:%.*]], [[Y:%.*]]
20001991
; CHECK-NEXT: ret <8 x i1> [[CMP]]
20011992
;
20021993
%fs = fsub nnan <8 x float> %x, %y
@@ -2036,8 +2027,7 @@ define <8 x i1> @fcmp_one_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
20362027

20372028
define <8 x i1> @fcmp_ugt_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
20382029
; CHECK-LABEL: @fcmp_ugt_fsub_const_nnan_vec(
2039-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
2040-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ugt <8 x float> [[FS]], zeroinitializer
2030+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ugt <8 x float> [[X:%.*]], [[Y:%.*]]
20412031
; CHECK-NEXT: ret <8 x i1> [[CMP]]
20422032
;
20432033
%fs = fsub nnan <8 x float> %x, %y
@@ -2047,22 +2037,20 @@ define <8 x i1> @fcmp_ugt_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
20472037

20482038
define <8 x i1> @fcmp_ult_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
20492039
; CHECK-LABEL: @fcmp_ult_fsub_const_nnan_vec(
2050-
; CHECK-NEXT: [[FS:%.*]] = fsub fast <8 x float> [[X:%.*]], [[Y:%.*]]
2051-
; CHECK-NEXT: [[CMP:%.*]] = fcmp fast ult <8 x float> [[FS]], zeroinitializer
2040+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ult <8 x float> [[X:%.*]], [[Y:%.*]]
20522041
; CHECK-NEXT: ret <8 x i1> [[CMP]]
20532042
;
2054-
%fs = fsub fast <8 x float> %x, %y
2055-
%cmp = fcmp fast ult <8 x float> %fs, zeroinitializer
2043+
%fs = fsub nnan <8 x float> %x, %y
2044+
%cmp = fcmp nnan ult <8 x float> %fs, zeroinitializer
20562045
ret <8 x i1> %cmp
20572046
}
20582047

20592048
define <8 x i1> @fcmp_une_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
20602049
; CHECK-LABEL: @fcmp_une_fsub_const_nnan_vec(
2061-
; CHECK-NEXT: [[FS:%.*]] = fsub fast <8 x float> [[X:%.*]], [[Y:%.*]]
2062-
; CHECK-NEXT: [[CMP:%.*]] = fcmp fast une <8 x float> [[FS]], zeroinitializer
2050+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan une <8 x float> [[X:%.*]], [[Y:%.*]]
20632051
; CHECK-NEXT: ret <8 x i1> [[CMP]]
20642052
;
2065-
%fs = fsub fast <8 x float> %x, %y
2066-
%cmp = fcmp fast une <8 x float> %fs, zeroinitializer
2053+
%fs = fsub nnan <8 x float> %x, %y
2054+
%cmp = fcmp nnan une <8 x float> %fs, zeroinitializer
20672055
ret <8 x i1> %cmp
20682056
}

0 commit comments

Comments
 (0)