llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: Matt Arsenault (arsenm)

<details>
<summary>Changes</summary>

If the result can be a qnan, the source can be a signaling nan.

---

Patch is 27.03 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/179244.diff


14 Files Affected:

- (modified) llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
(+21-5) 
- (modified) llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll 
(+2-1) 
- (modified) llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fadd.ll 
(+1-1) 
- (modified) llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fdiv.ll 
(+4-2) 
- (modified) llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fma.ll 
(+10-5) 
- (modified) llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll 
(+6-3) 
- (modified) 
llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fpext.ll (+2-1) 
- (modified) 
llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll 
(+2-1) 
- (modified) 
llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll (+2-1) 
- (modified) llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-log.ll 
(+2-1) 
- (modified) 
llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll (+4-2) 
- (modified) 
llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll (+4-2) 
- (modified) 
llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-rounding-intrinsics.ll
 (+14-7) 
- (modified) llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-sqrt.ll 
(+2-1) 


``````````diff
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index f6c3198cd6d5e..84f9f0a2b344a 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2261,6 +2261,8 @@ simplifyDemandedUseFPClassFPTrunc(InstCombinerImpl &IC, 
Instruction &I,
                                   KnownFPClass &Known, unsigned Depth) {
 
   FPClassTest SrcDemandedMask = DemandedMask;
+  if (DemandedMask & fcNan)
+    SrcDemandedMask |= fcNan;
 
   // Zero results may have been rounded from subnormal or normal sources.
   if (DemandedMask & fcNegZero)
@@ -2366,6 +2368,8 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
       DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
 
       FPClassTest SrcDemandedMask = DemandedMask;
+      if (DemandedMask & fcNan)
+        SrcDemandedMask |= fcNan;
 
       // Doubling a subnormal could have resulted in a normal value.
       if (DemandedMask & fcPosNormal)
@@ -2465,7 +2469,7 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
 
     if (DemandedMask & fcNan) {
       // mul +/-inf, 0 => nan
-      SrcDemandedMask |= fcZero | fcInf;
+      SrcDemandedMask |= fcZero | fcInf | fcNan;
 
       // TODO: Mode check
       // mul +/-inf, sub => nan if daz
@@ -2645,7 +2649,7 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
       // Subnormal is added in case of DAZ, but this isn't strictly
       // necessary. Every other input class implies a possible subnormal 
source,
       // so this only could matter in the degenerate case of only-nan results.
-      SrcDemandedMask |= fcZero | fcInf;
+      SrcDemandedMask |= fcZero | fcInf | fcNan;
     }
 
     // Zero outputs may be the result of underflow.
@@ -2731,6 +2735,8 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
                                              Known, Depth);
   case Instruction::FPExt: {
     FPClassTest SrcDemandedMask = DemandedMask;
+    if (DemandedMask & fcNan)
+      SrcDemandedMask |= fcNan;
 
     // No subnormal result does not imply not-subnormal in the source type.
     if ((DemandedMask & fcNegNormal) != fcNone)
@@ -2828,7 +2834,9 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
     case Intrinsic::fmuladd: {
       // We can't do any simplification on the source besides stripping out
       // unneeded nans.
-      FPClassTest SrcDemandedMask = (DemandedMask & fcNan) | ~fcNan;
+      FPClassTest SrcDemandedMask = DemandedMask | ~fcNan;
+      if (DemandedMask & fcNan)
+        SrcDemandedMask |= fcNan;
 
       KnownFPClass KnownSrc[3];
 
@@ -2870,7 +2878,9 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
       // operands (e.g., a known-positive result could have been clamped), but
       // we can still prune known-nan inputs.
       FPClassTest SrcDemandedMask =
-          PropagateNaN ? DemandedMask | ~fcNan : fcAllFlags;
+          PropagateNaN && ((DemandedMask & fcNan) == fcNone)
+              ? DemandedMask | ~fcNan
+              : fcAllFlags;
 
       KnownFPClass KnownLHS, KnownRHS;
       if (SimplifyDemandedFPClass(CI, 1, SrcDemandedMask, KnownRHS,
@@ -2937,6 +2947,8 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
       }
 
       FPClassTest SrcDemandedMask = DemandedMask & fcNan;
+      if (DemandedMask & fcNan)
+        SrcDemandedMask |= fcNan;
 
       if (DemandedMask & fcZero) {
         // exp(-infinity) = 0
@@ -3022,6 +3034,8 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
     case Intrinsic::log2:
     case Intrinsic::log10: {
       FPClassTest DemandedSrcMask = DemandedMask & (fcNan | fcPosInf);
+      if (DemandedMask & fcNan)
+        DemandedSrcMask |= fcNan;
 
       Type *EltTy = VTy->getScalarType();
       DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
@@ -3061,7 +3075,7 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
           DemandedMask & (fcNegZero | fcPositive | fcNan);
 
       if (DemandedMask & fcNan)
-        DemandedSrcMask |= (fcNegative & ~fcNegZero);
+        DemandedSrcMask |= fcNan | (fcNegative & ~fcNegZero);
 
       // sqrt(max_subnormal) is a normal value
       if (DemandedMask & fcPosNormal)
@@ -3111,6 +3125,8 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
     case Intrinsic::round:
     case Intrinsic::roundeven: {
       FPClassTest DemandedSrcMask = DemandedMask;
+      if (DemandedMask & fcNan)
+        DemandedSrcMask |= fcNan;
 
       // Zero results imply valid subnormal sources.
       if (DemandedMask & fcNegZero)
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
index 3569bd8db4325..311c8ce7a1a26 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
@@ -609,7 +609,8 @@ define nofpclass(snan) float 
@qnan_result_demands_snan_src(i1 %cond, float %unkn
 ; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_src(
 ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call float @returns_snan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.exp.f32(float [[UNKNOWN]])
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float 
[[UNKNOWN]]
+; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.exp.f32(float [[SELECT]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %snan = call float @returns_snan()
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fadd.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fadd.ll
index 7f69b15c96b16..522fbb07d2ffa 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fadd.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fadd.ll
@@ -2049,7 +2049,7 @@ define nofpclass(snan) half 
@qnan_result_self_demands_snan(i1 noundef %cond, hal
 ; CHECK-SAME: i1 noundef [[COND:%.*]], half noundef [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call noundef half @returns_snan()
 ; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half 
[[UNKNOWN]]
-; CHECK-NEXT:    [[RESULT:%.*]] = fadd half [[UNKNOWN]], [[SELECT]]
+; CHECK-NEXT:    [[RESULT:%.*]] = fadd half [[SELECT]], [[SELECT]]
 ; CHECK-NEXT:    ret half [[RESULT]]
 ;
   %snan = call noundef half @returns_snan()
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fdiv.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fdiv.ll
index c4c4da56701a5..b5886619c8e20 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fdiv.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fdiv.ll
@@ -2300,7 +2300,8 @@ define nofpclass(snan) half 
@qnan_result_demands_snan_src_lhs(i1 %cond, half %un
 ; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_src_lhs(
 ; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call half @returns_snan()
-; CHECK-NEXT:    [[MUL:%.*]] = fdiv half [[UNKNOWN0]], [[UNKNOWN1]]
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[MUL:%.*]] = fdiv half [[SELECT]], [[UNKNOWN1]]
 ; CHECK-NEXT:    ret half [[MUL]]
 ;
   %snan = call half @returns_snan()
@@ -2313,7 +2314,8 @@ define nofpclass(snan) half 
@qnan_result_demands_snan_src_rhs(i1 %cond, half %un
 ; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_src_rhs(
 ; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call half @returns_snan()
-; CHECK-NEXT:    [[MUL:%.*]] = fdiv half [[UNKNOWN1]], [[UNKNOWN0]]
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[MUL:%.*]] = fdiv half [[UNKNOWN1]], [[SELECT]]
 ; CHECK-NEXT:    ret half [[MUL]]
 ;
   %snan = call half @returns_snan()
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fma.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fma.ll
index 88f2d0fb02f4c..6f914c98c16ec 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fma.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fma.ll
@@ -297,7 +297,8 @@ define nofpclass(snan) half 
@qnan_result_demands_snan_square_src0(i1 noundef %co
 ; CHECK-LABEL: define nofpclass(snan) half 
@qnan_result_demands_snan_square_src0(
 ; CHECK-SAME: i1 noundef [[COND:%.*]], half noundef [[UNKNOWN0:%.*]], half 
noundef [[UNKNOWN1:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call half @returns_snan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fma.f16(half [[UNKNOWN0]], 
half [[UNKNOWN0]], half [[UNKNOWN1]])
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fma.f16(half [[SELECT]], 
half [[SELECT]], half [[UNKNOWN1]])
 ; CHECK-NEXT:    ret half [[RESULT]]
 ;
   %snan = call half @returns_snan()
@@ -310,7 +311,8 @@ define nofpclass(snan) half 
@qnan_result_demands_snan_square_src1(i1 noundef %co
 ; CHECK-LABEL: define nofpclass(snan) half 
@qnan_result_demands_snan_square_src1(
 ; CHECK-SAME: i1 noundef [[COND:%.*]], half noundef [[UNKNOWN0:%.*]], half 
noundef [[UNKNOWN1:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call half @returns_snan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fma.f16(half [[UNKNOWN1]], 
half [[UNKNOWN1]], half [[UNKNOWN0]])
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fma.f16(half [[UNKNOWN1]], 
half [[UNKNOWN1]], half [[SELECT]])
 ; CHECK-NEXT:    ret half [[RESULT]]
 ;
   %snan = call half @returns_snan()
@@ -323,7 +325,8 @@ define nofpclass(snan) half 
@qnan_result_demands_snan_src0(i1 %cond, half %unkno
 ; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_src0(
 ; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]], 
half [[UNKNOWN2:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call half @returns_snan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fma.f16(half [[UNKNOWN0]], 
half [[UNKNOWN1]], half [[UNKNOWN2]])
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fma.f16(half [[SELECT]], 
half [[UNKNOWN1]], half [[UNKNOWN2]])
 ; CHECK-NEXT:    ret half [[RESULT]]
 ;
   %snan = call half @returns_snan()
@@ -336,7 +339,8 @@ define nofpclass(snan) half 
@qnan_result_demands_snan_src1(i1 %cond, half %unkno
 ; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_src1(
 ; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]], 
half [[UNKNOWN2:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call half @returns_snan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fma.f16(half [[UNKNOWN1]], 
half [[UNKNOWN0]], half [[UNKNOWN2]])
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fma.f16(half [[UNKNOWN1]], 
half [[SELECT]], half [[UNKNOWN2]])
 ; CHECK-NEXT:    ret half [[RESULT]]
 ;
   %snan = call half @returns_snan()
@@ -349,7 +353,8 @@ define nofpclass(snan) half 
@qnan_result_demands_snan_src2(i1 %cond, half %unkno
 ; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_src2(
 ; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]], 
half [[UNKNOWN2:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call half @returns_snan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fma.f16(half [[UNKNOWN1]], 
half [[UNKNOWN2]], half [[UNKNOWN0]])
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fma.f16(half [[UNKNOWN1]], 
half [[UNKNOWN2]], half [[SELECT]])
 ; CHECK-NEXT:    ret half [[RESULT]]
 ;
   %snan = call half @returns_snan()
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
index 805085504b9bb..08fe9b5bb3e18 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
@@ -1407,7 +1407,8 @@ define nofpclass(snan) float 
@qnan_result_square_demands_snan(i1 noundef %cond,
 ; CHECK-LABEL: define nofpclass(snan) float @qnan_result_square_demands_snan(
 ; CHECK-SAME: i1 noundef [[COND:%.*]], float noundef [[UNKNOWN0:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call noundef float @returns_snan()
-; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[UNKNOWN0]], [[UNKNOWN0]]
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[SELECT]], [[SELECT]]
 ; CHECK-NEXT:    ret float [[MUL]]
 ;
   %snan = call noundef float @returns_snan()
@@ -1420,7 +1421,8 @@ define nofpclass(snan) float 
@qnan_result_demands_snan_lhs(i1 %cond, float %unkn
 ; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_lhs(
 ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) 
{
 ; CHECK-NEXT:    [[SNAN:%.*]] = call float @returns_snan()
-; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[UNKNOWN0]], [[UNKNOWN1]]
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[SELECT]], [[UNKNOWN1]]
 ; CHECK-NEXT:    ret float [[MUL]]
 ;
   %snan = call float @returns_snan()
@@ -1433,7 +1435,8 @@ define nofpclass(snan) float 
@qnan_result_demands_snan_rhs(i1 %cond, float %unkn
 ; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_rhs(
 ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) 
{
 ; CHECK-NEXT:    [[SNAN:%.*]] = call float @returns_snan()
-; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[UNKNOWN1]], [[UNKNOWN0]]
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[UNKNOWN1]], [[SELECT]]
 ; CHECK-NEXT:    ret float [[MUL]]
 ;
   %snan = call float @returns_snan()
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fpext.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fpext.ll
index 9de2450bce494..7ff6e6f179673 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fpext.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fpext.ll
@@ -476,7 +476,8 @@ define nofpclass(snan) float 
@qnan_result_demands_snan_src(i1 %cond, half %unkno
 ; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_src(
 ; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call half @returns_snan_f16()
-; CHECK-NEXT:    [[RESULT:%.*]] = fpext half [[UNKNOWN]] to float
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half 
[[UNKNOWN]]
+; CHECK-NEXT:    [[RESULT:%.*]] = fpext half [[SELECT]] to float
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %snan = call half @returns_snan_f16()
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll
index 21726a29668f8..d4f84348530e6 100644
--- 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll
+++ 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll
@@ -623,7 +623,8 @@ define nofpclass(snan) half 
@qnan_result_demands_snan_src2(i1 %cond, float %unkn
 ; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_src2(
 ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN0:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call float @returns_snan_f32()
-; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fptrunc.round.f16.f32(float 
[[UNKNOWN0]], metadata !"round.downward")
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fptrunc.round.f16.f32(float 
[[SELECT]], metadata !"round.downward")
 ; CHECK-NEXT:    ret half [[RESULT]]
 ;
   %snan = call float @returns_snan_f32()
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll
index 744ec58af2fd8..a291b3b06d6ed 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll
@@ -611,7 +611,8 @@ define nofpclass(snan) half 
@qnan_result_demands_snan_src2(i1 %cond, float %unkn
 ; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_src2(
 ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN0:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call float @returns_snan_f32()
-; CHECK-NEXT:    [[RESULT:%.*]] = fptrunc float [[UNKNOWN0]] to half
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[RESULT:%.*]] = fptrunc float [[SELECT]] to half
 ; CHECK-NEXT:    ret half [[RESULT]]
 ;
   %snan = call float @returns_snan_f32()
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-log.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-log.ll
index 61d3b4f11472f..ff1e63c13cad2 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-log.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-log.ll
@@ -357,7 +357,8 @@ define nofpclass(snan) float 
@qnan_result_demands_snan_src(i1 %cond, float %unkn
 ; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_src(
 ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[SNAN:%.*]] = call float @returns_snan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.log.f32(float [[UNKNOWN]])
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float 
[[UNKNOWN]]
+; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.log.f32(float [[SELECT]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %snan = call float @returns_snan()
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll
index a3b135ae51444..f1a39f724efdb 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll
@@ -2164,7 +2164,8 @@ define nofpclass(snan) float 
@qnan_result_demands_snan_lhs(i1 %cond, float %unkn
 ; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_lhs(
 ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) 
{
 ; CHECK-NEXT:    [[SNAN:%.*]] = call float @returns_snan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[UNKNOWN0]], float [[UNKNOWN1]])
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[SELECT]], float [[UNKNOWN1]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %snan = call float @returns_snan()
@@ -2177,7 +2178,8 @@ define nofpclass(snan) float 
@qnan_result_demands_snan_rhs(i1 %cond, float %unkn
 ; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_rhs(
 ; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN0:%.*]], float [[UNKNOWN1:%.*]]) 
{
 ; CHECK-NEXT:    [[SNAN:%.*]] = call float @returns_snan()
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[UNKNOWN1]], float [[UNKNOWN0]])
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float 
[[UNKNOWN0]]
+; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.maximum.f32(float 
[[UNKNOWN1]], float [[SELECT]])
 ; CHECK-NEXT:    ret float [[RESULT]]
 ;
   %snan = call float @returns_snan()
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll
index 92053ad003443..b86e25c5b18c6 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minim...
[truncated]

``````````

</details>


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

Reply via email to