Skip to content

Commit 724cfef

Browse files
committed
fix: Handle ninf values (update test)
1 parent 8fd78e5 commit 724cfef

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
@@ -8026,9 +8026,11 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
80268026
case FCmpInst::FCMP_OEQ:
80278027
case FCmpInst::FCMP_OGE:
80288028
case FCmpInst::FCMP_OLE: {
8029-
BinaryOperator *SubI = cast<BinaryOperator>(LHSI);
8030-
if (!isKnownNeverInfOrNaN(SubI->getOperand(0), 0, SQ) &&
8031-
!isKnownNeverInfOrNaN(SubI->getOperand(1), 0, SQ))
8029+
if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8030+
!isKnownNeverInfinity(LHSI->getOperand(0), /*Depth=*/0,
8031+
getSimplifyQuery().getWithInstruction(&I)) &&
8032+
!isKnownNeverInfinity(LHSI->getOperand(1), /*Depth=*/0,
8033+
getSimplifyQuery().getWithInstruction(&I)))
80328034
break;
80338035
}
80348036
LLVM_FALLTHROUGH;
@@ -8039,8 +8041,11 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
80398041
case FCmpInst::FCMP_UGE:
80408042
case FCmpInst::FCMP_ULE:
80418043
if (match(RHSC, m_AnyZeroFP()) &&
8042-
match(LHSI, m_FSub(m_Value(X), m_Value(Y))))
8043-
return new FCmpInst(Pred, X, Y, "", &I);
8044+
match(LHSI, m_FSub(m_Value(X), m_Value(Y)))) {
8045+
replaceOperand(I, 0, X);
8046+
replaceOperand(I, 1, Y);
8047+
return &I;
8048+
}
80448049
break;
80458050
}
80468051
break;

llvm/test/Transforms/InstCombine/fcmp.ll

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

14441444
define <8 x i1> @fcmp_oge_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
14451445
; CHECK-LABEL: @fcmp_oge_fsub_const_ninf_vec(
1446-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1447-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oge <8 x float> [[FS]], zeroinitializer
1446+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oge <8 x float> [[X:%.*]], [[Y:%.*]]
14481447
; CHECK-NEXT: ret <8 x i1> [[CMP]]
14491448
;
14501449
%fs = fsub ninf <8 x float> %x, %y
@@ -1454,8 +1453,7 @@ define <8 x i1> @fcmp_oge_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
14541453

14551454
define <8 x i1> @fcmp_ole_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
14561455
; CHECK-LABEL: @fcmp_ole_fsub_const_ninf_vec(
1457-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1458-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ole <8 x float> [[FS]], zeroinitializer
1456+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ole <8 x float> [[X:%.*]], [[Y:%.*]]
14591457
; CHECK-NEXT: ret <8 x i1> [[CMP]]
14601458
;
14611459
%fs = fsub ninf <8 x float> %x, %y
@@ -1465,8 +1463,7 @@ define <8 x i1> @fcmp_ole_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
14651463

14661464
define <8 x i1> @fcmp_oeq_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
14671465
; CHECK-LABEL: @fcmp_oeq_fsub_const_ninf_vec(
1468-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1469-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oeq <8 x float> [[FS]], zeroinitializer
1466+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf oeq <8 x float> [[X:%.*]], [[Y:%.*]]
14701467
; CHECK-NEXT: ret <8 x i1> [[CMP]]
14711468
;
14721469
%fs = fsub ninf <8 x float> %x, %y
@@ -1506,8 +1503,7 @@ define <8 x i1> @fcmp_one_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
15061503

15071504
define <8 x i1> @fcmp_ugt_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
15081505
; CHECK-LABEL: @fcmp_ugt_fsub_const_ninf_vec(
1509-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1510-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ugt <8 x float> [[FS]], zeroinitializer
1506+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ugt <8 x float> [[X:%.*]], [[Y:%.*]]
15111507
; CHECK-NEXT: ret <8 x i1> [[CMP]]
15121508
;
15131509
%fs = fsub ninf <8 x float> %x, %y
@@ -1517,8 +1513,7 @@ define <8 x i1> @fcmp_ugt_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
15171513

15181514
define <8 x i1> @fcmp_ult_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
15191515
; CHECK-LABEL: @fcmp_ult_fsub_const_ninf_vec(
1520-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1521-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ult <8 x float> [[FS]], zeroinitializer
1516+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf ult <8 x float> [[X:%.*]], [[Y:%.*]]
15221517
; CHECK-NEXT: ret <8 x i1> [[CMP]]
15231518
;
15241519
%fs = fsub ninf <8 x float> %x, %y
@@ -1528,8 +1523,7 @@ define <8 x i1> @fcmp_ult_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
15281523

15291524
define <8 x i1> @fcmp_une_fsub_const_ninf_vec(<8 x float> %x, <8 x float> %y) {
15301525
; CHECK-LABEL: @fcmp_une_fsub_const_ninf_vec(
1531-
; CHECK-NEXT: [[FS:%.*]] = fsub ninf <8 x float> [[X:%.*]], [[Y:%.*]]
1532-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf une <8 x float> [[FS]], zeroinitializer
1526+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf une <8 x float> [[X:%.*]], [[Y:%.*]]
15331527
; CHECK-NEXT: ret <8 x i1> [[CMP]]
15341528
;
15351529
%fs = fsub ninf <8 x float> %x, %y
@@ -1569,8 +1563,7 @@ define <8 x i1> @fcmp_ueq_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
15691563

15701564
define <8 x i1> @fcmp_oge_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
15711565
; CHECK-LABEL: @fcmp_oge_fsub_const_nnan_vec(
1572-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
1573-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge <8 x float> [[FS]], zeroinitializer
1566+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge <8 x float> [[X:%.*]], [[Y:%.*]]
15741567
; CHECK-NEXT: ret <8 x i1> [[CMP]]
15751568
;
15761569
%fs = fsub nnan <8 x float> %x, %y
@@ -1580,8 +1573,7 @@ define <8 x i1> @fcmp_oge_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
15801573

15811574
define <8 x i1> @fcmp_ole_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
15821575
; CHECK-LABEL: @fcmp_ole_fsub_const_nnan_vec(
1583-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
1584-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ole <8 x float> [[FS]], zeroinitializer
1576+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ole <8 x float> [[X:%.*]], [[Y:%.*]]
15851577
; CHECK-NEXT: ret <8 x i1> [[CMP]]
15861578
;
15871579
%fs = fsub nnan <8 x float> %x, %y
@@ -1591,8 +1583,7 @@ define <8 x i1> @fcmp_ole_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
15911583

15921584
define <8 x i1> @fcmp_oeq_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
15931585
; CHECK-LABEL: @fcmp_oeq_fsub_const_nnan_vec(
1594-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
1595-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oeq <8 x float> [[FS]], zeroinitializer
1586+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oeq <8 x float> [[X:%.*]], [[Y:%.*]]
15961587
; CHECK-NEXT: ret <8 x i1> [[CMP]]
15971588
;
15981589
%fs = fsub nnan <8 x float> %x, %y
@@ -1632,8 +1623,7 @@ define <8 x i1> @fcmp_one_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
16321623

16331624
define <8 x i1> @fcmp_ugt_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
16341625
; CHECK-LABEL: @fcmp_ugt_fsub_const_nnan_vec(
1635-
; CHECK-NEXT: [[FS:%.*]] = fsub nnan <8 x float> [[X:%.*]], [[Y:%.*]]
1636-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ugt <8 x float> [[FS]], zeroinitializer
1626+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ugt <8 x float> [[X:%.*]], [[Y:%.*]]
16371627
; CHECK-NEXT: ret <8 x i1> [[CMP]]
16381628
;
16391629
%fs = fsub nnan <8 x float> %x, %y
@@ -1643,22 +1633,20 @@ define <8 x i1> @fcmp_ugt_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
16431633

16441634
define <8 x i1> @fcmp_ult_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
16451635
; CHECK-LABEL: @fcmp_ult_fsub_const_nnan_vec(
1646-
; CHECK-NEXT: [[FS:%.*]] = fsub fast <8 x float> [[X:%.*]], [[Y:%.*]]
1647-
; CHECK-NEXT: [[CMP:%.*]] = fcmp fast ult <8 x float> [[FS]], zeroinitializer
1636+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan ult <8 x float> [[X:%.*]], [[Y:%.*]]
16481637
; CHECK-NEXT: ret <8 x i1> [[CMP]]
16491638
;
1650-
%fs = fsub fast <8 x float> %x, %y
1651-
%cmp = fcmp fast ult <8 x float> %fs, zeroinitializer
1639+
%fs = fsub nnan <8 x float> %x, %y
1640+
%cmp = fcmp nnan ult <8 x float> %fs, zeroinitializer
16521641
ret <8 x i1> %cmp
16531642
}
16541643

16551644
define <8 x i1> @fcmp_une_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
16561645
; CHECK-LABEL: @fcmp_une_fsub_const_nnan_vec(
1657-
; CHECK-NEXT: [[FS:%.*]] = fsub fast <8 x float> [[X:%.*]], [[Y:%.*]]
1658-
; CHECK-NEXT: [[CMP:%.*]] = fcmp fast une <8 x float> [[FS]], zeroinitializer
1646+
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan une <8 x float> [[X:%.*]], [[Y:%.*]]
16591647
; CHECK-NEXT: ret <8 x i1> [[CMP]]
16601648
;
1661-
%fs = fsub fast <8 x float> %x, %y
1662-
%cmp = fcmp fast une <8 x float> %fs, zeroinitializer
1649+
%fs = fsub nnan <8 x float> %x, %y
1650+
%cmp = fcmp nnan une <8 x float> %fs, zeroinitializer
16631651
ret <8 x i1> %cmp
16641652
}

0 commit comments

Comments
 (0)