[llvm] [InstCombine] Correct handling of `fabs` with `nsz` attribute (PR #216232)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 24 22:00:40 PDT 2026
https://github.com/GabrielWu2004 updated https://github.com/llvm/llvm-project/pull/216232
>From ee96b77f2628d3586491ddfaad44976be312f4b5 Mon Sep 17 00:00:00 2001
From: GabrielWu2004 <gabrielwu2004 at gmail.com>
Date: Thu, 13 Aug 2026 19:27:41 -0700
Subject: [PATCH 1/2] initial fix
---
llvm/lib/Analysis/InstructionSimplify.cpp | 3 ++-
.../lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 520c39ea268ff..cc0c9acb54672 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -6541,7 +6541,8 @@ Value *llvm::simplifyUnaryIntrinsic(Intrinsic::ID IID, Value *Op0,
return Op0;
if (KnownClass.cannotBeOrderedLessThanZero() &&
- KnownClass.isKnownNeverNaN() && FMF.noSignedZeros())
+ KnownClass.isKnownNeverNaN() && FMF.noSignedZeros() &&
+ KnownClass.isKnownNeverNegZero())
return Op0;
break;
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index cca297a5b8dc2..d5e94cc14a585 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2075,6 +2075,7 @@ static Value *simplifyDemandedFPClassFabs(KnownFPClass &Known, Value *Src,
return Src;
// If the only sign bit difference is due to -0, ignore it with nsz
+ // TODO: need to think about this more
if (NSZ &&
KnownSrc.isKnownNever(KnownFPClass::OrderedLessThanZeroMask | fcNan))
return Src;
>From 016756dac1519fd7b866bb22e8148c61637c44a3 Mon Sep 17 00:00:00 2001
From: GabrielWu2004 <gabrielwu2004 at gmail.com>
Date: Mon, 24 Aug 2026 22:00:26 -0700
Subject: [PATCH 2/2] fix simplifyDemandedFPClassFabs to handle NSZ properly
---
.../InstCombine/InstCombineSimplifyDemanded.cpp | 14 +++-----------
1 file changed, 3 insertions(+), 11 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index d5e94cc14a585..1e4809ee8db98 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2064,7 +2064,7 @@ static Constant *getFPClassConstant(Type *Ty, FPClassTest Mask,
/// with the known fpclass if not simplified.
static Value *simplifyDemandedFPClassFabs(KnownFPClass &Known, Value *Src,
FPClassTest DemandedMask,
- KnownFPClass KnownSrc, bool NSZ) {
+ KnownFPClass KnownSrc) {
if ((DemandedMask & fcNan) == fcNone)
KnownSrc.knownNot(fcNan);
if ((DemandedMask & fcInf) == fcNone)
@@ -2074,12 +2074,6 @@ static Value *simplifyDemandedFPClassFabs(KnownFPClass &Known, Value *Src,
((DemandedMask & fcNan) == fcNone && KnownSrc.isKnownNever(fcNegative)))
return Src;
- // If the only sign bit difference is due to -0, ignore it with nsz
- // TODO: need to think about this more
- if (NSZ &&
- KnownSrc.isKnownNever(KnownFPClass::OrderedLessThanZeroMask | fcNan))
- return Src;
-
Known = KnownFPClass::fabs(KnownSrc);
Known.knownNot(~DemandedMask);
return nullptr;
@@ -2831,8 +2825,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
return I;
if (Value *Simplified = simplifyDemandedFPClassFabs(
- Known, CI->getArgOperand(0), DemandedMask, KnownSrc,
- FMF.noSignedZeros()))
+ Known, CI->getArgOperand(0), DemandedMask, KnownSrc))
return Simplified;
break;
}
@@ -3613,8 +3606,7 @@ Value *InstCombinerImpl::SimplifyMultipleUseDemandedFPClass(
// NSZ cannot be applied in multiple use case (maybe it could if all uses
// were known nsz)
if (Value *Simplified = simplifyDemandedFPClassFabs(
- Known, CI->getArgOperand(0), DemandedMask, KnownSrc,
- /*NSZ=*/false))
+ Known, CI->getArgOperand(0), DemandedMask, KnownSrc))
return Simplified;
break;
}
More information about the llvm-commits
mailing list