Skip to content

Commit 9c05591

Browse files
committed
Add more vector tests + cleanup
- Add tests for vectors of <snan, qnan> pairs. - Add more vector tests for <qnan, poison> and <snan, poison> - Remove comment wording about FTZ. - Clarify behavior of fmaxnum(x, <snan, qnan>) -> x in comments (assume snan == qnan)
1 parent b0a057b commit 9c05591

File tree

2 files changed

+161
-10
lines changed

2 files changed

+161
-10
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6719,9 +6719,9 @@ Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
67196719
// In several cases here, we deviate from exact IEEE 754 semantics
67206720
// to enable optimizations (as allowed by the LLVM IR spec).
67216721
//
6722-
// For instance, we often return one of the arguments unmodified instead of
6723-
// inserting an llvm.canonicalize to transform input sNaNs into qNaNs or to
6724-
// respect any FTZ semantics, and sometimes assume all NaN inputs are qNaNs.
6722+
// For instance, we may return one of the arguments unmodified instead of
6723+
// inserting an llvm.canonicalize to transform input sNaNs into qNaNs,
6724+
// or may assume all NaN inputs are qNaNs.
67256725

67266726
// If the arguments are the same, this is a no-op.
67276727
if (Op0 == Op1)
@@ -6742,15 +6742,14 @@ Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
67426742

67436743
// minnum(x, qnan) -> x
67446744
// maxnum(x, qnan) -> x
6745-
// minnum(x, snan) -> qnan
6746-
// maxnum(x, snan) -> qnan
6745+
// minnum(x, snan) -> qnan (or x for vectors mixing snans and qnans)
6746+
// maxnum(x, snan) -> qnan (or x for vectors mixing snans and qnans)
67476747
// minimum(X, nan) -> qnan
67486748
// maximum(X, nan) -> qnan
6749-
if (match(Op1, m_NaN())) {
6750-
if (PropagateNaN || (PropagateSNaN && match(Op1, m_sNaN())))
6751-
return propagateNaN(cast<Constant>(Op1));
6752-
return Op0;
6753-
}
6749+
if (PropagateSNaN && match(Op1, m_sNaN()))
6750+
return propagateNaN(cast<Constant>(Op1));
6751+
else if (match(Op1, m_NaN()))
6752+
return PropagateNaN ? propagateNaN(cast<Constant>(Op1)) : Op0;
67546753

67556754
// In the following folds, inf can be replaced with the largest finite
67566755
// float, if the ninf flag is set.

llvm/test/Transforms/InstSimplify/fminmax-folds.ll

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,38 @@ define <2 x double> @minnum_snan_op1_vec(<2 x double> %x) {
849849
ret <2 x double> %r
850850
}
851851

852+
define <2 x double> @maxnum_snan_qnan_op0_vec(<2 x double> %x) {
853+
; CHECK-LABEL: @maxnum_snan_qnan_op0_vec(
854+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
855+
;
856+
%r = call <2 x double> @llvm.maxnum.v2f64(<2 x double> <double 0x7ff4000000000000, double 0x7fff000000000000>, <2 x double> %x)
857+
ret <2 x double> %r
858+
}
859+
860+
define <2 x double> @maxnum_snan_qnan_op1_vec(<2 x double> %x) {
861+
; CHECK-LABEL: @maxnum_snan_qnan_op1_vec(
862+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
863+
;
864+
%r = call <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double> <double 0x7ff400000000dead, double 0x7fff000000000000>)
865+
ret <2 x double> %r
866+
}
867+
868+
define <2 x double> @minnum_snan_qnan_op0_vec(<2 x double> %x) {
869+
; CHECK-LABEL: @minnum_snan_qnan_op0_vec(
870+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
871+
;
872+
%r = call <2 x double> @llvm.minnum.v2f64(<2 x double> <double 0x7ff4000dead00000, double 0x7fff000000000000>, <2 x double> %x)
873+
ret <2 x double> %r
874+
}
875+
876+
define <2 x double> @minnum_snan_qnan_op1_vec(<2 x double> %x) {
877+
; CHECK-LABEL: @minnum_snan_qnan_op1_vec(
878+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
879+
;
880+
%r = call <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double> <double 0x7ff400dead00dead, double 0x7fff00dead00dead>)
881+
ret <2 x double> %r
882+
}
883+
852884
define float @maxnum_undef_op1(float %x) {
853885
; CHECK-LABEL: @maxnum_undef_op1(
854886
; CHECK-NEXT: ret float [[X:%.*]]
@@ -1346,6 +1378,38 @@ define <2 x double> @minimum_snan_op1_vec(<2 x double> %x) {
13461378
ret <2 x double> %r
13471379
}
13481380

1381+
define <2 x double> @maximum_snan_qnan_op0_vec(<2 x double> %x) {
1382+
; CHECK-LABEL: @maximum_snan_qnan_op0_vec(
1383+
; CHECK-NEXT: ret <2 x double> <double 0x7FFC000000000000, double 0x7FFF000000000000>
1384+
;
1385+
%r = call <2 x double> @llvm.maximum.v2f64(<2 x double> <double 0x7ff4000000000000, double 0x7fff000000000000>, <2 x double> %x)
1386+
ret <2 x double> %r
1387+
}
1388+
1389+
define <2 x double> @maximum_snan_qnan_op1_vec(<2 x double> %x) {
1390+
; CHECK-LABEL: @maximum_snan_qnan_op1_vec(
1391+
; CHECK-NEXT: ret <2 x double> <double 0x7FFC00000000DEAD, double 0x7FFF000000000000>
1392+
;
1393+
%r = call <2 x double> @llvm.maximum.v2f64(<2 x double> %x, <2 x double> <double 0x7ff400000000dead, double 0x7fff000000000000>)
1394+
ret <2 x double> %r
1395+
}
1396+
1397+
define <2 x double> @minimum_snan_qnan_op0_vec(<2 x double> %x) {
1398+
; CHECK-LABEL: @minimum_snan_qnan_op0_vec(
1399+
; CHECK-NEXT: ret <2 x double> <double 0x7FFC000DEAD00000, double 0x7FFF000000000000>
1400+
;
1401+
%r = call <2 x double> @llvm.minimum.v2f64(<2 x double> <double 0x7ff4000dead00000, double 0x7fff000000000000>, <2 x double> %x)
1402+
ret <2 x double> %r
1403+
}
1404+
1405+
define <2 x double> @minimum_snan_qnan_op1_vec(<2 x double> %x) {
1406+
; CHECK-LABEL: @minimum_snan_qnan_op1_vec(
1407+
; CHECK-NEXT: ret <2 x double> <double 0x7FFC00DEAD00DEAD, double 0x7FFF00DEAD00DEAD>
1408+
;
1409+
%r = call <2 x double> @llvm.minimum.v2f64(<2 x double> %x, <2 x double> <double 0x7ff400dead00dead, double 0x7fff00dead00dead>)
1410+
ret <2 x double> %r
1411+
}
1412+
13491413
define float @maximum_undef_op1(float %x) {
13501414
; CHECK-LABEL: @maximum_undef_op1(
13511415
; CHECK-NEXT: ret float [[X:%.*]]
@@ -1894,6 +1958,30 @@ define <2 x double> @minimumnum_nan_op1_vec(<2 x double> %x) {
18941958
ret <2 x double> %r
18951959
}
18961960

1961+
define <2 x double> @maximumnum_nan_op0_vec_partial_poison(<2 x double> %x) {
1962+
; CHECK-LABEL: @maximumnum_nan_op0_vec_partial_poison(
1963+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
1964+
;
1965+
%r = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> <double 0x7ff8000000000000, double poison>, <2 x double> %x)
1966+
ret <2 x double> %r
1967+
}
1968+
1969+
define <2 x double> @maximumnum_nan_op1_vec_partial_poison(<2 x double> %x) {
1970+
; CHECK-LABEL: @maximumnum_nan_op1_vec_partial_poison(
1971+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
1972+
;
1973+
%r = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> %x, <2 x double> <double 0x7ff8000000000000, double poison>)
1974+
ret <2 x double> %r
1975+
}
1976+
1977+
define <2 x double> @minimumnum_nan_op1_vec_partial_poison(<2 x double> %x) {
1978+
; CHECK-LABEL: @minimumnum_nan_op1_vec_partial_poison(
1979+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
1980+
;
1981+
%r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %x, <2 x double> <double poison, double 0x7ff8000dead00000>)
1982+
ret <2 x double> %r
1983+
}
1984+
18971985
define double @maximumnum_snan_op0(double %x) {
18981986
; CHECK-LABEL: @maximumnum_snan_op0(
18991987
; CHECK-NEXT: ret double [[X:%.*]]
@@ -1958,6 +2046,70 @@ define <2 x double> @minimumnum_snan_op1_vec(<2 x double> %x) {
19582046
ret <2 x double> %r
19592047
}
19602048

2049+
define <2 x double> @maximumnum_snan_op0_vec_partial_poison(<2 x double> %x) {
2050+
; CHECK-LABEL: @maximumnum_snan_op0_vec_partial_poison(
2051+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
2052+
;
2053+
%r = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> <double 0x7ff4000000000000, double poison>, <2 x double> %x)
2054+
ret <2 x double> %r
2055+
}
2056+
2057+
define <2 x double> @maximumnum_snan_op1_vec_partial_poison(<2 x double> %x) {
2058+
; CHECK-LABEL: @maximumnum_snan_op1_vec_partial_poison(
2059+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
2060+
;
2061+
%r = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> %x, <2 x double> <double 0x7ff4000000000000, double poison>)
2062+
ret <2 x double> %r
2063+
}
2064+
2065+
define <2 x double> @minimumnum_snan_op0_vec_partial_poison(<2 x double> %x) {
2066+
; CHECK-LABEL: @minimumnum_snan_op0_vec_partial_poison(
2067+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
2068+
;
2069+
%r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> <double poison, double 0x7ff4000dead00000>, <2 x double> %x)
2070+
ret <2 x double> %r
2071+
}
2072+
2073+
define <2 x double> @minimumnum_snan_op1_vec_partial_poison(<2 x double> %x) {
2074+
; CHECK-LABEL: @minimumnum_snan_op1_vec_partial_poison(
2075+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
2076+
;
2077+
%r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %x, <2 x double> <double poison, double 0x7ff4000dead00000>)
2078+
ret <2 x double> %r
2079+
}
2080+
2081+
define <2 x double> @maximumnum_snan_qnan_op0_vec(<2 x double> %x) {
2082+
; CHECK-LABEL: @maximumnum_snan_qnan_op0_vec(
2083+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
2084+
;
2085+
%r = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> <double 0x7ff4000000000000, double 0x7fff000000000000>, <2 x double> %x)
2086+
ret <2 x double> %r
2087+
}
2088+
2089+
define <2 x double> @maximumnum_snan_qnan_op1_vec(<2 x double> %x) {
2090+
; CHECK-LABEL: @maximumnum_snan_qnan_op1_vec(
2091+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
2092+
;
2093+
%r = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> %x, <2 x double> <double 0x7ff400000000dead, double 0x7fff000000000000>)
2094+
ret <2 x double> %r
2095+
}
2096+
2097+
define <2 x double> @minimumnum_snan_qnan_op0_vec(<2 x double> %x) {
2098+
; CHECK-LABEL: @minimumnum_snan_qnan_op0_vec(
2099+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
2100+
;
2101+
%r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> <double 0x7ff4000dead00000, double 0x7fff000000000000>, <2 x double> %x)
2102+
ret <2 x double> %r
2103+
}
2104+
2105+
define <2 x double> @minimumnum_snan_qnan_op1_vec(<2 x double> %x) {
2106+
; CHECK-LABEL: @minimumnum_snan_qnan_op1_vec(
2107+
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
2108+
;
2109+
%r = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %x, <2 x double> <double 0x7ff400dead00dead, double 0x7fff00dead00dead>)
2110+
ret <2 x double> %r
2111+
}
2112+
19612113
define float @maximumnum_poison_op1(float %x) {
19622114
; CHECK-LABEL: @maximumnum_poison_op1(
19632115
; CHECK-NEXT: ret float [[X:%.*]]

0 commit comments

Comments
 (0)