[llvm-branch-commits] [llvm] InstCombine: Handle fmul by -0 case in SimplifyDemandedFPClass (PR #174023)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jan 7 04:14:33 PST 2026
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/174023
>From 1c3d261925f681ac68a6eaf24d227004d0dfc34e Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
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 +++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 5e200560e83d1..cd46f5f0bc881 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2180,8 +2180,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)
@@ -2200,6 +2198,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());
More information about the llvm-branch-commits
mailing list