[llvm-branch-commits] [llvm] InstCombine: Handle fadd in SimplifyDemandedFPClass (PR #174853)
Yingwei Zheng via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat Jan 10 06:05:17 PST 2026
================
@@ -2091,6 +2110,86 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V,
Known.fneg();
break;
}
+ case Instruction::FAdd: {
+ KnownFPClass KnownLHS, KnownRHS;
+
+ const SimplifyQuery &SQ = getSimplifyQuery();
+
+ // fadd x, x can be handled more aggressively.
+ if (I->getOperand(0) == I->getOperand(1) &&
+ isGuaranteedNotToBeUndef(I->getOperand(0), SQ.AC, CxtI, SQ.DT,
+ Depth + 1)) {
+ FPClassTest SrcDemandedMask = DemandedMask;
+
+ // Doubling a subnormal could have resulted in a normal value.
+ if (DemandedMask & fcPosNormal)
+ SrcDemandedMask |= fcPosSubnormal;
+ if (DemandedMask & fcNegNormal)
+ SrcDemandedMask |= fcNegSubnormal;
+
+ // Doubling a normal could have resulted in an infinity.
+ if (DemandedMask & fcPosInf)
+ SrcDemandedMask |= fcPosNormal;
+ if (DemandedMask & fcNegInf)
+ SrcDemandedMask |= fcNegNormal;
+
+ if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, Depth + 1))
+ return I;
+
+ Type *EltTy = VTy->getScalarType();
+ DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
+ Known = KnownFPClass::fadd_self(KnownLHS, Mode);
+ KnownRHS = KnownLHS;
+ } else {
+ FPClassTest SrcDemandedMask = fcFinite;
+
+ // inf + (-inf) = nan
+ if (DemandedMask & fcNan)
+ SrcDemandedMask |= fcNan | fcInf;
+
+ if (DemandedMask & fcInf)
+ SrcDemandedMask |= fcInf;
+
+ if (SimplifyDemandedFPClass(I, 1, SrcDemandedMask, KnownRHS, Depth + 1) ||
+ SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, Depth + 1))
+ return I;
+
+ Type *EltTy = VTy->getScalarType();
+ DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
+ Known = KnownFPClass::fadd(KnownLHS, KnownRHS, Mode);
+ }
+
+ FPClassTest ValidResults = DemandedMask & Known.KnownFPClasses;
+ if (Constant *SingleVal =
+ getFPClassConstant(VTy, ValidResults, /*IsCanonicalizing=*/true))
+ return SingleVal;
+
+ // Propagate known result to simplify edge case checks.
+ bool ResultNotNan = (DemandedMask & fcNan) == fcNone;
+ if (ResultNotNan) {
+ KnownLHS.knownNot(fcNan);
+ KnownRHS.knownNot(fcNan);
+ }
+
+ // With nnan: X + {+/-}Inf --> {+/-}Inf
+ if (KnownRHS.isKnownAlways(fcInf | fcNan) &&
+ (ResultNotNan || KnownLHS.isKnownNever(fcNan)))
+ return I->getOperand(1);
+
+ // With nnan: {+/-}Inf + X --> {+/-}Inf
+ if (KnownLHS.isKnownAlways(fcInf | fcNan) &&
+ (ResultNotNan || KnownRHS.isKnownNever(fcNan)))
+ return I->getOperand(0);
+
+ FastMathFlags InferredFMF =
+ inferFastMathValueFlagsBinOp(FMF, ValidResults, KnownLHS, KnownRHS);
+ if (InferredFMF != FMF) {
+ I->setFastMathFlags(InferredFMF);
----------------
dtcxzyw wrote:
drop ubimplying attrs/metadata
https://github.com/llvm/llvm-project/pull/174853
More information about the llvm-branch-commits
mailing list