[llvm-branch-commits] [llvm] InstCombine: Consider not-inf/nan context when simplifying fmul (PR #174024)
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/174024
>From d02f9c80c7c152b71fed9be30c1d57515b4062a3 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
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 =
More information about the llvm-branch-commits
mailing list