diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index c607767103687..4c8560532d1ce 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -4727,6 +4727,40 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts, Known.knownNot(fcNan); break; } + case Intrinsic::minnum: + case Intrinsic::maxnum: { + KnownFPClass Known2; + computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses, + Known, Depth + 1, Q, TLI); + computeKnownFPClass(II->getArgOperand(1), DemandedElts, InterestedClasses, + Known2, Depth + 1, Q, TLI); + + bool NeverNaN = Known.isKnownNeverNaN() || Known2.isKnownNeverNaN(); + Known |= Known2; + + // If either operand is not NaN, the result is not NaN. + if (NeverNaN) + Known.knownNot(fcNan); + + // Fixup zero handling if denormals could be returned as a zero. + // + // As there's no spec for denormal flushing, be conservative with the + // treatment of denormals that could be flushed to zero. For older + // subtargets on AMDGPU the min/max instructions would not flush the + // output and return the original value. + // + // TODO: This could be refined based on the sign + if ((Known.KnownFPClasses & fcZero) != fcNone && + !Known.isKnownNeverSubnormal()) { + const Function *Parent = II->getFunction(); + DenormalMode Mode = Parent->getDenormalMode( + II->getType()->getScalarType()->getFltSemantics()); + if (Mode != DenormalMode::getIEEE()) + Known.KnownFPClasses |= fcZero; + } + + break; + } case Intrinsic::canonicalize: { computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses, Known, Depth + 1, Q, TLI); diff --git a/llvm/test/Transforms/Attributor/nofpclass-minnum-maxnum.ll b/llvm/test/Transforms/Attributor/nofpclass-minnum-maxnum.ll index 2a41d0fd099dd..049672b4a4486 100644 --- a/llvm/test/Transforms/Attributor/nofpclass-minnum-maxnum.ll +++ b/llvm/test/Transforms/Attributor/nofpclass-minnum-maxnum.ll @@ -16,9 +16,9 @@ define float @ret_minnum(float %arg0, float %arg1) #0 { } define float @ret_minnum_noinf__noinf(float nofpclass(inf) %arg0, float nofpclass(inf) %arg1) #0 { -; CHECK-LABEL: define float @ret_minnum_noinf__noinf +; CHECK-LABEL: define nofpclass(inf) float @ret_minnum_noinf__noinf ; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float nofpclass(inf) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -26,9 +26,9 @@ define float @ret_minnum_noinf__noinf(float nofpclass(inf) %arg0, float nofpclas } define float @ret_minnum_noinf__nonan(float nofpclass(inf) %arg0, float nofpclass(nan) %arg1) #0 { -; CHECK-LABEL: define float @ret_minnum_noinf__nonan +; CHECK-LABEL: define nofpclass(nan) float @ret_minnum_noinf__nonan ; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -36,9 +36,9 @@ define float @ret_minnum_noinf__nonan(float nofpclass(inf) %arg0, float nofpclas } define float @ret_minnum_nonan__noinf(float nofpclass(nan) %arg0, float nofpclass(inf) %arg1) #0 { -; CHECK-LABEL: define float @ret_minnum_nonan__noinf +; CHECK-LABEL: define nofpclass(nan) float @ret_minnum_nonan__noinf ; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(inf) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -46,9 +46,9 @@ define float @ret_minnum_nonan__noinf(float nofpclass(nan) %arg0, float nofpclas } define float @ret_minnum_noinf_nonan__nonan(float nofpclass(inf nan) %arg0, float nofpclass(nan) %arg1) #0 { -; CHECK-LABEL: define float @ret_minnum_noinf_nonan__nonan +; CHECK-LABEL: define nofpclass(nan) float @ret_minnum_noinf_nonan__nonan ; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -56,9 +56,9 @@ define float @ret_minnum_noinf_nonan__nonan(float nofpclass(inf nan) %arg0, floa } define float @ret_minnum_nonan__noinf_nonan(float nofpclass(nan) %arg0, float nofpclass(inf nan) %arg1) #0 { -; CHECK-LABEL: define float @ret_minnum_nonan__noinf_nonan +; CHECK-LABEL: define nofpclass(nan) float @ret_minnum_nonan__noinf_nonan ; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -66,9 +66,9 @@ define float @ret_minnum_nonan__noinf_nonan(float nofpclass(nan) %arg0, float no } define float @ret_minnum_norm_zero__norm_sub(float nofpclass(norm zero) %arg0, float nofpclass(norm sub) %arg1) #0 { -; CHECK-LABEL: define float @ret_minnum_norm_zero__norm_sub +; CHECK-LABEL: define nofpclass(norm) float @ret_minnum_norm_zero__norm_sub ; CHECK-SAME: (float nofpclass(zero norm) [[ARG0:%.*]], float nofpclass(sub norm) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(norm) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -86,9 +86,9 @@ define float @ret_maxnum(float %arg0, float %arg1) #0 { } define float @ret_maxnum_noinf__noinf(float nofpclass(inf) %arg0, float nofpclass(inf) %arg1) #0 { -; CHECK-LABEL: define float @ret_maxnum_noinf__noinf +; CHECK-LABEL: define nofpclass(inf) float @ret_maxnum_noinf__noinf ; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float nofpclass(inf) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf) float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.maxnum.f32(float %arg0, float %arg1) @@ -96,9 +96,9 @@ define float @ret_maxnum_noinf__noinf(float nofpclass(inf) %arg0, float nofpclas } define float @ret_maxnum_noinf__nonan(float nofpclass(inf) %arg0, float nofpclass(nan) %arg1) #0 { -; CHECK-LABEL: define float @ret_maxnum_noinf__nonan +; CHECK-LABEL: define nofpclass(nan) float @ret_maxnum_noinf__nonan ; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.maxnum.f32(float %arg0, float %arg1) @@ -106,9 +106,9 @@ define float @ret_maxnum_noinf__nonan(float nofpclass(inf) %arg0, float nofpclas } define float @ret_maxnum_nonan__noinf(float nofpclass(nan) %arg0, float nofpclass(inf) %arg1) #0 { -; CHECK-LABEL: define float @ret_maxnum_nonan__noinf +; CHECK-LABEL: define nofpclass(nan) float @ret_maxnum_nonan__noinf ; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(inf) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.maxnum.f32(float %arg0, float %arg1) @@ -116,9 +116,9 @@ define float @ret_maxnum_nonan__noinf(float nofpclass(nan) %arg0, float nofpclas } define float @ret_maxnum_noinf_nonan__nonan(float nofpclass(inf nan) %arg0, float nofpclass(nan) %arg1) #0 { -; CHECK-LABEL: define float @ret_maxnum_noinf_nonan__nonan +; CHECK-LABEL: define nofpclass(nan) float @ret_maxnum_noinf_nonan__nonan ; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.maxnum.f32(float %arg0, float %arg1) @@ -126,9 +126,9 @@ define float @ret_maxnum_noinf_nonan__nonan(float nofpclass(inf nan) %arg0, floa } define float @ret_maxnum_nonan__noinf_nonan(float nofpclass(nan) %arg0, float nofpclass(inf nan) %arg1) #0 { -; CHECK-LABEL: define float @ret_maxnum_nonan__noinf_nonan +; CHECK-LABEL: define nofpclass(nan) float @ret_maxnum_nonan__noinf_nonan ; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.maxnum.f32(float %arg0, float %arg1) @@ -136,9 +136,9 @@ define float @ret_maxnum_nonan__noinf_nonan(float nofpclass(nan) %arg0, float no } define float @ret_maxnum_norm_zero__norm_sub(float nofpclass(norm zero) %arg0, float nofpclass(norm sub) %arg1) #0 { -; CHECK-LABEL: define float @ret_maxnum_norm_zero__norm_sub +; CHECK-LABEL: define nofpclass(norm) float @ret_maxnum_norm_zero__norm_sub ; CHECK-SAME: (float nofpclass(zero norm) [[ARG0:%.*]], float nofpclass(sub norm) [[ARG1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(norm) float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.maxnum.f32(float %arg0, float %arg1) @@ -175,9 +175,9 @@ define float @ret_minnum_dynamic_dynamic(float %arg0, float %arg1) #3 { } define float @ret_minnum_noinf_nozero__noinf_nozero(float nofpclass(inf zero) %arg0, float nofpclass(inf zero) %arg1) #1 { -; CHECK-LABEL: define float @ret_minnum_noinf_nozero__noinf_nozero +; CHECK-LABEL: define nofpclass(inf zero) float @ret_minnum_noinf_nozero__noinf_nozero ; CHECK-SAME: (float nofpclass(inf zero) [[ARG0:%.*]], float nofpclass(inf zero) [[ARG1:%.*]]) #[[ATTR2]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf zero) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -185,9 +185,9 @@ define float @ret_minnum_noinf_nozero__noinf_nozero(float nofpclass(inf zero) %a } define <2 x float> @ret_minnum_noinf_nozero__noinf_nozero_v2f32(<2 x float> nofpclass(inf zero) %arg0, <2 x float> nofpclass(inf zero) %arg1) #1 { -; CHECK-LABEL: define <2 x float> @ret_minnum_noinf_nozero__noinf_nozero_v2f32 +; CHECK-LABEL: define nofpclass(inf zero) <2 x float> @ret_minnum_noinf_nozero__noinf_nozero_v2f32 ; CHECK-SAME: (<2 x float> nofpclass(inf zero) [[ARG0:%.*]], <2 x float> nofpclass(inf zero) [[ARG1:%.*]]) #[[ATTR2]] { -; CHECK-NEXT: [[CALL:%.*]] = call <2 x float> @llvm.minnum.v2f32(<2 x float> [[ARG0]], <2 x float> [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf zero) <2 x float> @llvm.minnum.v2f32(<2 x float> [[ARG0]], <2 x float> [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret <2 x float> [[CALL]] ; %call = call <2 x float> @llvm.minnum.v2f32(<2 x float> %arg0, <2 x float> %arg1) @@ -195,9 +195,9 @@ define <2 x float> @ret_minnum_noinf_nozero__noinf_nozero_v2f32(<2 x float> nofp } define float @ret_minnum_daz_daz_nozero__nozero(float nofpclass(zero) %arg0, float nofpclass(zero) %arg1) #1 { -; CHECK-LABEL: define float @ret_minnum_daz_daz_nozero__nozero +; CHECK-LABEL: define nofpclass(zero) float @ret_minnum_daz_daz_nozero__nozero ; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR2]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(zero) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -205,9 +205,9 @@ define float @ret_minnum_daz_daz_nozero__nozero(float nofpclass(zero) %arg0, flo } define float @ret_minnum_dapz_dapz_nozero__nozero(float nofpclass(zero) %arg0, float nofpclass(zero) %arg1) #2 { -; CHECK-LABEL: define float @ret_minnum_dapz_dapz_nozero__nozero +; CHECK-LABEL: define nofpclass(zero) float @ret_minnum_dapz_dapz_nozero__nozero ; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR3]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(zero) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -215,9 +215,9 @@ define float @ret_minnum_dapz_dapz_nozero__nozero(float nofpclass(zero) %arg0, f } define float @ret_minnum_dynamic_dynamic_nozero__nozero(float nofpclass(zero) %arg0, float nofpclass(zero) %arg1) #3 { -; CHECK-LABEL: define float @ret_minnum_dynamic_dynamic_nozero__nozero +; CHECK-LABEL: define nofpclass(zero) float @ret_minnum_dynamic_dynamic_nozero__nozero ; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR4]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(zero) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -225,9 +225,9 @@ define float @ret_minnum_dynamic_dynamic_nozero__nozero(float nofpclass(zero) %a } define float @ret_minnum_daz_daz_nozero_nosub__nozero_nosub(float nofpclass(zero sub) %arg0, float nofpclass(zero sub) %arg1) #1 { -; CHECK-LABEL: define float @ret_minnum_daz_daz_nozero_nosub__nozero_nosub +; CHECK-LABEL: define nofpclass(zero sub) float @ret_minnum_daz_daz_nozero_nosub__nozero_nosub ; CHECK-SAME: (float nofpclass(zero sub) [[ARG0:%.*]], float nofpclass(zero sub) [[ARG1:%.*]]) #[[ATTR2]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(zero sub) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -235,9 +235,9 @@ define float @ret_minnum_daz_daz_nozero_nosub__nozero_nosub(float nofpclass(zero } define float @ret_minnum_dynamic_dynamic_nozero_nosub__nozero_nosub(float nofpclass(zero sub) %arg0, float nofpclass(zero sub) %arg1) #3 { -; CHECK-LABEL: define float @ret_minnum_dynamic_dynamic_nozero_nosub__nozero_nosub +; CHECK-LABEL: define nofpclass(zero sub) float @ret_minnum_dynamic_dynamic_nozero_nosub__nozero_nosub ; CHECK-SAME: (float nofpclass(zero sub) [[ARG0:%.*]], float nofpclass(zero sub) [[ARG1:%.*]]) #[[ATTR4]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(zero sub) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -265,9 +265,9 @@ define float @ret_minnum_daz_daz_nonzero__nonzero(float nofpclass(nzero) %arg0, } define float @ret_minnum_daz_daz_nonzero_nonsub__nonzero_nonsub(float nofpclass(nzero nsub) %arg0, float nofpclass(nzero nsub) %arg1) #1 { -; CHECK-LABEL: define float @ret_minnum_daz_daz_nonzero_nonsub__nonzero_nonsub +; CHECK-LABEL: define nofpclass(nsub) float @ret_minnum_daz_daz_nonzero_nonsub__nonzero_nonsub ; CHECK-SAME: (float nofpclass(nzero nsub) [[ARG0:%.*]], float nofpclass(nzero nsub) [[ARG1:%.*]]) #[[ATTR2]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nsub) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -285,9 +285,9 @@ define float @ret_minnum_dapz_dapz_nopzero__nopzero(float nofpclass(pzero) %arg0 } define float @ret_minnum_dapz_dapz_nopzero_nopsub__nopzero_nopsub(float nofpclass(pzero psub) %arg0, float nofpclass(pzero psub) %arg1) #2 { -; CHECK-LABEL: define float @ret_minnum_dapz_dapz_nopzero_nopsub__nopzero_nopsub +; CHECK-LABEL: define nofpclass(psub) float @ret_minnum_dapz_dapz_nopzero_nopsub__nopzero_nopsub ; CHECK-SAME: (float nofpclass(pzero psub) [[ARG0:%.*]], float nofpclass(pzero psub) [[ARG1:%.*]]) #[[ATTR3]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(psub) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -305,9 +305,9 @@ define float @ret_minnum_dapz_dapz_nonzero__nonzero(float nofpclass(nzero) %arg0 } define float @ret_minnum_ieee_daz_nozero__nozero(float nofpclass(zero) %arg0, float nofpclass(zero) %arg1) #4 { -; CHECK-LABEL: define float @ret_minnum_ieee_daz_nozero__nozero +; CHECK-LABEL: define nofpclass(zero) float @ret_minnum_ieee_daz_nozero__nozero ; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR5:[0-9]+]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(zero) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -315,9 +315,9 @@ define float @ret_minnum_ieee_daz_nozero__nozero(float nofpclass(zero) %arg0, fl } define float @ret_minnum_daz_ieee_nozero__nozero(float nofpclass(zero) %arg0, float nofpclass(zero) %arg1) #5 { -; CHECK-LABEL: define float @ret_minnum_daz_ieee_nozero__nozero +; CHECK-LABEL: define nofpclass(zero) float @ret_minnum_daz_ieee_nozero__nozero ; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR6:[0-9]+]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(zero) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -325,9 +325,9 @@ define float @ret_minnum_daz_ieee_nozero__nozero(float nofpclass(zero) %arg0, fl } define float @ret_minnum_ieee_dapz_nozero__nozero(float nofpclass(zero) %arg0, float nofpclass(zero) %arg1) #6 { -; CHECK-LABEL: define float @ret_minnum_ieee_dapz_nozero__nozero +; CHECK-LABEL: define nofpclass(zero) float @ret_minnum_ieee_dapz_nozero__nozero ; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR7:[0-9]+]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(zero) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -335,9 +335,9 @@ define float @ret_minnum_ieee_dapz_nozero__nozero(float nofpclass(zero) %arg0, f } define float @ret_minnum_dapz_ieee_nozero__nozero(float nofpclass(zero) %arg0, float nofpclass(zero) %arg1) #7 { -; CHECK-LABEL: define float @ret_minnum_dapz_ieee_nozero__nozero +; CHECK-LABEL: define nofpclass(zero) float @ret_minnum_dapz_ieee_nozero__nozero ; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR8:[0-9]+]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(zero) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -345,9 +345,9 @@ define float @ret_minnum_dapz_ieee_nozero__nozero(float nofpclass(zero) %arg0, f } define float @ret_minnum_noneg_nan__any(float nofpclass(ninf nsub nnorm nan) %arg0, float %arg1) #3 { -; CHECK-LABEL: define float @ret_minnum_noneg_nan__any +; CHECK-LABEL: define nofpclass(nan) float @ret_minnum_noneg_nan__any ; CHECK-SAME: (float nofpclass(nan ninf nsub nnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR4]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -355,9 +355,9 @@ define float @ret_minnum_noneg_nan__any(float nofpclass(ninf nsub nnorm nan) %ar } define float @ret_minnum_any__noneg_nan(float %arg0, float nofpclass(ninf nsub nnorm nan) %arg1) #3 { -; CHECK-LABEL: define float @ret_minnum_any__noneg_nan +; CHECK-LABEL: define nofpclass(nan) float @ret_minnum_any__noneg_nan ; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(nan ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR4]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -365,9 +365,9 @@ define float @ret_minnum_any__noneg_nan(float %arg0, float nofpclass(ninf nsub n } define float @ret_minnum_nopos_nan__any(float nofpclass(pinf psub pnorm nan) %arg0, float %arg1) #3 { -; CHECK-LABEL: define float @ret_minnum_nopos_nan__any +; CHECK-LABEL: define nofpclass(nan) float @ret_minnum_nopos_nan__any ; CHECK-SAME: (float nofpclass(nan pinf psub pnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR4]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -375,9 +375,9 @@ define float @ret_minnum_nopos_nan__any(float nofpclass(pinf psub pnorm nan) %ar } define float @ret_minnum_any__nopos_nan(float %arg0, float nofpclass(pinf psub pnorm nan) %arg1) #3 { -; CHECK-LABEL: define float @ret_minnum_any__nopos_nan +; CHECK-LABEL: define nofpclass(nan) float @ret_minnum_any__nopos_nan ; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(nan pinf psub pnorm) [[ARG1:%.*]]) #[[ATTR4]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.minnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.minnum.f32(float %arg0, float %arg1) @@ -425,9 +425,9 @@ define float @ret_minnum_any__nopos(float %arg0, float nofpclass(pinf psub pnorm } define float @ret_maxnum_noneg_nan__any(float nofpclass(ninf nsub nnorm nan) %arg0, float %arg1) #3 { -; CHECK-LABEL: define float @ret_maxnum_noneg_nan__any +; CHECK-LABEL: define nofpclass(nan) float @ret_maxnum_noneg_nan__any ; CHECK-SAME: (float nofpclass(nan ninf nsub nnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR4]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.maxnum.f32(float %arg0, float %arg1) @@ -435,9 +435,9 @@ define float @ret_maxnum_noneg_nan__any(float nofpclass(ninf nsub nnorm nan) %ar } define float @ret_maxnum_any__noneg_nan(float %arg0, float nofpclass(ninf nsub nnorm nan) %arg1) #3 { -; CHECK-LABEL: define float @ret_maxnum_any__noneg_nan +; CHECK-LABEL: define nofpclass(nan) float @ret_maxnum_any__noneg_nan ; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(nan ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR4]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.maxnum.f32(float %arg0, float %arg1) @@ -445,9 +445,9 @@ define float @ret_maxnum_any__noneg_nan(float %arg0, float nofpclass(ninf nsub n } define float @ret_maxnum_nopos_nan__any(float nofpclass(pinf psub pnorm nan) %arg0, float %arg1) #3 { -; CHECK-LABEL: define float @ret_maxnum_nopos_nan__any +; CHECK-LABEL: define nofpclass(nan) float @ret_maxnum_nopos_nan__any ; CHECK-SAME: (float nofpclass(nan pinf psub pnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR4]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.maxnum.f32(float %arg0, float %arg1) @@ -455,9 +455,9 @@ define float @ret_maxnum_nopos_nan__any(float nofpclass(pinf psub pnorm nan) %ar } define float @ret_maxnum_any__nopos_nan(float %arg0, float nofpclass(pinf psub pnorm nan) %arg1) #3 { -; CHECK-LABEL: define float @ret_maxnum_any__nopos_nan +; CHECK-LABEL: define nofpclass(nan) float @ret_maxnum_any__nopos_nan ; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(nan pinf psub pnorm) [[ARG1:%.*]]) #[[ATTR4]] { -; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] +; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.maxnum.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR9]] ; CHECK-NEXT: ret float [[CALL]] ; %call = call float @llvm.maxnum.f32(float %arg0, float %arg1)