https://github.com/arsenm updated 
https://github.com/llvm/llvm-project/pull/174023

>From 45afbb363c9d48aa9c552829c42e9c802c280a50 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Tue, 30 Dec 2025 20:19:45 +0100
Subject: [PATCH] InstCombine: Handle fmul by -0 case in
 SimplifyDemandedFPClass

The fmul visitor handles this case as copysign and fneg.
---
 .../InstCombineSimplifyDemanded.cpp           | 22 +++++++++++++++++--
 .../simplify-demanded-fpclass-fmul.ll         |  6 +++--
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index b76d78a4376e3..8fd8425664bb7 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2170,8 +2170,6 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value 
*V,
     // X * -0.0 --> copysign(0.0, -X)
 
     // TODO: Apply knowledge of no-infinity returns to sources.
-
-    // TODO: Known -0, turn into copysign(y, fneg(x)) like visitFMul.
     if (KnownLHS.isKnownNeverInfOrNaN() &&
         KnownRHS.isKnownAlways(fcPosZero | fcNan)) {
       // => copysign(+0, lhs)
@@ -2190,6 +2188,26 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V,
       return Copysign;
     }
 
+    if (KnownLHS.isKnownNeverInfOrNaN() &&
+        KnownRHS.isKnownAlways(fcNegZero | fcNan)) {
+      // => copysign(0, fneg(lhs))
+      // Note: Dropping canonicalize
+      Value *Copysign =
+          Builder.CreateCopySign(Y, Builder.CreateFNegFMF(X, FMF), FMF);
+      Copysign->takeName(I);
+      return Copysign;
+    }
+
+    if (KnownLHS.isKnownAlways(fcNegZero | fcNan) &&
+        KnownRHS.isKnownNeverInfOrNaN()) {
+      // => copysign(+0, fneg(rhs))
+      // Note: Dropping canonicalize
+      Value *Copysign =
+          Builder.CreateCopySign(X, Builder.CreateFNegFMF(Y, FMF), FMF);
+      Copysign->takeName(I);
+      return Copysign;
+    }
+
     Type *EltTy = VTy->getScalarType();
     DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
 
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
index 98a365b0f4ef6..9e7d11a902362 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
@@ -1020,7 +1020,8 @@ define nofpclass(ninf) float 
@ret_ninf__fmul_nnan_unknown__zero(float %unknown)
 define nofpclass(snan) float @known__nzero_or_nan__fmul__not_inf_or_nan(float 
nofpclass(inf sub norm pzero) %nzero.or.nan, float nofpclass(inf nan) 
%not.inf.or.nan) {
 ; CHECK-LABEL: define nofpclass(snan) float 
@known__nzero_or_nan__fmul__not_inf_or_nan(
 ; CHECK-SAME: float nofpclass(inf pzero sub norm) [[NZERO_OR_NAN:%.*]], float 
nofpclass(nan inf) [[NOT_INF_OR_NAN:%.*]]) {
-; CHECK-NEXT:    [[MUL:%.*]] = fmul contract float [[NZERO_OR_NAN]], 
[[NOT_INF_OR_NAN]]
+; CHECK-NEXT:    [[TMP1:%.*]] = fneg contract float [[NOT_INF_OR_NAN]]
+; CHECK-NEXT:    [[MUL:%.*]] = call contract float @llvm.copysign.f32(float 
[[NZERO_OR_NAN]], float [[TMP1]])
 ; CHECK-NEXT:    ret float [[MUL]]
 ;
   %mul = fmul contract float %nzero.or.nan, %not.inf.or.nan
@@ -1031,7 +1032,8 @@ define nofpclass(snan) float 
@known__nzero_or_nan__fmul__not_inf_or_nan(float no
 define nofpclass(snan) float @known__not_inf_or_nan__fmul__nzero_or_nan(float 
nofpclass(inf nan) %not.inf.or.nan, float nofpclass(inf sub norm pzero) 
%nzero.or.nan) {
 ; CHECK-LABEL: define nofpclass(snan) float 
@known__not_inf_or_nan__fmul__nzero_or_nan(
 ; CHECK-SAME: float nofpclass(nan inf) [[NOT_INF_OR_NAN:%.*]], float 
nofpclass(inf pzero sub norm) [[NZERO_OR_NAN:%.*]]) {
-; CHECK-NEXT:    [[MUL:%.*]] = fmul contract float [[NOT_INF_OR_NAN]], 
[[NZERO_OR_NAN]]
+; CHECK-NEXT:    [[TMP1:%.*]] = fneg contract float [[NOT_INF_OR_NAN]]
+; CHECK-NEXT:    [[MUL:%.*]] = call contract float @llvm.copysign.f32(float 
[[NZERO_OR_NAN]], float [[TMP1]])
 ; CHECK-NEXT:    ret float [[MUL]]
 ;
   %mul = fmul contract float %not.inf.or.nan, %nzero.or.nan

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

Reply via email to