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
