https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/173898
>From d72a2f9fc943bb42bb2616c29f9de0b4c0a6c5e0 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <[email protected]> Date: Mon, 29 Dec 2025 15:28:20 +0100 Subject: [PATCH] InstCombine: Introduce nsz flag on minimum/maximum in SimplifyDemandedFPClass Alive isn't particularly happy with this in the case where one of the inputs could be zero, but I think it's wrong: https://alive2.llvm.org/ce/z/dF7V6k nsz shouldn't permit introducing a -0 result where there wasn't one in the input here. --- .../InstCombineSimplifyDemanded.cpp | 20 ++++++- .../simplify-demanded-fpclass-maximum.ll | 60 +++++++++---------- .../simplify-demanded-fpclass-minimum.ll | 60 +++++++++---------- 3 files changed, 78 insertions(+), 62 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 2ae9221a00cbd..a93a2090eb74b 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -2191,9 +2191,25 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V, auto *FPOp = cast<FPMathOperator>(CI); bool ChangedFlags = false; + if (!FPOp->hasNoSignedZeros()) { + // Add NSZ flag if we know the result will not be sensitive on the sign + // of 0. + FPClassTest ZeroMask = fcZero; + + if (Mode != DenormalMode::getIEEE()) + ZeroMask |= fcSubnormal; + + bool ResultNotLogical0 = (ValidResults & ZeroMask) == fcNone; + if (ResultNotLogical0 || + ((KnownLHS.isKnownNeverLogicalNegZero(Mode) || + KnownRHS.isKnownNeverLogicalPosZero(Mode)) && + (KnownLHS.isKnownNeverLogicalPosZero(Mode) || + KnownRHS.isKnownNeverLogicalNegZero(Mode)))) { + CI->setHasNoSignedZeros(true); + ChangedFlags = true; + } + } - // TODO: Add NSZ flag if we know the result will not be sensitive on the - // sign of 0. if (!FPOp->hasNoNaNs() && (ValidResults & fcNan) == fcNone) { CI->setHasNoNaNs(true); ChangedFlags = true; diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll index 10bf1c89e9a51..8d037967b3417 100644 --- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll +++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll @@ -43,7 +43,7 @@ define nofpclass(inf norm sub zero) float @ret_only_nan(float %x, float %y) { define nofpclass(inf norm sub zero qnan) float @ret_only_snan(float %x, float %y) { ; CHECK-LABEL: define nofpclass(qnan inf zero sub norm) float @ret_only_snan( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[X]], float [[Y]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %x, float %y) @@ -53,7 +53,7 @@ define nofpclass(inf norm sub zero qnan) float @ret_only_snan(float %x, float %y define nofpclass(inf norm sub zero snan) float @ret_only_qnan(float %x, float %y) { ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float @ret_only_qnan( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[X]], float [[Y]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %x, float %y) @@ -63,7 +63,7 @@ define nofpclass(inf norm sub zero snan) float @ret_only_qnan(float %x, float %y define nofpclass(nan norm sub zero) float @ret_only_inf(float %x, float %y) { ; CHECK-LABEL: define nofpclass(nan zero sub norm) float @ret_only_inf( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.maximum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nnan nsz float @llvm.maximum.f32(float [[X]], float [[Y]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %x, float %y) @@ -373,7 +373,7 @@ define nofpclass(snan) float @cannot_fold_negative_or_zero__positive_or_zero_1() define nofpclass(nsub) float @lhs_must_be_pinf_or_nan(float %unknown, float nofpclass(ninf norm zero sub) %must.be.pinf.or.nan) { ; CHECK-LABEL: define nofpclass(nsub) float @lhs_must_be_pinf_or_nan( ; CHECK-SAME: float [[UNKNOWN:%.*]], float nofpclass(ninf zero sub norm) [[MUST_BE_PINF_OR_NAN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[MUST_BE_PINF_OR_NAN]], float [[UNKNOWN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[MUST_BE_PINF_OR_NAN]], float [[UNKNOWN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %must.be.pinf.or.nan, float %unknown) @@ -383,7 +383,7 @@ define nofpclass(nsub) float @lhs_must_be_pinf_or_nan(float %unknown, float nofp define nofpclass(nsub) float @rhs_must_be_pinf_or_nan(float nofpclass(ninf norm zero sub) %must.be.pinf.or.nan, float %unknown) { ; CHECK-LABEL: define nofpclass(nsub) float @rhs_must_be_pinf_or_nan( ; CHECK-SAME: float nofpclass(ninf zero sub norm) [[MUST_BE_PINF_OR_NAN:%.*]], float [[UNKNOWN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[UNKNOWN]], float [[MUST_BE_PINF_OR_NAN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[UNKNOWN]], float [[MUST_BE_PINF_OR_NAN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %unknown, float %must.be.pinf.or.nan) @@ -393,7 +393,7 @@ define nofpclass(nsub) float @rhs_must_be_pinf_or_nan(float nofpclass(ninf norm define nofpclass(nsub) float @lhs_must_be_pinf(float %unknown, float nofpclass(nan ninf norm zero sub) %must.be.pinf) { ; CHECK-LABEL: define nofpclass(nsub) float @lhs_must_be_pinf( ; CHECK-SAME: float [[UNKNOWN:%.*]], float nofpclass(nan ninf zero sub norm) [[MUST_BE_PINF:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[UNKNOWN]], float 0x7FF0000000000000) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[UNKNOWN]], float 0x7FF0000000000000) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %must.be.pinf, float %unknown) @@ -403,7 +403,7 @@ define nofpclass(nsub) float @lhs_must_be_pinf(float %unknown, float nofpclass(n define nofpclass(nsub) float @rhs_must_be_pinf(float nofpclass(nan ninf norm zero sub) %must.be.pinf, float %unknown) { ; CHECK-LABEL: define nofpclass(nsub) float @rhs_must_be_pinf( ; CHECK-SAME: float nofpclass(nan ninf zero sub norm) [[MUST_BE_PINF:%.*]], float [[UNKNOWN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[UNKNOWN]], float 0x7FF0000000000000) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[UNKNOWN]], float 0x7FF0000000000000) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %unknown, float %must.be.pinf) @@ -433,7 +433,7 @@ define nofpclass(nsub) float @rhs_must_be_pinf_lhs_non_nan(float nofpclass(nan n define nofpclass(nsub) float @lhs_must_be_ninf_or_nan(float %unknown, float nofpclass(pinf norm zero sub) %must.be.ninf.or.nan) { ; CHECK-LABEL: define nofpclass(nsub) float @lhs_must_be_ninf_or_nan( ; CHECK-SAME: float [[UNKNOWN:%.*]], float nofpclass(pinf zero sub norm) [[MUST_BE_NINF_OR_NAN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[MUST_BE_NINF_OR_NAN]], float [[UNKNOWN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[MUST_BE_NINF_OR_NAN]], float [[UNKNOWN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %must.be.ninf.or.nan, float %unknown) @@ -443,7 +443,7 @@ define nofpclass(nsub) float @lhs_must_be_ninf_or_nan(float %unknown, float nofp define nofpclass(nsub) float @rhs_must_be_ninf_or_nan(float nofpclass(pinf norm zero sub) %must.be.ninf.or.nan, float %unknown) { ; CHECK-LABEL: define nofpclass(nsub) float @rhs_must_be_ninf_or_nan( ; CHECK-SAME: float nofpclass(pinf zero sub norm) [[MUST_BE_NINF_OR_NAN:%.*]], float [[UNKNOWN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[UNKNOWN]], float [[MUST_BE_NINF_OR_NAN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[UNKNOWN]], float [[MUST_BE_NINF_OR_NAN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %unknown, float %must.be.ninf.or.nan) @@ -512,7 +512,7 @@ define nofpclass(pzero) float @result_not_pzero(float %unknown0, float %unknown1 define nofpclass(zero) float @result_not_zero(float %unknown0, float %unknown1) { ; CHECK-LABEL: define nofpclass(zero) float @result_not_zero( ; CHECK-SAME: float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %unknown0, float %unknown1) @@ -542,7 +542,7 @@ define nofpclass(zero) float @result_not_zero__dynamic(float %unknown0, float %u define nofpclass(zero) float @result_not_zero_or_sub(float %unknown0, float %unknown1) { ; CHECK-LABEL: define nofpclass(zero) float @result_not_zero_or_sub( ; CHECK-SAME: float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %unknown0, float %unknown1) @@ -552,7 +552,7 @@ define nofpclass(zero) float @result_not_zero_or_sub(float %unknown0, float %unk define nofpclass(zero sub) float @result_not_zero_or_sub__daz(float %unknown0, float %unknown1) #0 { ; CHECK-LABEL: define nofpclass(zero sub) float @result_not_zero_or_sub__daz( ; CHECK-SAME: float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %unknown0, float %unknown1) @@ -562,7 +562,7 @@ define nofpclass(zero sub) float @result_not_zero_or_sub__daz(float %unknown0, f define nofpclass(zero sub) float @result_not_zero_or_sub__dynamic(float %unknown0, float %unknown1) #1 { ; CHECK-LABEL: define nofpclass(zero sub) float @result_not_zero_or_sub__dynamic( ; CHECK-SAME: float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %unknown0, float %unknown1) @@ -572,7 +572,7 @@ define nofpclass(zero sub) float @result_not_zero_or_sub__dynamic(float %unknown define nofpclass(snan) float @lhs_not_zero(float nofpclass(zero) %not.zero, float %unknown) { ; CHECK-LABEL: define nofpclass(snan) float @lhs_not_zero( ; CHECK-SAME: float nofpclass(zero) [[NOT_ZERO:%.*]], float [[UNKNOWN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[NOT_ZERO]], float [[UNKNOWN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[NOT_ZERO]], float [[UNKNOWN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %not.zero, float %unknown) @@ -582,7 +582,7 @@ define nofpclass(snan) float @lhs_not_zero(float nofpclass(zero) %not.zero, floa define nofpclass(snan) float @rhs_not_zero(float %unknown, float nofpclass(zero) %not.zero) { ; CHECK-LABEL: define nofpclass(snan) float @rhs_not_zero( ; CHECK-SAME: float [[UNKNOWN:%.*]], float nofpclass(zero) [[NOT_ZERO:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[UNKNOWN]], float [[NOT_ZERO]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[UNKNOWN]], float [[NOT_ZERO]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %unknown, float %not.zero) @@ -592,7 +592,7 @@ define nofpclass(snan) float @rhs_not_zero(float %unknown, float nofpclass(zero) define nofpclass(snan) float @sources_not_zero(float nofpclass(zero) %not.zero0, float nofpclass(zero) %not.zero1) { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_zero( ; CHECK-SAME: float nofpclass(zero) [[NOT_ZERO0:%.*]], float nofpclass(zero) [[NOT_ZERO1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[NOT_ZERO0]], float [[NOT_ZERO1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[NOT_ZERO0]], float [[NOT_ZERO1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %not.zero0, float %not.zero1) @@ -612,7 +612,7 @@ define nofpclass(snan) float @sources_not_zero__daz(float nofpclass(zero) %not.z define nofpclass(snan) float @sources_not_zero__dynamic(float nofpclass(zero) %not.zero0, float nofpclass(zero) %not.zero1) #2 { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_zero__dynamic( ; CHECK-SAME: float nofpclass(zero) [[NOT_ZERO0:%.*]], float nofpclass(zero) [[NOT_ZERO1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[NOT_ZERO0]], float [[NOT_ZERO1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[NOT_ZERO0]], float [[NOT_ZERO1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %not.zero0, float %not.zero1) @@ -622,7 +622,7 @@ define nofpclass(snan) float @sources_not_zero__dynamic(float nofpclass(zero) %n define nofpclass(snan) float @sources_not_zero_or_sub(float nofpclass(zero sub) %not.zero.sub.0, float nofpclass(zero sub) %not.zero.sub.1) { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_zero_or_sub( ; CHECK-SAME: float nofpclass(zero sub) [[NOT_ZERO_SUB_0:%.*]], float nofpclass(zero sub) [[NOT_ZERO_SUB_1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %not.zero.sub.0, float %not.zero.sub.1) @@ -632,7 +632,7 @@ define nofpclass(snan) float @sources_not_zero_or_sub(float nofpclass(zero sub) define nofpclass(snan) float @sources_not_zero_or_sub__daz(float nofpclass(zero sub) %not.zero.sub.0, float nofpclass(zero sub) %not.zero.sub.1) #1 { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_zero_or_sub__daz( ; CHECK-SAME: float nofpclass(zero sub) [[NOT_ZERO_SUB_0:%.*]], float nofpclass(zero sub) [[NOT_ZERO_SUB_1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %not.zero.sub.0, float %not.zero.sub.1) @@ -642,7 +642,7 @@ define nofpclass(snan) float @sources_not_zero_or_sub__daz(float nofpclass(zero define nofpclass(snan) float @sources_not_zero_or_sub__dynamic(float nofpclass(zero sub) %not.zero.sub.0, float nofpclass(zero sub) %not.zero.sub.1) #2 { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_zero_or_sub__dynamic( ; CHECK-SAME: float nofpclass(zero sub) [[NOT_ZERO_SUB_0:%.*]], float nofpclass(zero sub) [[NOT_ZERO_SUB_1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %not.zero.sub.0, float %not.zero.sub.1) @@ -652,7 +652,7 @@ define nofpclass(snan) float @sources_not_zero_or_sub__dynamic(float nofpclass(z define nofpclass(snan) float @sources_not_nzero(float nofpclass(nzero) %not.nzero0, float nofpclass(nzero) %not.nzero1) { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_nzero( ; CHECK-SAME: float nofpclass(nzero) [[NOT_NZERO0:%.*]], float nofpclass(nzero) [[NOT_NZERO1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[NOT_NZERO0]], float [[NOT_NZERO1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[NOT_NZERO0]], float [[NOT_NZERO1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %not.nzero0, float %not.nzero1) @@ -662,7 +662,7 @@ define nofpclass(snan) float @sources_not_nzero(float nofpclass(nzero) %not.nzer define nofpclass(snan) float @sources_not_pzero(float nofpclass(pzero) %not.pzero0, float nofpclass(pzero) %not.pzero1) { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_pzero( ; CHECK-SAME: float nofpclass(pzero) [[NOT_PZERO0:%.*]], float nofpclass(pzero) [[NOT_PZERO1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[NOT_PZERO0]], float [[NOT_PZERO1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[NOT_PZERO0]], float [[NOT_PZERO1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %not.pzero0, float %not.pzero1) @@ -732,7 +732,7 @@ define nofpclass(snan) float @rhs_not_nzero_lhs_not_pzero__dynamic(float nofpcla define nofpclass(snan) float @sources_not_nzero_nsub__dynamic(float nofpclass(nzero nsub) %not.nzero0, float nofpclass(nzero nsub) %not.nzero1) #1 { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_nzero_nsub__dynamic( ; CHECK-SAME: float nofpclass(nzero nsub) [[NOT_NZERO0:%.*]], float nofpclass(nzero nsub) [[NOT_NZERO1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[NOT_NZERO0]], float [[NOT_NZERO1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[NOT_NZERO0]], float [[NOT_NZERO1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.maximum.f32(float %not.nzero0, float %not.nzero1) @@ -925,7 +925,7 @@ define nofpclass(snan) float @known_positive__maximum__only_pzero() { ; CHECK-LABEL: define nofpclass(snan) float @known_positive__maximum__only_pzero() { ; CHECK-NEXT: [[KNOWN_POSITIVE:%.*]] = call float @returns_positive() ; CHECK-NEXT: [[KNOWN_PZERO:%.*]] = call float @returns_pzero() -; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.maximum.f32(float [[KNOWN_POSITIVE]], float 0.000000e+00) +; CHECK-NEXT: [[RESULT:%.*]] = call nnan nsz float @llvm.maximum.f32(float [[KNOWN_POSITIVE]], float 0.000000e+00) ; CHECK-NEXT: ret float [[RESULT]] ; %known.positive = call float @returns_positive() @@ -938,7 +938,7 @@ define nofpclass(snan) float @only_pzero__maximum__known_positive() { ; CHECK-LABEL: define nofpclass(snan) float @only_pzero__maximum__known_positive() { ; CHECK-NEXT: [[KNOWN_PZERO:%.*]] = call float @returns_pzero() ; CHECK-NEXT: [[KNOWN_POSITIVE:%.*]] = call float @returns_positive() -; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.maximum.f32(float [[KNOWN_POSITIVE]], float 0.000000e+00) +; CHECK-NEXT: [[RESULT:%.*]] = call nnan nsz float @llvm.maximum.f32(float [[KNOWN_POSITIVE]], float 0.000000e+00) ; CHECK-NEXT: ret float [[RESULT]] ; %known.pzero = call float @returns_pzero() @@ -1027,7 +1027,7 @@ define nofpclass(snan) float @known_negative__maximum__only_nzero_or_nan() { ; CHECK-LABEL: define nofpclass(snan) float @known_negative__maximum__only_nzero_or_nan() { ; CHECK-NEXT: [[KNOWN_NEGATIVE:%.*]] = call float @returns_negative() ; CHECK-NEXT: [[KNOWN_NZERO_OR_NAN:%.*]] = call float @returns_nzero_or_nan() -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[KNOWN_NEGATIVE]], float [[KNOWN_NZERO_OR_NAN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[KNOWN_NEGATIVE]], float [[KNOWN_NZERO_OR_NAN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %known.negative = call float @returns_negative() @@ -1040,7 +1040,7 @@ define nofpclass(snan) float @only_nzero_or_nan__maximum__known_negative() { ; CHECK-LABEL: define nofpclass(snan) float @only_nzero_or_nan__maximum__known_negative() { ; CHECK-NEXT: [[KNOWN_NZERO_OR_NAN:%.*]] = call float @returns_nzero_or_nan() ; CHECK-NEXT: [[KNOWN_NEGATIVE:%.*]] = call float @returns_negative() -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[KNOWN_NZERO_OR_NAN]], float [[KNOWN_NEGATIVE]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[KNOWN_NZERO_OR_NAN]], float [[KNOWN_NEGATIVE]]) ; CHECK-NEXT: ret float [[RESULT]] ; %known.nzero.or.nan = call float @returns_nzero_or_nan() @@ -1130,7 +1130,7 @@ define nofpclass(pinf pnorm psub) float @ret_always_positive_nonzero__maximum__n ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(zero) [[NOT_ZERO:%.*]]) { ; CHECK-NEXT: [[ALWAYS_POSITIVE:%.*]] = call float @returns_positive() ; CHECK-NEXT: [[SELECT_RHS:%.*]] = select i1 [[COND]], float [[ALWAYS_POSITIVE]], float [[UNKNOWN]] -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[NOT_ZERO]], float [[SELECT_RHS]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[NOT_ZERO]], float [[SELECT_RHS]]) ; CHECK-NEXT: ret float [[RESULT]] ; %always.positive = call float @returns_positive() @@ -1144,7 +1144,7 @@ define nofpclass(pinf pnorm psub) float @ret_always_positive_nonzero__maximum__n ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(zero) [[NOT_ZERO:%.*]]) { ; CHECK-NEXT: [[ALWAYS_NEGATIVE:%.*]] = call float @returns_negative() ; CHECK-NEXT: [[SELECT_RHS:%.*]] = select i1 [[COND]], float [[ALWAYS_NEGATIVE]], float [[UNKNOWN]] -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[NOT_ZERO]], float [[SELECT_RHS]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[NOT_ZERO]], float [[SELECT_RHS]]) ; CHECK-NEXT: ret float [[RESULT]] ; %always.negative = call float @returns_negative() @@ -1157,7 +1157,7 @@ define nofpclass(snan) float @known_positive__maximum__only_pzero_or_nan() { ; CHECK-LABEL: define nofpclass(snan) float @known_positive__maximum__only_pzero_or_nan() { ; CHECK-NEXT: [[KNOWN_POSITIVE:%.*]] = call float @returns_positive() ; CHECK-NEXT: [[KNOWN_PZERO_OR_NAN:%.*]] = call float @returns_pzero_or_nan() -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[KNOWN_POSITIVE]], float [[KNOWN_PZERO_OR_NAN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float [[KNOWN_POSITIVE]], float [[KNOWN_PZERO_OR_NAN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %known.positive = call float @returns_positive() diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll index 797872e172a24..3c981ff3b09d1 100644 --- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll +++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll @@ -43,7 +43,7 @@ define nofpclass(inf norm sub zero) float @ret_only_nan(float %x, float %y) { define nofpclass(inf norm sub zero qnan) float @ret_only_snan(float %x, float %y) { ; CHECK-LABEL: define nofpclass(qnan inf zero sub norm) float @ret_only_snan( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[X]], float [[Y]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %x, float %y) @@ -53,7 +53,7 @@ define nofpclass(inf norm sub zero qnan) float @ret_only_snan(float %x, float %y define nofpclass(inf norm sub zero snan) float @ret_only_qnan(float %x, float %y) { ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float @ret_only_qnan( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[X]], float [[Y]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %x, float %y) @@ -63,7 +63,7 @@ define nofpclass(inf norm sub zero snan) float @ret_only_qnan(float %x, float %y define nofpclass(nan norm sub zero) float @ret_only_inf(float %x, float %y) { ; CHECK-LABEL: define nofpclass(nan zero sub norm) float @ret_only_inf( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.minimum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nnan nsz float @llvm.minimum.f32(float [[X]], float [[Y]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %x, float %y) @@ -375,7 +375,7 @@ define nofpclass(snan) float @cannot_fold_negative_or_zero__positive_or_zero_1() define nofpclass(nsub) float @lhs_must_be_pinf_or_nan(float %unknown, float nofpclass(ninf norm zero sub) %must.be.pinf.or.nan) { ; CHECK-LABEL: define nofpclass(nsub) float @lhs_must_be_pinf_or_nan( ; CHECK-SAME: float [[UNKNOWN:%.*]], float nofpclass(ninf zero sub norm) [[MUST_BE_PINF_OR_NAN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[MUST_BE_PINF_OR_NAN]], float [[UNKNOWN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[MUST_BE_PINF_OR_NAN]], float [[UNKNOWN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %must.be.pinf.or.nan, float %unknown) @@ -385,7 +385,7 @@ define nofpclass(nsub) float @lhs_must_be_pinf_or_nan(float %unknown, float nofp define nofpclass(nsub) float @rhs_must_be_pinf_or_nan(float nofpclass(ninf norm zero sub) %must.be.pinf.or.nan, float %unknown) { ; CHECK-LABEL: define nofpclass(nsub) float @rhs_must_be_pinf_or_nan( ; CHECK-SAME: float nofpclass(ninf zero sub norm) [[MUST_BE_PINF_OR_NAN:%.*]], float [[UNKNOWN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[UNKNOWN]], float [[MUST_BE_PINF_OR_NAN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[UNKNOWN]], float [[MUST_BE_PINF_OR_NAN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %unknown, float %must.be.pinf.or.nan) @@ -433,7 +433,7 @@ define nofpclass(nsub) float @rhs_must_be_pinf_lhs_non_nan(float nofpclass(nan n define nofpclass(nsub) float @lhs_must_be_ninf_or_nan(float %unknown, float nofpclass(pinf norm zero sub) %must.be.ninf.or.nan) { ; CHECK-LABEL: define nofpclass(nsub) float @lhs_must_be_ninf_or_nan( ; CHECK-SAME: float [[UNKNOWN:%.*]], float nofpclass(pinf zero sub norm) [[MUST_BE_NINF_OR_NAN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[MUST_BE_NINF_OR_NAN]], float [[UNKNOWN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[MUST_BE_NINF_OR_NAN]], float [[UNKNOWN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %must.be.ninf.or.nan, float %unknown) @@ -443,7 +443,7 @@ define nofpclass(nsub) float @lhs_must_be_ninf_or_nan(float %unknown, float nofp define nofpclass(nsub) float @rhs_must_be_ninf_or_nan(float nofpclass(pinf norm zero sub) %must.be.ninf.or.nan, float %unknown) { ; CHECK-LABEL: define nofpclass(nsub) float @rhs_must_be_ninf_or_nan( ; CHECK-SAME: float nofpclass(pinf zero sub norm) [[MUST_BE_NINF_OR_NAN:%.*]], float [[UNKNOWN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[UNKNOWN]], float [[MUST_BE_NINF_OR_NAN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[UNKNOWN]], float [[MUST_BE_NINF_OR_NAN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %unknown, float %must.be.ninf.or.nan) @@ -453,7 +453,7 @@ define nofpclass(nsub) float @rhs_must_be_ninf_or_nan(float nofpclass(pinf norm define nofpclass(nsub) float @lhs_must_be_ninf(float %unknown, float nofpclass(nan pinf norm zero sub) %must.be.ninf) { ; CHECK-LABEL: define nofpclass(nsub) float @lhs_must_be_ninf( ; CHECK-SAME: float [[UNKNOWN:%.*]], float nofpclass(nan pinf zero sub norm) [[MUST_BE_NINF:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[UNKNOWN]], float 0xFFF0000000000000) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[UNKNOWN]], float 0xFFF0000000000000) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %must.be.ninf, float %unknown) @@ -463,7 +463,7 @@ define nofpclass(nsub) float @lhs_must_be_ninf(float %unknown, float nofpclass(n define nofpclass(nsub) float @rhs_must_be_ninf(float nofpclass(nan pinf norm zero sub) %must.be.ninf, float %unknown) { ; CHECK-LABEL: define nofpclass(nsub) float @rhs_must_be_ninf( ; CHECK-SAME: float nofpclass(nan pinf zero sub norm) [[MUST_BE_NINF:%.*]], float [[UNKNOWN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[UNKNOWN]], float 0xFFF0000000000000) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[UNKNOWN]], float 0xFFF0000000000000) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %unknown, float %must.be.ninf) @@ -514,7 +514,7 @@ define nofpclass(pzero) float @result_not_pzero(float %unknown0, float %unknown1 define nofpclass(zero) float @result_not_zero(float %unknown0, float %unknown1) { ; CHECK-LABEL: define nofpclass(zero) float @result_not_zero( ; CHECK-SAME: float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %unknown0, float %unknown1) @@ -544,7 +544,7 @@ define nofpclass(zero) float @result_not_zero__dynamic(float %unknown0, float %u define nofpclass(zero) float @result_not_zero_or_sub(float %unknown0, float %unknown1) { ; CHECK-LABEL: define nofpclass(zero) float @result_not_zero_or_sub( ; CHECK-SAME: float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %unknown0, float %unknown1) @@ -554,7 +554,7 @@ define nofpclass(zero) float @result_not_zero_or_sub(float %unknown0, float %unk define nofpclass(zero sub) float @result_not_zero_or_sub__daz(float %unknown0, float %unknown1) #0 { ; CHECK-LABEL: define nofpclass(zero sub) float @result_not_zero_or_sub__daz( ; CHECK-SAME: float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %unknown0, float %unknown1) @@ -564,7 +564,7 @@ define nofpclass(zero sub) float @result_not_zero_or_sub__daz(float %unknown0, f define nofpclass(zero sub) float @result_not_zero_or_sub__dynamic(float %unknown0, float %unknown1) #1 { ; CHECK-LABEL: define nofpclass(zero sub) float @result_not_zero_or_sub__dynamic( ; CHECK-SAME: float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[UNKNOWN0]], float [[UNKNOWN1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %unknown0, float %unknown1) @@ -574,7 +574,7 @@ define nofpclass(zero sub) float @result_not_zero_or_sub__dynamic(float %unknown define nofpclass(snan) float @lhs_not_zero(float nofpclass(zero) %not.zero, float %unknown) { ; CHECK-LABEL: define nofpclass(snan) float @lhs_not_zero( ; CHECK-SAME: float nofpclass(zero) [[NOT_ZERO:%.*]], float [[UNKNOWN:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[NOT_ZERO]], float [[UNKNOWN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[NOT_ZERO]], float [[UNKNOWN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %not.zero, float %unknown) @@ -584,7 +584,7 @@ define nofpclass(snan) float @lhs_not_zero(float nofpclass(zero) %not.zero, floa define nofpclass(snan) float @rhs_not_zero(float %unknown, float nofpclass(zero) %not.zero) { ; CHECK-LABEL: define nofpclass(snan) float @rhs_not_zero( ; CHECK-SAME: float [[UNKNOWN:%.*]], float nofpclass(zero) [[NOT_ZERO:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[UNKNOWN]], float [[NOT_ZERO]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[UNKNOWN]], float [[NOT_ZERO]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %unknown, float %not.zero) @@ -594,7 +594,7 @@ define nofpclass(snan) float @rhs_not_zero(float %unknown, float nofpclass(zero) define nofpclass(snan) float @sources_not_zero(float nofpclass(zero) %not.zero0, float nofpclass(zero) %not.zero1) { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_zero( ; CHECK-SAME: float nofpclass(zero) [[NOT_ZERO0:%.*]], float nofpclass(zero) [[NOT_ZERO1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[NOT_ZERO0]], float [[NOT_ZERO1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[NOT_ZERO0]], float [[NOT_ZERO1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %not.zero0, float %not.zero1) @@ -614,7 +614,7 @@ define nofpclass(snan) float @sources_not_zero__daz(float nofpclass(zero) %not.z define nofpclass(snan) float @sources_not_zero__dynamic(float nofpclass(zero) %not.zero0, float nofpclass(zero) %not.zero1) #2 { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_zero__dynamic( ; CHECK-SAME: float nofpclass(zero) [[NOT_ZERO0:%.*]], float nofpclass(zero) [[NOT_ZERO1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[NOT_ZERO0]], float [[NOT_ZERO1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[NOT_ZERO0]], float [[NOT_ZERO1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %not.zero0, float %not.zero1) @@ -624,7 +624,7 @@ define nofpclass(snan) float @sources_not_zero__dynamic(float nofpclass(zero) %n define nofpclass(snan) float @sources_not_zero_or_sub(float nofpclass(zero sub) %not.zero.sub.0, float nofpclass(zero sub) %not.zero.sub.1) { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_zero_or_sub( ; CHECK-SAME: float nofpclass(zero sub) [[NOT_ZERO_SUB_0:%.*]], float nofpclass(zero sub) [[NOT_ZERO_SUB_1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %not.zero.sub.0, float %not.zero.sub.1) @@ -634,7 +634,7 @@ define nofpclass(snan) float @sources_not_zero_or_sub(float nofpclass(zero sub) define nofpclass(snan) float @sources_not_zero_or_sub__daz(float nofpclass(zero sub) %not.zero.sub.0, float nofpclass(zero sub) %not.zero.sub.1) #1 { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_zero_or_sub__daz( ; CHECK-SAME: float nofpclass(zero sub) [[NOT_ZERO_SUB_0:%.*]], float nofpclass(zero sub) [[NOT_ZERO_SUB_1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %not.zero.sub.0, float %not.zero.sub.1) @@ -644,7 +644,7 @@ define nofpclass(snan) float @sources_not_zero_or_sub__daz(float nofpclass(zero define nofpclass(snan) float @sources_not_zero_or_sub__dynamic(float nofpclass(zero sub) %not.zero.sub.0, float nofpclass(zero sub) %not.zero.sub.1) #2 { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_zero_or_sub__dynamic( ; CHECK-SAME: float nofpclass(zero sub) [[NOT_ZERO_SUB_0:%.*]], float nofpclass(zero sub) [[NOT_ZERO_SUB_1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[NOT_ZERO_SUB_0]], float [[NOT_ZERO_SUB_1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %not.zero.sub.0, float %not.zero.sub.1) @@ -654,7 +654,7 @@ define nofpclass(snan) float @sources_not_zero_or_sub__dynamic(float nofpclass(z define nofpclass(snan) float @sources_not_nzero(float nofpclass(nzero) %not.nzero0, float nofpclass(nzero) %not.nzero1) { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_nzero( ; CHECK-SAME: float nofpclass(nzero) [[NOT_NZERO0:%.*]], float nofpclass(nzero) [[NOT_NZERO1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[NOT_NZERO0]], float [[NOT_NZERO1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[NOT_NZERO0]], float [[NOT_NZERO1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %not.nzero0, float %not.nzero1) @@ -664,7 +664,7 @@ define nofpclass(snan) float @sources_not_nzero(float nofpclass(nzero) %not.nzer define nofpclass(snan) float @sources_not_pzero(float nofpclass(pzero) %not.pzero0, float nofpclass(pzero) %not.pzero1) { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_pzero( ; CHECK-SAME: float nofpclass(pzero) [[NOT_PZERO0:%.*]], float nofpclass(pzero) [[NOT_PZERO1:%.*]]) { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[NOT_PZERO0]], float [[NOT_PZERO1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[NOT_PZERO0]], float [[NOT_PZERO1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %not.pzero0, float %not.pzero1) @@ -734,7 +734,7 @@ define nofpclass(snan) float @rhs_not_nzero_lhs_not_pzero__dynamic(float nofpcla define nofpclass(snan) float @sources_not_nzero_nsub__dynamic(float nofpclass(nzero nsub) %not.nzero0, float nofpclass(nzero nsub) %not.nzero1) #1 { ; CHECK-LABEL: define nofpclass(snan) float @sources_not_nzero_nsub__dynamic( ; CHECK-SAME: float nofpclass(nzero nsub) [[NOT_NZERO0:%.*]], float nofpclass(nzero nsub) [[NOT_NZERO1:%.*]]) #[[ATTR1]] { -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[NOT_NZERO0]], float [[NOT_NZERO1]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[NOT_NZERO0]], float [[NOT_NZERO1]]) ; CHECK-NEXT: ret float [[RESULT]] ; %result = call float @llvm.minimum.f32(float %not.nzero0, float %not.nzero1) @@ -1003,7 +1003,7 @@ define nofpclass(snan) float @known_negative__minimum__only_nzero() { ; CHECK-LABEL: define nofpclass(snan) float @known_negative__minimum__only_nzero() { ; CHECK-NEXT: [[KNOWN_NEGATIVE:%.*]] = call float @returns_negative() ; CHECK-NEXT: [[KNOWN_NZERO:%.*]] = call float @returns_nzero() -; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.minimum.f32(float [[KNOWN_NEGATIVE]], float -0.000000e+00) +; CHECK-NEXT: [[RESULT:%.*]] = call nnan nsz float @llvm.minimum.f32(float [[KNOWN_NEGATIVE]], float -0.000000e+00) ; CHECK-NEXT: ret float [[RESULT]] ; %known.negative = call float @returns_negative() @@ -1016,7 +1016,7 @@ define nofpclass(snan) float @only_nzero__minimum__known_negative() { ; CHECK-LABEL: define nofpclass(snan) float @only_nzero__minimum__known_negative() { ; CHECK-NEXT: [[KNOWN_NZERO:%.*]] = call float @returns_nzero() ; CHECK-NEXT: [[KNOWN_NEGATIVE:%.*]] = call float @returns_negative() -; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.minimum.f32(float [[KNOWN_NEGATIVE]], float -0.000000e+00) +; CHECK-NEXT: [[RESULT:%.*]] = call nnan nsz float @llvm.minimum.f32(float [[KNOWN_NEGATIVE]], float -0.000000e+00) ; CHECK-NEXT: ret float [[RESULT]] ; %known.nzero = call float @returns_nzero() @@ -1029,7 +1029,7 @@ define nofpclass(snan) float @known_negative__minimum__only_nzero_or_nan() { ; CHECK-LABEL: define nofpclass(snan) float @known_negative__minimum__only_nzero_or_nan() { ; CHECK-NEXT: [[KNOWN_NEGATIVE:%.*]] = call float @returns_negative() ; CHECK-NEXT: [[KNOWN_NZERO_OR_NAN:%.*]] = call float @returns_nzero_or_nan() -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[KNOWN_NEGATIVE]], float [[KNOWN_NZERO_OR_NAN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[KNOWN_NEGATIVE]], float [[KNOWN_NZERO_OR_NAN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %known.negative = call float @returns_negative() @@ -1042,7 +1042,7 @@ define nofpclass(snan) float @only_nzero_or_nan__minimum__known_negative() { ; CHECK-LABEL: define nofpclass(snan) float @only_nzero_or_nan__minimum__known_negative() { ; CHECK-NEXT: [[KNOWN_NZERO_OR_NAN:%.*]] = call float @returns_nzero_or_nan() ; CHECK-NEXT: [[KNOWN_NEGATIVE:%.*]] = call float @returns_negative() -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[KNOWN_NZERO_OR_NAN]], float [[KNOWN_NEGATIVE]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[KNOWN_NZERO_OR_NAN]], float [[KNOWN_NEGATIVE]]) ; CHECK-NEXT: ret float [[RESULT]] ; %known.nzero.or.nan = call float @returns_nzero_or_nan() @@ -1134,7 +1134,7 @@ define nofpclass(pinf pnorm psub) float @ret_always_positive_nonzero__minimum__n ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(zero) [[NOT_ZERO:%.*]]) { ; CHECK-NEXT: [[ALWAYS_POSITIVE:%.*]] = call float @returns_positive() ; CHECK-NEXT: [[SELECT_RHS:%.*]] = select i1 [[COND]], float [[ALWAYS_POSITIVE]], float [[UNKNOWN]] -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[NOT_ZERO]], float [[SELECT_RHS]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[NOT_ZERO]], float [[SELECT_RHS]]) ; CHECK-NEXT: ret float [[RESULT]] ; %always.positive = call float @returns_positive() @@ -1148,7 +1148,7 @@ define nofpclass(pinf pnorm psub) float @ret_always_positive_nonzero__minimum__n ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(zero) [[NOT_ZERO:%.*]]) { ; CHECK-NEXT: [[ALWAYS_NEGATIVE:%.*]] = call float @returns_negative() ; CHECK-NEXT: [[SELECT_RHS:%.*]] = select i1 [[COND]], float [[ALWAYS_NEGATIVE]], float [[UNKNOWN]] -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[NOT_ZERO]], float [[SELECT_RHS]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[NOT_ZERO]], float [[SELECT_RHS]]) ; CHECK-NEXT: ret float [[RESULT]] ; %always.negative = call float @returns_negative() @@ -1161,7 +1161,7 @@ define nofpclass(snan) float @known_positive__minimum__only_pzero_or_nan() { ; CHECK-LABEL: define nofpclass(snan) float @known_positive__minimum__only_pzero_or_nan() { ; CHECK-NEXT: [[KNOWN_POSITIVE:%.*]] = call float @returns_positive() ; CHECK-NEXT: [[KNOWN_PZERO_OR_NAN:%.*]] = call float @returns_pzero_or_nan() -; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[KNOWN_POSITIVE]], float [[KNOWN_PZERO_OR_NAN]]) +; CHECK-NEXT: [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float [[KNOWN_POSITIVE]], float [[KNOWN_PZERO_OR_NAN]]) ; CHECK-NEXT: ret float [[RESULT]] ; %known.positive = call float @returns_positive() _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
