[llvm-branch-commits] [llvm] InstCombine: Implement SimplifyDemandedFPClass for fma (PR #175616)
Yingwei Zheng via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Jan 13 09:00:35 PST 2026
================
@@ -2417,6 +2421,53 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
Known.copysign(KnownSign);
break;
}
+ case Intrinsic::fma:
+ case Intrinsic::fmuladd: {
+ // We can't do any simplification on the source besides stripping out
+ // unneeded nans.
+ FPClassTest SrcDemandedMask = (DemandedMask & fcNan) | ~fcNan;
+
+ KnownFPClass KnownSrc[3];
+
+ Type *EltTy = VTy->getScalarType();
+ if (CI->getArgOperand(0) == CI->getArgOperand(1) &&
+ isGuaranteedNotToBeUndef(CI->getArgOperand(0), SQ.AC, CxtI, SQ.DT,
+ Depth + 1)) {
+ if (SimplifyDemandedFPClass(CI, 0, SrcDemandedMask, KnownSrc[0],
+ Depth + 1) ||
+ SimplifyDemandedFPClass(CI, 2, SrcDemandedMask, KnownSrc[2],
+ Depth + 1))
+ return I;
+
+ KnownSrc[1] = KnownSrc[0];
+ DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
+ Known = KnownFPClass::fma_square(KnownSrc[0], KnownSrc[2], Mode);
+ } else {
+ for (int OpIdx = 0; OpIdx != 3; ++OpIdx) {
+ if (SimplifyDemandedFPClass(CI, OpIdx, SrcDemandedMask,
+ KnownSrc[OpIdx], Depth + 1))
+ return CI;
+ }
+
+ DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
+ Known = KnownFPClass::fma(KnownSrc[0], KnownSrc[1], KnownSrc[2], Mode);
+ }
+
+ FPClassTest ValidResults = DemandedMask & Known.KnownFPClasses;
+ if (Constant *SingleVal =
+ getFPClassConstant(VTy, ValidResults, /*IsCanonicalizing=*/true))
+ return SingleVal;
+
+ FastMathFlags InferredFMF = inferFastMathValueFlags(
+ FMF, ValidResults, {KnownSrc[0], KnownSrc[1], KnownSrc[2]});
----------------
dtcxzyw wrote:
```suggestion
FMF, ValidResults, KnownSrc);
```
https://github.com/llvm/llvm-project/pull/175616
More information about the llvm-branch-commits
mailing list