Skip to content

Commit ea3fdc5

Browse files
Avoid maxnum(sNaN, x) optimizations / folds (#170181)
The behaviour of constant-folding `maxnum(sNaN, x)` and `minnum(sNaN, x)` has become controversial, and there are ongoing discussions about which behaviour we want to specify in the LLVM IR LangRef. See: - #170082 - #168838 - #138451 - #170067 - https://discourse.llvm.org/t/rfc-a-consistent-set-of-semantics-for-the-floating-point-minimum-and-maximum-operations/89006 This patch removes optimizations and constant-folding support for `maxnum(sNaN, x)` but keeps it folded/optimized for `qNaN`. This should allow for some more flexibility so the implementation can conform to either the old or new version of the semantics specified without any changes. As far as I am aware, optimizations involving constant `sNaN` should generally be edge-cases that rarely occur, so here should hopefully be very little real-world performance impact from disabling these optimizations.
1 parent f5dd2dc commit ea3fdc5

File tree

12 files changed

+174
-66
lines changed

12 files changed

+174
-66
lines changed

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3348,8 +3348,12 @@ static Constant *ConstantFoldIntrinsicCall2(Intrinsic::ID IntrinsicID, Type *Ty,
33483348
case Intrinsic::copysign:
33493349
return ConstantFP::get(Ty->getContext(), APFloat::copySign(Op1V, Op2V));
33503350
case Intrinsic::minnum:
3351+
if (Op1V.isSignaling() || Op2V.isSignaling())
3352+
return nullptr;
33513353
return ConstantFP::get(Ty->getContext(), minnum(Op1V, Op2V));
33523354
case Intrinsic::maxnum:
3355+
if (Op1V.isSignaling() || Op2V.isSignaling())
3356+
return nullptr;
33533357
return ConstantFP::get(Ty->getContext(), maxnum(Op1V, Op2V));
33543358
case Intrinsic::minimum:
33553359
return ConstantFP::get(Ty->getContext(), minimum(Op1V, Op2V));

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6620,7 +6620,8 @@ static MinMaxOptResult OptimizeConstMinMax(const Constant *RHSConst,
66206620
assert(OutNewConstVal != nullptr);
66216621

66226622
bool PropagateNaN = IID == Intrinsic::minimum || IID == Intrinsic::maximum;
6623-
bool PropagateSNaN = IID == Intrinsic::minnum || IID == Intrinsic::maxnum;
6623+
bool ReturnsOtherForAllNaNs =
6624+
IID == Intrinsic::minimumnum || IID == Intrinsic::maximumnum;
66246625
bool IsMin = IID == Intrinsic::minimum || IID == Intrinsic::minnum ||
66256626
IID == Intrinsic::minimumnum;
66266627

@@ -6637,29 +6638,27 @@ static MinMaxOptResult OptimizeConstMinMax(const Constant *RHSConst,
66376638

66386639
// minnum(x, qnan) -> x
66396640
// maxnum(x, qnan) -> x
6640-
// minnum(x, snan) -> qnan
6641-
// maxnum(x, snan) -> qnan
66426641
// minimum(X, nan) -> qnan
66436642
// maximum(X, nan) -> qnan
66446643
// minimumnum(X, nan) -> x
66456644
// maximumnum(X, nan) -> x
66466645
if (CAPF.isNaN()) {
6647-
if (PropagateNaN || (PropagateSNaN && CAPF.isSignaling())) {
6646+
if (PropagateNaN) {
66486647
*OutNewConstVal = ConstantFP::get(CFP->getType(), CAPF.makeQuiet());
66496648
return MinMaxOptResult::UseNewConstVal;
6649+
} else if (ReturnsOtherForAllNaNs || !CAPF.isSignaling()) {
6650+
return MinMaxOptResult::UseOtherVal;
66506651
}
6651-
return MinMaxOptResult::UseOtherVal;
6652+
return MinMaxOptResult::CannotOptimize;
66526653
}
66536654

66546655
if (CAPF.isInfinity() || (Call && Call->hasNoInfs() && CAPF.isLargest())) {
6655-
// minnum(X, -inf) -> -inf (ignoring sNaN -> qNaN propagation)
6656-
// maxnum(X, +inf) -> +inf (ignoring sNaN -> qNaN propagation)
66576656
// minimum(X, -inf) -> -inf if nnan
66586657
// maximum(X, +inf) -> +inf if nnan
66596658
// minimumnum(X, -inf) -> -inf
66606659
// maximumnum(X, +inf) -> +inf
66616660
if (CAPF.isNegative() == IsMin &&
6662-
(!PropagateNaN || (Call && Call->hasNoNaNs()))) {
6661+
(ReturnsOtherForAllNaNs || (Call && Call->hasNoNaNs()))) {
66636662
*OutNewConstVal = const_cast<Constant *>(RHSConst);
66646663
return MinMaxOptResult::UseNewConstVal;
66656664
}
@@ -7004,12 +7003,10 @@ Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
70047003
case Intrinsic::minimum:
70057004
case Intrinsic::maximumnum:
70067005
case Intrinsic::minimumnum: {
7007-
// In several cases here, we deviate from exact IEEE 754 semantics
7008-
// to enable optimizations (as allowed by the LLVM IR spec).
7009-
//
7010-
// For instance, we may return one of the arguments unmodified instead of
7011-
// inserting an llvm.canonicalize to transform input sNaNs into qNaNs,
7012-
// or may assume all NaN inputs are qNaNs.
7006+
// In some cases here, we deviate from exact IEEE-754 semantics to enable
7007+
// optimizations (as allowed by the LLVM IR spec) by returning one of the
7008+
// arguments unmodified instead of inserting an llvm.canonicalize to
7009+
// transform input sNaNs into qNaNs,
70137010

70147011
// If the arguments are the same, this is a no-op (ignoring NaN quieting)
70157012
if (Op0 == Op1)

llvm/lib/CodeGen/GlobalISel/Utils.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,8 +768,12 @@ llvm::ConstantFoldFPBinOp(unsigned Opcode, const Register Op1,
768768
C1.copySign(C2);
769769
return C1;
770770
case TargetOpcode::G_FMINNUM:
771+
if (C1.isSignaling() || C2.isSignaling())
772+
return std::nullopt;
771773
return minnum(C1, C2);
772774
case TargetOpcode::G_FMAXNUM:
775+
if (C1.isSignaling() || C2.isSignaling())
776+
return std::nullopt;
773777
return maxnum(C1, C2);
774778
case TargetOpcode::G_FMINIMUM:
775779
return minimum(C1, C2);

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19505,7 +19505,8 @@ SDValue DAGCombiner::visitFMinMax(SDNode *N) {
1950519505
const SDNodeFlags Flags = N->getFlags();
1950619506
unsigned Opc = N->getOpcode();
1950719507
bool PropAllNaNsToQNaNs = Opc == ISD::FMINIMUM || Opc == ISD::FMAXIMUM;
19508-
bool PropOnlySNaNsToQNaNs = Opc == ISD::FMINNUM || Opc == ISD::FMAXNUM;
19508+
bool ReturnsOtherForAllNaNs =
19509+
Opc == ISD::FMINIMUMNUM || Opc == ISD::FMAXIMUMNUM;
1950919510
bool IsMin =
1951019511
Opc == ISD::FMINNUM || Opc == ISD::FMINIMUM || Opc == ISD::FMINIMUMNUM;
1951119512
SelectionDAG::FlagInserter FlagsInserter(DAG, N);
@@ -19524,32 +19525,30 @@ SDValue DAGCombiner::visitFMinMax(SDNode *N) {
1952419525

1952519526
// minnum(X, qnan) -> X
1952619527
// maxnum(X, qnan) -> X
19527-
// minnum(X, snan) -> qnan
19528-
// maxnum(X, snan) -> qnan
1952919528
// minimum(X, nan) -> qnan
1953019529
// maximum(X, nan) -> qnan
1953119530
// minimumnum(X, nan) -> X
1953219531
// maximumnum(X, nan) -> X
1953319532
if (AF.isNaN()) {
19534-
if (PropAllNaNsToQNaNs || (AF.isSignaling() && PropOnlySNaNsToQNaNs)) {
19533+
if (PropAllNaNsToQNaNs) {
1953519534
if (AF.isSignaling())
1953619535
return DAG.getConstantFP(AF.makeQuiet(), SDLoc(N), VT);
1953719536
return N->getOperand(1);
19537+
} else if (ReturnsOtherForAllNaNs || !AF.isSignaling()) {
19538+
return N->getOperand(0);
1953819539
}
19539-
return N->getOperand(0);
19540+
return SDValue();
1954019541
}
1954119542

1954219543
// In the following folds, inf can be replaced with the largest finite
1954319544
// float, if the ninf flag is set.
1954419545
if (AF.isInfinity() || (Flags.hasNoInfs() && AF.isLargest())) {
19545-
// minnum(X, -inf) -> -inf (ignoring sNaN -> qNaN propagation)
19546-
// maxnum(X, +inf) -> +inf (ignoring sNaN -> qNaN propagation)
1954719546
// minimum(X, -inf) -> -inf if nnan
1954819547
// maximum(X, +inf) -> +inf if nnan
1954919548
// minimumnum(X, -inf) -> -inf
1955019549
// maximumnum(X, +inf) -> +inf
1955119550
if (IsMin == AF.isNegative() &&
19552-
(!PropAllNaNsToQNaNs || Flags.hasNoNaNs()))
19551+
(ReturnsOtherForAllNaNs || Flags.hasNoNaNs()))
1955319552
return N->getOperand(1);
1955419553

1955519554
// minnum(X, +inf) -> X if nnan

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7390,8 +7390,12 @@ SDValue SelectionDAG::foldConstantFPMath(unsigned Opcode, const SDLoc &DL,
73907390
C1.copySign(C2);
73917391
return getConstantFP(C1, DL, VT);
73927392
case ISD::FMINNUM:
7393+
if (C1.isSignaling() || C2.isSignaling())
7394+
return SDValue();
73937395
return getConstantFP(minnum(C1, C2), DL, VT);
73947396
case ISD::FMAXNUM:
7397+
if (C1.isSignaling() || C2.isSignaling())
7398+
return SDValue();
73957399
return getConstantFP(maxnum(C1, C2), DL, VT);
73967400
case ISD::FMINIMUM:
73977401
return getConstantFP(minimum(C1, C2), DL, VT);

llvm/test/CodeGen/AMDGPU/fcanonicalize-elimination.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,10 +497,12 @@ define amdgpu_kernel void @test_fold_canonicalize_minnum_value_f32(ptr addrspace
497497
ret void
498498
}
499499

500-
; FIXME: Should there be more checks here? minnum with sNaN operand is simplified to qNaN.
500+
; FIXME: Should there be more checks here? minnum with sNaN operand might get simplified away.
501501

502502
; GCN-LABEL: test_fold_canonicalize_sNaN_value_f32:
503-
; GCN: v_mov_b32_e32 v{{.+}}, 0x7fc00000
503+
; GCN: {{flat|global}}_load_dword [[LOAD:v[0-9]+]]
504+
; VI: v_mul_f32_e32 v{{[0-9]+}}, 1.0, [[LOAD]]
505+
; GFX9: v_max_f32_e32 v{{[0-9]+}}, [[LOAD]], [[LOAD]]
504506
define amdgpu_kernel void @test_fold_canonicalize_sNaN_value_f32(ptr addrspace(1) %arg) {
505507
%id = tail call i32 @llvm.amdgcn.workitem.id.x()
506508
%gep = getelementptr inbounds float, ptr addrspace(1) %arg, i32 %id

llvm/test/CodeGen/ARM/fminmax-folds.ll

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,15 @@ define float @test_minnum_const_inf(float %x) {
6565
define float @test_maxnum_const_inf(float %x) {
6666
; CHECK-LABEL: test_maxnum_const_inf:
6767
; CHECK: @ %bb.0:
68-
; CHECK-NEXT: movw r0, #0
69-
; CHECK-NEXT: movt r0, #32640
68+
; CHECK-NEXT: vldr s0, .LCPI5_0
69+
; CHECK-NEXT: vmov s2, r0
70+
; CHECK-NEXT: vmaxnm.f32 s0, s2, s0
71+
; CHECK-NEXT: vmov r0, s0
7072
; CHECK-NEXT: bx lr
73+
; CHECK-NEXT: .p2align 2
74+
; CHECK-NEXT: @ %bb.1:
75+
; CHECK-NEXT: .LCPI5_0:
76+
; CHECK-NEXT: .long 0x7f800000 @ float +Inf
7177
%r = call float @llvm.maxnum.f32(float %x, float 0x7ff0000000000000)
7278
ret float %r
7379
}
@@ -99,9 +105,15 @@ define float @test_minimum_const_inf(float %x) {
99105
define float @test_minnum_const_neg_inf(float %x) {
100106
; CHECK-LABEL: test_minnum_const_neg_inf:
101107
; CHECK: @ %bb.0:
102-
; CHECK-NEXT: movw r0, #0
103-
; CHECK-NEXT: movt r0, #65408
108+
; CHECK-NEXT: vldr s0, .LCPI8_0
109+
; CHECK-NEXT: vmov s2, r0
110+
; CHECK-NEXT: vminnm.f32 s0, s2, s0
111+
; CHECK-NEXT: vmov r0, s0
104112
; CHECK-NEXT: bx lr
113+
; CHECK-NEXT: .p2align 2
114+
; CHECK-NEXT: @ %bb.1:
115+
; CHECK-NEXT: .LCPI8_0:
116+
; CHECK-NEXT: .long 0xff800000 @ float -Inf
105117
%r = call float @llvm.minnum.f32(float %x, float 0xfff0000000000000)
106118
ret float %r
107119
}
@@ -447,9 +459,15 @@ define float @test_minnum_const_max_ninf(float %x) {
447459
define float @test_maxnum_const_max_ninf(float %x) {
448460
; CHECK-LABEL: test_maxnum_const_max_ninf:
449461
; CHECK: @ %bb.0:
450-
; CHECK-NEXT: movw r0, #65535
451-
; CHECK-NEXT: movt r0, #32639
462+
; CHECK-NEXT: vldr s0, .LCPI37_0
463+
; CHECK-NEXT: vmov s2, r0
464+
; CHECK-NEXT: vmaxnm.f32 s0, s2, s0
465+
; CHECK-NEXT: vmov r0, s0
452466
; CHECK-NEXT: bx lr
467+
; CHECK-NEXT: .p2align 2
468+
; CHECK-NEXT: @ %bb.1:
469+
; CHECK-NEXT: .LCPI37_0:
470+
; CHECK-NEXT: .long 0x7f7fffff @ float 3.40282347E+38
453471
%r = call ninf float @llvm.maxnum.f32(float %x, float 0x47efffffe0000000)
454472
ret float %r
455473
}
@@ -481,8 +499,15 @@ define float @test_minimum_const_max_ninf(float %x) {
481499
define float @test_minnum_const_neg_max_ninf(float %x) {
482500
; CHECK-LABEL: test_minnum_const_neg_max_ninf:
483501
; CHECK: @ %bb.0:
484-
; CHECK-NEXT: mvn r0, #8388608
502+
; CHECK-NEXT: vldr s0, .LCPI40_0
503+
; CHECK-NEXT: vmov s2, r0
504+
; CHECK-NEXT: vminnm.f32 s0, s2, s0
505+
; CHECK-NEXT: vmov r0, s0
485506
; CHECK-NEXT: bx lr
507+
; CHECK-NEXT: .p2align 2
508+
; CHECK-NEXT: @ %bb.1:
509+
; CHECK-NEXT: .LCPI40_0:
510+
; CHECK-NEXT: .long 0xff7fffff @ float -3.40282347E+38
486511
%r = call ninf float @llvm.minnum.f32(float %x, float 0xc7efffffe0000000)
487512
ret float %r
488513
}

llvm/test/CodeGen/X86/fmaxnum.ll

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -676,15 +676,44 @@ define float @test_maxnum_neg_inf_nnan(float %x, float %y) nounwind {
676676

677677
; Test SNaN quieting
678678
define float @test_maxnum_snan(float %x) {
679-
; SSE-LABEL: test_maxnum_snan:
680-
; SSE: # %bb.0:
681-
; SSE-NEXT: movss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]
682-
; SSE-NEXT: retq
679+
; SSE2-LABEL: test_maxnum_snan:
680+
; SSE2: # %bb.0:
681+
; SSE2-NEXT: movss {{.*#+}} xmm2 = [NaN,0.0E+0,0.0E+0,0.0E+0]
682+
; SSE2-NEXT: movaps %xmm0, %xmm1
683+
; SSE2-NEXT: cmpunordss %xmm0, %xmm1
684+
; SSE2-NEXT: movaps %xmm1, %xmm3
685+
; SSE2-NEXT: andps %xmm2, %xmm3
686+
; SSE2-NEXT: maxss %xmm0, %xmm2
687+
; SSE2-NEXT: andnps %xmm2, %xmm1
688+
; SSE2-NEXT: orps %xmm3, %xmm1
689+
; SSE2-NEXT: movaps %xmm1, %xmm0
690+
; SSE2-NEXT: retq
683691
;
684-
; AVX-LABEL: test_maxnum_snan:
685-
; AVX: # %bb.0:
686-
; AVX-NEXT: vmovss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]
687-
; AVX-NEXT: retq
692+
; SSE4-LABEL: test_maxnum_snan:
693+
; SSE4: # %bb.0:
694+
; SSE4-NEXT: movss {{.*#+}} xmm1 = [NaN,0.0E+0,0.0E+0,0.0E+0]
695+
; SSE4-NEXT: maxss %xmm0, %xmm1
696+
; SSE4-NEXT: cmpunordss %xmm0, %xmm0
697+
; SSE4-NEXT: blendvps %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
698+
; SSE4-NEXT: movaps %xmm1, %xmm0
699+
; SSE4-NEXT: retq
700+
;
701+
; AVX1-LABEL: test_maxnum_snan:
702+
; AVX1: # %bb.0:
703+
; AVX1-NEXT: vmovss {{.*#+}} xmm1 = [NaN,0.0E+0,0.0E+0,0.0E+0]
704+
; AVX1-NEXT: vmaxss %xmm0, %xmm1, %xmm1
705+
; AVX1-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0
706+
; AVX1-NEXT: vblendvps %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0
707+
; AVX1-NEXT: retq
708+
;
709+
; AVX512-LABEL: test_maxnum_snan:
710+
; AVX512: # %bb.0:
711+
; AVX512-NEXT: vmovss {{.*#+}} xmm2 = [NaN,0.0E+0,0.0E+0,0.0E+0]
712+
; AVX512-NEXT: vmaxss %xmm0, %xmm2, %xmm1
713+
; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k1
714+
; AVX512-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}
715+
; AVX512-NEXT: vmovaps %xmm1, %xmm0
716+
; AVX512-NEXT: retq
688717
%r = call float @llvm.maxnum.f32(float 0x7ff4000000000000, float %x)
689718
ret float %r
690719
}

llvm/test/CodeGen/X86/fminnum.ll

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -676,15 +676,44 @@ define float @test_minnum_inf_nnan(float %x, float %y) nounwind {
676676

677677
; Test SNaN quieting
678678
define float @test_minnum_snan(float %x) {
679-
; SSE-LABEL: test_minnum_snan:
680-
; SSE: # %bb.0:
681-
; SSE-NEXT: movss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]
682-
; SSE-NEXT: retq
679+
; SSE2-LABEL: test_minnum_snan:
680+
; SSE2: # %bb.0:
681+
; SSE2-NEXT: movss {{.*#+}} xmm2 = [NaN,0.0E+0,0.0E+0,0.0E+0]
682+
; SSE2-NEXT: movaps %xmm0, %xmm1
683+
; SSE2-NEXT: cmpunordss %xmm0, %xmm1
684+
; SSE2-NEXT: movaps %xmm1, %xmm3
685+
; SSE2-NEXT: andps %xmm2, %xmm3
686+
; SSE2-NEXT: minss %xmm0, %xmm2
687+
; SSE2-NEXT: andnps %xmm2, %xmm1
688+
; SSE2-NEXT: orps %xmm3, %xmm1
689+
; SSE2-NEXT: movaps %xmm1, %xmm0
690+
; SSE2-NEXT: retq
683691
;
684-
; AVX-LABEL: test_minnum_snan:
685-
; AVX: # %bb.0:
686-
; AVX-NEXT: vmovss {{.*#+}} xmm0 = [NaN,0.0E+0,0.0E+0,0.0E+0]
687-
; AVX-NEXT: retq
692+
; SSE4-LABEL: test_minnum_snan:
693+
; SSE4: # %bb.0:
694+
; SSE4-NEXT: movss {{.*#+}} xmm1 = [NaN,0.0E+0,0.0E+0,0.0E+0]
695+
; SSE4-NEXT: minss %xmm0, %xmm1
696+
; SSE4-NEXT: cmpunordss %xmm0, %xmm0
697+
; SSE4-NEXT: blendvps %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
698+
; SSE4-NEXT: movaps %xmm1, %xmm0
699+
; SSE4-NEXT: retq
700+
;
701+
; AVX1-LABEL: test_minnum_snan:
702+
; AVX1: # %bb.0:
703+
; AVX1-NEXT: vmovss {{.*#+}} xmm1 = [NaN,0.0E+0,0.0E+0,0.0E+0]
704+
; AVX1-NEXT: vminss %xmm0, %xmm1, %xmm1
705+
; AVX1-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0
706+
; AVX1-NEXT: vblendvps %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0
707+
; AVX1-NEXT: retq
708+
;
709+
; AVX512-LABEL: test_minnum_snan:
710+
; AVX512: # %bb.0:
711+
; AVX512-NEXT: vmovss {{.*#+}} xmm2 = [NaN,0.0E+0,0.0E+0,0.0E+0]
712+
; AVX512-NEXT: vminss %xmm0, %xmm2, %xmm1
713+
; AVX512-NEXT: vcmpunordss %xmm0, %xmm0, %k1
714+
; AVX512-NEXT: vmovss %xmm2, %xmm1, %xmm1 {%k1}
715+
; AVX512-NEXT: vmovaps %xmm1, %xmm0
716+
; AVX512-NEXT: retq
688717
%r = call float @llvm.minnum.f32(float 0x7ff4000000000000, float %x)
689718
ret float %r
690719
}

llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ declare float @llvm.trunc.f32(float)
1010
declare float @llvm.arithmetic.fence.f32(float)
1111
declare float @llvm.minnum.f32(float, float)
1212
declare float @llvm.maxnum.f32(float, float)
13+
declare float @llvm.minimumnum.f32(float, float)
14+
declare float @llvm.maximumnum.f32(float, float)
1315

1416

1517
define float @ninf_user_select_inf(i1 %cond, float %x, float %y) {
@@ -1314,7 +1316,7 @@ define nofpclass(pinf) float @ret_nofpclass_pinf__minnum_ninf(i1 %cond, float %x
13141316
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
13151317
; CHECK-NEXT: ret float 0xFFF0000000000000
13161318
;
1317-
%min = call float @llvm.minnum.f32(float %x, float 0xFFF0000000000000)
1319+
%min = call float @llvm.minimumnum.f32(float %x, float 0xFFF0000000000000)
13181320
ret float %min
13191321
}
13201322

@@ -1335,6 +1337,6 @@ define nofpclass(ninf) float @ret_nofpclass_ninf__maxnum_pinf(i1 %cond, float %x
13351337
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
13361338
; CHECK-NEXT: ret float 0x7FF0000000000000
13371339
;
1338-
%max = call float @llvm.maxnum.f32(float %x, float 0x7FF0000000000000)
1340+
%max = call float @llvm.maximumnum.f32(float %x, float 0x7FF0000000000000)
13391341
ret float %max
13401342
}

0 commit comments

Comments
 (0)