[llvm-branch-commits] [llvm] InstCombine: Fix SimplifyDemandedFPClass bug with known-snan sources (PR #179244)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Feb 2 06:50:03 PST 2026
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
More information about the llvm-branch-commits
mailing list