[llvm] [DAG] Add initial version of SelectionDAG::computeKnownFPClass (PR #188790)
Xinlong Chen via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 30 00:01:44 PDT 2026
================
@@ -6045,6 +5988,82 @@ bool SelectionDAG::isBaseWithConstantOffset(SDValue Op) const {
(Op.isAnyAdd() || isADDLike(Op));
}
+KnownFPClass SelectionDAG::computeKnownFPClass(SDValue Op,
+ FPClassTest InterestedClasses,
+ unsigned Depth) const {
+ EVT VT = Op.getValueType();
+ APInt DemandedElts = VT.isFixedLengthVector()
+ ? APInt::getAllOnes(VT.getVectorNumElements())
+ : APInt(1, 1);
+ return computeKnownFPClass(Op, DemandedElts, InterestedClasses, Depth);
+}
+
+KnownFPClass SelectionDAG::computeKnownFPClass(SDValue Op,
+ const APInt &DemandedElts,
+ FPClassTest InterestedClasses,
+ unsigned Depth) const {
+ KnownFPClass Known;
+
+ if (auto *CFP = dyn_cast<ConstantFPSDNode>(Op)) {
+ Known.KnownFPClasses = CFP->getValueAPF().classify();
+ Known.SignBit = CFP->getValueAPF().isNegative();
+ return Known;
+ }
+
+ if (Depth >= MaxRecursionDepth)
+ return Known;
+
+ if (Op.getOpcode() == ISD::UNDEF)
+ return Known;
+
+ EVT VT = Op.getValueType();
+ assert((!VT.isFixedLengthVector() ||
+ DemandedElts.getBitWidth() == VT.getVectorNumElements()) &&
+ "Unexpected vector size");
+
+ if (!DemandedElts)
+ return Known;
+
+ unsigned Opcode = Op.getOpcode();
+ switch (Opcode) {
+ case ISD::POISON: {
+ Known.KnownFPClasses = fcNone;
+ Known.SignBit = false;
+ break;
+ }
+ case ISD::BUILD_VECTOR: {
+ assert(!VT.isScalableVector());
+ bool First = true;
+ for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
+ if (!DemandedElts[I])
+ continue;
+
+ if (First) {
----------------
Xinlong-Chen wrote:
@RKSimon yes, the First flag pattern here follows the same approach used in `GISelValueTracking::computeKnownFPClass` for `G_BUILD_VECTOR` handling.
Since KnownFPClass defaults to unknown and `|=` only widens, we need the first demanded element as the starting point.
https://github.com/llvm/llvm-project/pull/188790
More information about the llvm-commits
mailing list