Skip to content

Commit aa652bf

Browse files
committed
Avoid optimization for maxnum(x, <sNaN, qNaN>)
Instead of transforming maxnum(x, <sNaN, qNaN>) -> x, avoid folding the maxnum away so the sNaN element can correctly be propagated as a qNaN.
1 parent 35b7d08 commit aa652bf

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6742,14 +6742,22 @@ Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
67426742

67436743
// minnum(x, qnan) -> x
67446744
// maxnum(x, qnan) -> x
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)
6745+
// minnum(x, snan) -> qnan
6746+
// maxnum(x, snan) -> qnan
67476747
// minimum(X, nan) -> qnan
67486748
// maximum(X, nan) -> qnan
6749-
if (PropagateSNaN && match(Op1, m_sNaN()))
6749+
if (PropagateSNaN && match(Op1, m_sNaN())) {
67506750
return propagateNaN(cast<Constant>(Op1));
6751-
else if (match(Op1, m_NaN()))
6752-
return PropagateNaN ? propagateNaN(cast<Constant>(Op1)) : Op0;
6751+
} else if (match(Op1, m_NaN())) {
6752+
if (PropagateNaN)
6753+
return propagateNaN(cast<Constant>(Op1));
6754+
// In cases like mixed <sNaN, qNaN> vectors, avoid the optimization to
6755+
// allow correct sNaN propagation where necessary.
6756+
else if (PropagateSNaN && !match(Op1, m_qNaN()))
6757+
break;
6758+
else
6759+
return Op0;
6760+
}
67536761

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

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1355,31 +1355,35 @@ define <2 x double> @minnum_snan_op1_vec(<2 x double> %x) {
13551355

13561356
define <2 x double> @maxnum_snan_qnan_op0_vec(<2 x double> %x) {
13571357
; CHECK-LABEL: @maxnum_snan_qnan_op0_vec(
1358-
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
1358+
; CHECK-NEXT: [[X:%.*]] = call <2 x double> @llvm.maxnum.v2f64(<2 x double> <double 0x7FF4000000000000, double 0x7FFF000000000000>, <2 x double> [[X1:%.*]])
1359+
; CHECK-NEXT: ret <2 x double> [[X]]
13591360
;
13601361
%r = call <2 x double> @llvm.maxnum.v2f64(<2 x double> <double 0x7ff4000000000000, double 0x7fff000000000000>, <2 x double> %x)
13611362
ret <2 x double> %r
13621363
}
13631364

13641365
define <2 x double> @maxnum_snan_qnan_op1_vec(<2 x double> %x) {
13651366
; CHECK-LABEL: @maxnum_snan_qnan_op1_vec(
1366-
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
1367+
; CHECK-NEXT: [[X:%.*]] = call <2 x double> @llvm.maxnum.v2f64(<2 x double> [[X1:%.*]], <2 x double> <double 0x7FF400000000DEAD, double 0x7FFF000000000000>)
1368+
; CHECK-NEXT: ret <2 x double> [[X]]
13671369
;
13681370
%r = call <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double> <double 0x7ff400000000dead, double 0x7fff000000000000>)
13691371
ret <2 x double> %r
13701372
}
13711373

13721374
define <2 x double> @minnum_snan_qnan_op0_vec(<2 x double> %x) {
13731375
; CHECK-LABEL: @minnum_snan_qnan_op0_vec(
1374-
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
1376+
; CHECK-NEXT: [[X:%.*]] = call <2 x double> @llvm.minnum.v2f64(<2 x double> <double 0x7FF4000DEAD00000, double 0x7FFF000000000000>, <2 x double> [[X1:%.*]])
1377+
; CHECK-NEXT: ret <2 x double> [[X]]
13751378
;
13761379
%r = call <2 x double> @llvm.minnum.v2f64(<2 x double> <double 0x7ff4000dead00000, double 0x7fff000000000000>, <2 x double> %x)
13771380
ret <2 x double> %r
13781381
}
13791382

13801383
define <2 x double> @minnum_snan_qnan_op1_vec(<2 x double> %x) {
13811384
; CHECK-LABEL: @minnum_snan_qnan_op1_vec(
1382-
; CHECK-NEXT: ret <2 x double> [[X:%.*]]
1385+
; CHECK-NEXT: [[X:%.*]] = call <2 x double> @llvm.minnum.v2f64(<2 x double> [[X1:%.*]], <2 x double> <double 0x7FF400DEAD00DEAD, double 0x7FFF00DEAD00DEAD>)
1386+
; CHECK-NEXT: ret <2 x double> [[X]]
13831387
;
13841388
%r = call <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double> <double 0x7ff400dead00dead, double 0x7fff00dead00dead>)
13851389
ret <2 x double> %r

0 commit comments

Comments
 (0)