https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/174024
>From d02f9c80c7c152b71fed9be30c1d57515b4062a3 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <[email protected]> Date: Tue, 30 Dec 2025 21:04:37 +0100 Subject: [PATCH] InstCombine: Consider not-inf/nan context when simplifying fmul Consider if the result can be nan, or if the inputs cannot be infinity from the flag when trying to simplify fmul into copysign. --- .../InstCombineSimplifyDemanded.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index cd46f5f0bc881..fe53e97d53ac9 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -2175,12 +2175,18 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V, KnownRHS.knownNot(fcNan); } + if (FMF.noInfs()) { + // Flag implies inputs cannot be infinity. + KnownLHS.knownNot(fcInf); + KnownRHS.knownNot(fcInf); + } + + bool NonNanResult = (DemandedMask & fcNan) == fcNone; + // With no-nans/no-infs: // X * 0.0 --> copysign(0.0, X) // X * -0.0 --> copysign(0.0, -X) - - // TODO: Apply knowledge of no-infinity returns to sources. - if (KnownLHS.isKnownNeverInfOrNaN() && + if ((NonNanResult || KnownLHS.isKnownNeverInfOrNaN()) && KnownRHS.isKnownAlways(fcPosZero | fcNan)) { // => copysign(+0, lhs) // Note: Dropping canonicalize @@ -2190,7 +2196,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V, } if (KnownLHS.isKnownAlways(fcPosZero | fcNan) && - KnownRHS.isKnownNeverInfOrNaN()) { + (NonNanResult || KnownRHS.isKnownNeverInfOrNaN())) { // => copysign(+0, rhs) // Note: Dropping canonicalize Value *Copysign = Builder.CreateCopySign(X, Y, FMF); @@ -2198,7 +2204,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V, return Copysign; } - if (KnownLHS.isKnownNeverInfOrNaN() && + if ((NonNanResult || KnownLHS.isKnownNeverInfOrNaN()) && KnownRHS.isKnownAlways(fcNegZero | fcNan)) { // => copysign(0, fneg(lhs)) // Note: Dropping canonicalize @@ -2209,7 +2215,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V, } if (KnownLHS.isKnownAlways(fcNegZero | fcNan) && - KnownRHS.isKnownNeverInfOrNaN()) { + (NonNanResult || KnownRHS.isKnownNeverInfOrNaN())) { // => copysign(+0, fneg(rhs)) // Note: Dropping canonicalize Value *Copysign = _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
