@@ -937,8 +937,6 @@ void GISelValueTracking::computeKnownFPClass(Register R,
937
937
938
938
if (KnownSrc.isKnownNeverPosInfinity ())
939
939
Known.knownNot (fcPosInf);
940
- if (KnownSrc.isKnownNever (fcSNan))
941
- Known.knownNot (fcSNan);
942
940
943
941
// Any negative value besides -0 returns a nan.
944
942
if (KnownSrc.isKnownNeverNaN () && KnownSrc.cannotBeOrderedLessThanZero ())
@@ -961,25 +959,27 @@ void GISelValueTracking::computeKnownFPClass(Register R,
961
959
}
962
960
case TargetOpcode::G_FSIN:
963
961
case TargetOpcode::G_FCOS:
962
+ case TargetOpcode::G_FTAN:
964
963
case TargetOpcode::G_FSINCOS: {
965
964
// Return NaN on infinite inputs.
966
965
Register Val = MI.getOperand (1 ).getReg ();
967
966
KnownFPClass KnownSrc;
968
967
969
968
computeKnownFPClass (Val, DemandedElts, InterestedClasses, KnownSrc,
970
969
Depth + 1 );
970
+
971
971
Known.knownNot (fcInf);
972
972
973
973
if (KnownSrc.isKnownNeverNaN () && KnownSrc.isKnownNeverInfinity ())
974
974
Known.knownNot (fcNan);
975
975
break ;
976
976
}
977
+ case TargetOpcode::G_FMAXNUM_IEEE:
978
+ case TargetOpcode::G_FMINNUM_IEEE:
977
979
case TargetOpcode::G_FMAXNUM:
978
980
case TargetOpcode::G_FMINNUM:
979
- case TargetOpcode::G_FMINNUM_IEEE:
980
981
case TargetOpcode::G_FMAXIMUM:
981
982
case TargetOpcode::G_FMINIMUM:
982
- case TargetOpcode::G_FMAXNUM_IEEE:
983
983
case TargetOpcode::G_FMAXIMUMNUM:
984
984
case TargetOpcode::G_FMINIMUMNUM: {
985
985
Register LHS = MI.getOperand (1 ).getReg ();
@@ -994,13 +994,23 @@ void GISelValueTracking::computeKnownFPClass(Register R,
994
994
bool NeverNaN = KnownLHS.isKnownNeverNaN () || KnownRHS.isKnownNeverNaN ();
995
995
Known = KnownLHS | KnownRHS;
996
996
997
+ if (Opcode == TargetOpcode::G_FMAXNUM_IEEE ||
998
+ Opcode == TargetOpcode::G_FMINNUM_IEEE)
999
+ Known.knownNot (fcSNan);
1000
+
997
1001
// If either operand is not NaN, the result is not NaN.
998
1002
if (NeverNaN && (Opcode == TargetOpcode::G_FMINNUM ||
999
1003
Opcode == TargetOpcode::G_FMAXNUM ||
1000
1004
Opcode == TargetOpcode::G_FMINIMUMNUM ||
1001
1005
Opcode == TargetOpcode::G_FMAXIMUMNUM))
1002
1006
Known.knownNot (fcNan);
1003
1007
1008
+ if ((Opcode == TargetOpcode::G_FMAXNUM_IEEE ||
1009
+ Opcode == TargetOpcode::G_FMINNUM_IEEE) &&
1010
+ ((KnownLHS.isKnownNeverNaN () && KnownRHS.isKnownNever (fcSNan)) ||
1011
+ (KnownLHS.isKnownNever (fcSNan) && KnownRHS.isKnownNeverNaN ())))
1012
+ Known.knownNot (fcNan);
1013
+
1004
1014
if (Opcode == TargetOpcode::G_FMAXNUM ||
1005
1015
Opcode == TargetOpcode::G_FMAXIMUMNUM ||
1006
1016
Opcode == TargetOpcode::G_FMAXNUM_IEEE) {
@@ -1089,6 +1099,7 @@ void GISelValueTracking::computeKnownFPClass(Register R,
1089
1099
case TargetOpcode::G_FCANONICALIZE: {
1090
1100
Register Val = MI.getOperand (1 ).getReg ();
1091
1101
KnownFPClass KnownSrc;
1102
+
1092
1103
computeKnownFPClass (Val, DemandedElts, InterestedClasses, KnownSrc,
1093
1104
Depth + 1 );
1094
1105
@@ -1190,6 +1201,8 @@ void GISelValueTracking::computeKnownFPClass(Register R,
1190
1201
if (KnownSrc.isKnownNeverNaN ()) {
1191
1202
Known.knownNot (fcNan);
1192
1203
Known.signBitMustBeZero ();
1204
+ } else {
1205
+ Known.knownNot (fcSNan);
1193
1206
}
1194
1207
1195
1208
break ;
@@ -1300,6 +1313,7 @@ void GISelValueTracking::computeKnownFPClass(Register R,
1300
1313
Register LHS = MI.getOperand (1 ).getReg ();
1301
1314
Register RHS = MI.getOperand (2 ).getReg ();
1302
1315
KnownFPClass KnownLHS, KnownRHS;
1316
+
1303
1317
bool WantNegative =
1304
1318
(Opcode == TargetOpcode::G_FADD ||
1305
1319
Opcode == TargetOpcode::G_STRICT_FADD) &&
@@ -1364,6 +1378,7 @@ void GISelValueTracking::computeKnownFPClass(Register R,
1364
1378
case TargetOpcode::G_STRICT_FMUL: {
1365
1379
Register LHS = MI.getOperand (1 ).getReg ();
1366
1380
Register RHS = MI.getOperand (2 ).getReg ();
1381
+
1367
1382
// X * X is always non-negative or a NaN.
1368
1383
if (LHS == RHS)
1369
1384
Known.knownNot (fcNegative);
@@ -1494,6 +1509,7 @@ void GISelValueTracking::computeKnownFPClass(Register R,
1494
1509
Register Src = MI.getOperand (1 ).getReg ();
1495
1510
// Infinity, nan and zero propagate from source.
1496
1511
computeKnownFPClass (R, DemandedElts, InterestedClasses, Known, Depth + 1 );
1512
+ Known.knownNot (fcSNan);
1497
1513
1498
1514
LLT DstTy = MRI.getType (Dst).getScalarType ();
1499
1515
const fltSemantics &DstSem = getFltSemanticForLLT (DstTy);
@@ -1517,6 +1533,7 @@ void GISelValueTracking::computeKnownFPClass(Register R,
1517
1533
case TargetOpcode::G_FPTRUNC: {
1518
1534
computeKnownFPClassForFPTrunc (MI, DemandedElts, InterestedClasses, Known,
1519
1535
Depth);
1536
+ Known.knownNot (fcSNan);
1520
1537
break ;
1521
1538
}
1522
1539
case TargetOpcode::G_SITOFP:
@@ -1698,6 +1715,126 @@ void GISelValueTracking::computeKnownFPClass(Register R,
1698
1715
computeKnownFPClass (Src, DemandedElts, InterestedClasses, Known, Depth + 1 );
1699
1716
break ;
1700
1717
}
1718
+ case TargetOpcode::G_FATAN: {
1719
+ Register Val = MI.getOperand (1 ).getReg ();
1720
+ KnownFPClass KnownSrc;
1721
+
1722
+ computeKnownFPClass (Val, DemandedElts, InterestedClasses, KnownSrc,
1723
+ Depth + 1 );
1724
+
1725
+ if (KnownSrc.isKnownAlways (fcInf))
1726
+ Known.KnownFPClasses = fcNan;
1727
+
1728
+ break ;
1729
+ }
1730
+ case TargetOpcode::G_FATAN2: {
1731
+ Register LHS = MI.getOperand (1 ).getReg ();
1732
+ Register RHS = MI.getOperand (2 ).getReg ();
1733
+ KnownFPClass KnownLHS;
1734
+ KnownFPClass KnownRHS;
1735
+
1736
+ computeKnownFPClass (LHS, DemandedElts, InterestedClasses, KnownLHS,
1737
+ Depth + 1 );
1738
+
1739
+ computeKnownFPClass (RHS, DemandedElts, InterestedClasses, KnownRHS,
1740
+ Depth + 1 );
1741
+
1742
+ if (!KnownRHS.isKnownNeverNaN () || !KnownRHS.isKnownNeverNaN ())
1743
+ break ;
1744
+
1745
+ if (KnownLHS.isKnownAlways (fcZero)) {
1746
+ // atan2(+-0, −0) -> +-pi
1747
+ // atan2(+-0, x) -> +-pi for x < 0
1748
+ if (KnownRHS.isKnownAlways (fcNegFinite)) {
1749
+ Known.KnownFPClasses = fcFinite;
1750
+ break ;
1751
+ }
1752
+
1753
+ // atan2(+-0, +0) -> +-0
1754
+ // atan2(+-0, x) -> +-0 for x > 0
1755
+ if (KnownRHS.isKnownAlways (fcPosFinite)) {
1756
+ Known.KnownFPClasses = fcZero;
1757
+ break ;
1758
+ }
1759
+ }
1760
+
1761
+ if (KnownRHS.isKnownAlways (fcZero)) {
1762
+ // atan2(y, +-0) -> -pi/2 for y < 0
1763
+ if (KnownLHS.isKnownNeverZero () && KnownLHS.isKnownAlways (fcNegFinite)) {
1764
+ Known.KnownFPClasses = fcNegFinite;
1765
+ break ;
1766
+ }
1767
+
1768
+ // atan2(y, +-0) -> +pi/2 for y > 0
1769
+ if (KnownLHS.isKnownNeverZero () && KnownLHS.isKnownAlways (fcPosFinite)) {
1770
+ Known.KnownFPClasses = fcPosFinite;
1771
+ break ;
1772
+ }
1773
+ }
1774
+
1775
+ if (KnownLHS.isKnownAlways (fcPosFinite) && KnownLHS.isKnownNeverZero ()) {
1776
+ // atan2(+-y, -inf) -> +-pi for finite y > 0
1777
+ if (KnownRHS.isKnownAlways (fcNegInf)) {
1778
+ Known.KnownFPClasses = fcFinite;
1779
+ break ;
1780
+ }
1781
+
1782
+ // atan2(+-y, +inf) -> +-0 for finite y > 0
1783
+ if (KnownRHS.isKnownAlways (fcPosInf)) {
1784
+ Known.KnownFPClasses = fcZero;
1785
+ break ;
1786
+ }
1787
+ }
1788
+
1789
+ if (KnownLHS.isKnownAlways (fcInf)) {
1790
+ // atan2(+-inf, x) -> +-pi/2 for finite x
1791
+ // atan2(+-inf, -inf) -> +-3pi/4
1792
+ // atan2(+-inf, +inf) -> +-pi/4
1793
+ Known.KnownFPClasses = fcFinite;
1794
+ break ;
1795
+ }
1796
+
1797
+ break ;
1798
+ }
1799
+ case TargetOpcode::G_FCOSH: {
1800
+ Register Val = MI.getOperand (1 ).getReg ();
1801
+ KnownFPClass KnownSrc;
1802
+
1803
+ computeKnownFPClass (Val, DemandedElts, InterestedClasses, KnownSrc,
1804
+ Depth + 1 );
1805
+
1806
+ // cosh(+-inf) -> +inf
1807
+ if (KnownSrc.isKnownAlways (fcInf))
1808
+ Known.KnownFPClasses = fcPosInf;
1809
+
1810
+ break ;
1811
+ }
1812
+ case TargetOpcode::G_FSINH: {
1813
+ Register Val = MI.getOperand (1 ).getReg ();
1814
+ KnownFPClass KnownSrc;
1815
+
1816
+ computeKnownFPClass (Val, DemandedElts, InterestedClasses, KnownSrc,
1817
+ Depth + 1 );
1818
+
1819
+ // sinh(±∞) is ±∞
1820
+ if (KnownSrc.isKnownAlways (fcInf))
1821
+ Known.KnownFPClasses = fcInf;
1822
+
1823
+ break ;
1824
+ }
1825
+ case TargetOpcode::G_FTANH: {
1826
+ Register Val = MI.getOperand (1 ).getReg ();
1827
+ KnownFPClass KnownSrc;
1828
+
1829
+ computeKnownFPClass (Val, DemandedElts, InterestedClasses, KnownSrc,
1830
+ Depth + 1 );
1831
+
1832
+ // tanh(+-inf) is +-1
1833
+ if (KnownSrc.isKnownAlways (fcInf))
1834
+ Known.KnownFPClasses = fcFinite;
1835
+
1836
+ break ;
1837
+ }
1701
1838
}
1702
1839
}
1703
1840
0 commit comments