[llvm-branch-commits] [llvm] InstCombine: Handle fmul in SimplifyDemandedFPClass (PR #173872)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Jan 5 01:13:04 PST 2026
================
@@ -2280,6 +2290,127 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V,
Known = KnownLHS | KnownRHS;
break;
}
+ case Instruction::FMul: {
+ KnownFPClass KnownLHS, KnownRHS;
+
+ Value *X = I->getOperand(0);
+ Value *Y = I->getOperand(1);
+
+ FPClassTest SrcDemandedMask =
+ DemandedMask & (fcNan | fcZero | fcSubnormal | fcNormal);
+
+ if (DemandedMask & fcInf) {
+ // mul x, inf = inf
+ // mul large_x, large_y = inf
+ SrcDemandedMask |= fcSubnormal | fcNormal | fcInf;
+ }
+
+ if (DemandedMask & fcNan) {
+ // mul +/-inf, 0 => nan
+ SrcDemandedMask |= fcZero | fcInf;
+
+ // TODO: Mode check
+ // mul +/-inf, sub => nan if daz
+ SrcDemandedMask |= fcSubnormal;
+ }
+
+ if (X == Y) {
+ if (SimplifyDemandedFPClass(I, 0, SrcDemandedMask, KnownLHS, Depth + 1))
+ return I;
+ Type *EltTy = VTy->getScalarType();
+
+ DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
+ Known = KnownFPClass::square(KnownLHS, Mode);
+
+ // Propagate known result to simplify edge case checks.
+ if ((DemandedMask & fcNan) == fcNone)
+ Known.knownNot(fcNan);
+ if ((DemandedMask & fcPosInf) == fcNone)
+ Known.knownNot(fcInf);
+
+ FPClassTest ValidResults = DemandedMask & Known.KnownFPClasses;
+ if (Constant *Folded =
+ getFPClassConstant(VTy, ValidResults, /*IsCanonicalizing=*/true))
+ return Folded;
+
+ if (Known.isKnownAlways(fcPosZero | fcPosInf | fcNan)) {
----------------
arsenm wrote:
This is checking the result, which should assume inf is a possible result for normal inputs, so everything here seems to work as intended. I'll add an assert that the source isn't normal
https://github.com/llvm/llvm-project/pull/173872
More information about the llvm-branch-commits
mailing list