[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