https://github.com/arsenm updated 
https://github.com/llvm/llvm-project/pull/173898

>From f1624b03545df6f9ce3629abf0350440dc054177 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      | 92 +++++++++----------
 .../simplify-demanded-fpclass-minimum.ll      | 92 +++++++++----------
 3 files changed, 110 insertions(+), 94 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index fef75d925d214..e777c1c7631ee 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2196,9 +2196,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..d3880f03188e3 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()
@@ -1316,7 +1316,7 @@ define nofpclass(snan) float 
@pinf__maximum__unknown(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @pinf__maximum__unknown(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[PINF:%.*]] = call float @returns_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]]
 ;
   %pinf = call float @returns_pinf()
@@ -1328,7 +1328,7 @@ define nofpclass(snan) float 
@unknown__maximum__pinf(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @unknown__maximum__pinf(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[PINF:%.*]] = call float @returns_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]]
 ;
   %pinf = call float @returns_pinf()
@@ -1340,7 +1340,7 @@ define nofpclass(snan) float 
@pinf_or_nan__maximum__unknown(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @pinf_or_nan__maximum__unknown(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[PINF_OR_NAN:%.*]] = call float @returns_pinf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[PINF_OR_NAN]], float [[UNKNOWN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[PINF_OR_NAN]], float [[UNKNOWN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %pinf.or.nan = call float @returns_pinf_or_nan()
@@ -1352,7 +1352,7 @@ define nofpclass(snan) float 
@unknown__maximum__pinf_or_nan(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @unknown__maximum__pinf_or_nan(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[PINF_OR_NAN:%.*]] = call float @returns_pinf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[UNKNOWN]], float [[PINF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[UNKNOWN]], float [[PINF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %pinf.or.nan = call float @returns_pinf_or_nan()
@@ -1386,7 +1386,7 @@ define nofpclass(snan) float 
@ninf_or_nan__maximum__unknown(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @ninf_or_nan__maximum__unknown(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[NINF_OR_NAN:%.*]] = call float @returns_ninf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[NINF_OR_NAN]], float [[UNKNOWN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[NINF_OR_NAN]], float [[UNKNOWN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %ninf.or.nan = call float @returns_ninf_or_nan()
@@ -1398,7 +1398,7 @@ define nofpclass(snan) float 
@unknown__maximum__ninf_or_nan(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @unknown__maximum__ninf_or_nan(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[NINF_OR_NAN:%.*]] = call float @returns_ninf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[UNKNOWN]], float [[NINF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[UNKNOWN]], float [[NINF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %ninf.or.nan = call float @returns_ninf_or_nan()
@@ -1410,7 +1410,7 @@ define nofpclass(snan) float @inf__maximum__unknown(float 
%unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @inf__maximum__unknown(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[INF:%.*]] = call float @returns_inf()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float [[INF]], 
float [[UNKNOWN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[INF]], float [[UNKNOWN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf = call float @returns_inf()
@@ -1422,7 +1422,7 @@ define nofpclass(snan) float @unknown__maximum__inf(float 
%unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @unknown__maximum__inf(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[INF:%.*]] = call float @returns_inf()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[UNKNOWN]], float [[INF]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[UNKNOWN]], float [[INF]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf = call float @returns_inf()
@@ -1434,7 +1434,7 @@ define nofpclass(snan) float 
@inf_or_nan__maximum__unknown(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @inf_or_nan__maximum__unknown(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[INF_OR_NAN]], float [[UNKNOWN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[INF_OR_NAN]], float [[UNKNOWN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf_or_nan()
@@ -1446,7 +1446,7 @@ define nofpclass(snan) float 
@unknown__maximum__inf_or_nan(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @unknown__maximum__inf_or_nan(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[UNKNOWN]], float [[INF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[UNKNOWN]], float [[INF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf_or_nan()
@@ -1458,7 +1458,7 @@ define nofpclass(snan) float 
@ninf_or_nan__maximum__not_nan(float nofpclass(nan)
 ; CHECK-LABEL: define nofpclass(snan) float @ninf_or_nan__maximum__not_nan(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[NINF_OR_NAN:%.*]] = call float @returns_ninf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[NINF_OR_NAN]], float [[NOT_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[NINF_OR_NAN]], float [[NOT_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %ninf.or.nan = call float @returns_ninf_or_nan()
@@ -1470,7 +1470,7 @@ define nofpclass(snan) float 
@not_nan__maximum__ninf_or_nan(float nofpclass(nan)
 ; CHECK-LABEL: define nofpclass(snan) float @not_nan__maximum__ninf_or_nan(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[NINF_OR_NAN:%.*]] = call float @returns_ninf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[NOT_NAN]], float [[NINF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[NOT_NAN]], float [[NINF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %ninf.or.nan = call float @returns_ninf_or_nan()
@@ -1504,7 +1504,7 @@ define nofpclass(snan) float 
@inf_or_nan__maximum__not_nan(float nofpclass(nan)
 ; CHECK-LABEL: define nofpclass(snan) float @inf_or_nan__maximum__not_nan(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[INF_OR_NAN]], float [[NOT_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[INF_OR_NAN]], float [[NOT_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf_or_nan()
@@ -1516,7 +1516,7 @@ define nofpclass(snan) float 
@not_nan__maximum__inf_or_nan(float nofpclass(nan)
 ; CHECK-LABEL: define nofpclass(snan) float @not_nan__maximum__inf_or_nan(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[NOT_NAN]], float [[INF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[NOT_NAN]], float [[INF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf_or_nan()
@@ -1572,7 +1572,7 @@ define nofpclass(snan) float @inf__maximum__not_nan(float 
nofpclass(nan) %not.na
 ; CHECK-LABEL: define nofpclass(snan) float @inf__maximum__not_nan(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf()
-; CHECK-NEXT:    [[RESULT:%.*]] = call nnan float @llvm.maximum.f32(float 
[[INF_OR_NAN]], float [[NOT_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nnan nsz float @llvm.maximum.f32(float 
[[INF_OR_NAN]], float [[NOT_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf()
@@ -1584,7 +1584,7 @@ define nofpclass(snan) float @not_nan__maximum__inf(float 
nofpclass(nan) %not.na
 ; CHECK-LABEL: define nofpclass(snan) float @not_nan__maximum__inf(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf()
-; CHECK-NEXT:    [[RESULT:%.*]] = call nnan float @llvm.maximum.f32(float 
[[NOT_NAN]], float [[INF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nnan nsz float @llvm.maximum.f32(float 
[[NOT_NAN]], float [[INF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf()
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll
index 797872e172a24..f3a902288f5ae 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()
@@ -1340,7 +1340,7 @@ define nofpclass(snan) float 
@pinf_or_nan__minimum__unknown(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @pinf_or_nan__minimum__unknown(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[PINF_OR_NAN:%.*]] = call float @returns_pinf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float 
[[PINF_OR_NAN]], float [[UNKNOWN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[PINF_OR_NAN]], float [[UNKNOWN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %pinf.or.nan = call float @returns_pinf_or_nan()
@@ -1352,7 +1352,7 @@ define nofpclass(snan) float 
@unknown__minimum__pinf_or_nan(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @unknown__minimum__pinf_or_nan(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[PINF_OR_NAN:%.*]] = call float @returns_pinf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float 
[[UNKNOWN]], float [[PINF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[UNKNOWN]], float [[PINF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %pinf.or.nan = call float @returns_pinf_or_nan()
@@ -1364,7 +1364,7 @@ define nofpclass(snan) float 
@ninf__minimum__unknown(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @ninf__minimum__unknown(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[NINF:%.*]] = call float @returns_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]]
 ;
   %ninf = call float @returns_ninf()
@@ -1376,7 +1376,7 @@ define nofpclass(snan) float 
@unknown__minimum__ninf(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @unknown__minimum__ninf(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[NINF:%.*]] = call float @returns_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]]
 ;
   %ninf = call float @returns_ninf()
@@ -1388,7 +1388,7 @@ define nofpclass(snan) float 
@ninf_or_nan__minimum__unknown(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @ninf_or_nan__minimum__unknown(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[NINF_OR_NAN:%.*]] = call float @returns_ninf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float 
[[NINF_OR_NAN]], float [[UNKNOWN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[NINF_OR_NAN]], float [[UNKNOWN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %ninf.or.nan = call float @returns_ninf_or_nan()
@@ -1400,7 +1400,7 @@ define nofpclass(snan) float 
@unknown__minimum__ninf_or_nan(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @unknown__minimum__ninf_or_nan(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[NINF_OR_NAN:%.*]] = call float @returns_ninf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float 
[[UNKNOWN]], float [[NINF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[UNKNOWN]], float [[NINF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %ninf.or.nan = call float @returns_ninf_or_nan()
@@ -1412,7 +1412,7 @@ define nofpclass(snan) float @inf__minimum__unknown(float 
%unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @inf__minimum__unknown(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[INF:%.*]] = call float @returns_inf()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float [[INF]], 
float [[UNKNOWN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[INF]], float [[UNKNOWN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf = call float @returns_inf()
@@ -1424,7 +1424,7 @@ define nofpclass(snan) float @unknown__minimum__inf(float 
%unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @unknown__minimum__inf(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[INF:%.*]] = call float @returns_inf()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float 
[[UNKNOWN]], float [[INF]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[UNKNOWN]], float [[INF]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf = call float @returns_inf()
@@ -1436,7 +1436,7 @@ define nofpclass(snan) float 
@inf_or_nan__minimum__unknown(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @inf_or_nan__minimum__unknown(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float 
[[INF_OR_NAN]], float [[UNKNOWN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[INF_OR_NAN]], float [[UNKNOWN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf_or_nan()
@@ -1448,7 +1448,7 @@ define nofpclass(snan) float 
@unknown__minimum__inf_or_nan(float %unknown) {
 ; CHECK-LABEL: define nofpclass(snan) float @unknown__minimum__inf_or_nan(
 ; CHECK-SAME: float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float 
[[UNKNOWN]], float [[INF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[UNKNOWN]], float [[INF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf_or_nan()
@@ -1482,7 +1482,7 @@ define nofpclass(snan) float 
@pinf_or_nan__minimum__not_nan(float nofpclass(nan)
 ; CHECK-LABEL: define nofpclass(snan) float @pinf_or_nan__minimum__not_nan(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[PINF_OR_NAN:%.*]] = call float @returns_pinf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float 
[[PINF_OR_NAN]], float [[NOT_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[PINF_OR_NAN]], float [[NOT_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %pinf.or.nan = call float @returns_pinf_or_nan()
@@ -1494,7 +1494,7 @@ define nofpclass(snan) float 
@not_nan__minimum__pinf_or_nan(float nofpclass(nan)
 ; CHECK-LABEL: define nofpclass(snan) float @not_nan__minimum__pinf_or_nan(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[PINF_OR_NAN:%.*]] = call float @returns_pinf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float 
[[NOT_NAN]], float [[PINF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[NOT_NAN]], float [[PINF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %pinf.or.nan = call float @returns_pinf_or_nan()
@@ -1506,7 +1506,7 @@ define nofpclass(snan) float 
@inf_or_nan__minimum__not_nan(float nofpclass(nan)
 ; CHECK-LABEL: define nofpclass(snan) float @inf_or_nan__minimum__not_nan(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float 
[[INF_OR_NAN]], float [[NOT_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[INF_OR_NAN]], float [[NOT_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf_or_nan()
@@ -1518,7 +1518,7 @@ define nofpclass(snan) float 
@not_nan__minimum__inf_or_nan(float nofpclass(nan)
 ; CHECK-LABEL: define nofpclass(snan) float @not_nan__minimum__inf_or_nan(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf_or_nan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.minimum.f32(float 
[[NOT_NAN]], float [[INF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[NOT_NAN]], float [[INF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf_or_nan()
@@ -1574,7 +1574,7 @@ define nofpclass(snan) float @inf__minimum__not_nan(float 
nofpclass(nan) %not.na
 ; CHECK-LABEL: define nofpclass(snan) float @inf__minimum__not_nan(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf()
-; CHECK-NEXT:    [[RESULT:%.*]] = call nnan float @llvm.minimum.f32(float 
[[INF_OR_NAN]], float [[NOT_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nnan nsz float @llvm.minimum.f32(float 
[[INF_OR_NAN]], float [[NOT_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf()
@@ -1586,7 +1586,7 @@ define nofpclass(snan) float @not_nan__minimum__inf(float 
nofpclass(nan) %not.na
 ; CHECK-LABEL: define nofpclass(snan) float @not_nan__minimum__inf(
 ; CHECK-SAME: float nofpclass(nan) [[NOT_NAN:%.*]]) {
 ; CHECK-NEXT:    [[INF_OR_NAN:%.*]] = call float @returns_inf()
-; CHECK-NEXT:    [[RESULT:%.*]] = call nnan float @llvm.minimum.f32(float 
[[NOT_NAN]], float [[INF_OR_NAN]])
+; CHECK-NEXT:    [[RESULT:%.*]] = call nnan nsz float @llvm.minimum.f32(float 
[[NOT_NAN]], float [[INF_OR_NAN]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %inf.or.nan = call float @returns_inf()

_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to