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

Reply via email to