[llvm] InstCombine: Improve single-use fneg(fabs(x)) SimplifyDemandedFPClass handling (PR #176360)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 30 05:10:25 PST 2026


================
@@ -2258,6 +2283,44 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
 
   switch (I->getOpcode()) {
   case Instruction::FNeg: {
+    // Special case fneg(fabs(x))
+
+    Value *FNegSrc = I->getOperand(0);
+    Value *FNegFAbsSrc;
+    if (match(FNegSrc, m_OneUse(m_FAbs(m_Value(FNegFAbsSrc))))) {
+      KnownFPClass KnownSrc;
+      if (SimplifyDemandedFPClass(cast<Instruction>(FNegSrc), 0,
+                                  llvm::unknown_sign(DemandedMask), KnownSrc,
+                                  Depth + 1))
+        return I;
+
+      FastMathFlags FabsFMF = cast<FPMathOperator>(FNegSrc)->getFastMathFlags();
+      FPClassTest ThisDemandedMask =
+          adjustDemandedMaskFromFlags(DemandedMask, FabsFMF);
+
+      bool IsNSZ = FMF.noSignedZeros() ||
+                   (FabsFMF.noSignedZeros() && FNegSrc->hasOneUse());
----------------
dtcxzyw wrote:

Duplicate one-use check.

https://github.com/llvm/llvm-project/pull/176360


More information about the llvm-commits mailing list