[llvm] [DAG] Add basic ISD::IS_FPCLASS constant/identity folds (PR #189944)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 1 05:01:32 PDT 2026
================
@@ -16012,6 +16014,32 @@ SDValue DAGCombiner::visitAssertAlign(SDNode *N) {
return SDValue();
}
+SDValue DAGCombiner::visitIS_FPCLASS(SDNode *N) {
+ SDValue Src = N->getOperand(0);
+ FPClassTest Mask = static_cast<FPClassTest>(N->getConstantOperandVal(1));
+ EVT VT = N->getValueType(0);
+ SDLoc DL(N);
+
+ KnownFPClass Known = DAG.computeKnownFPClass(Src, Mask);
+
+ // Clear test bits we know must be false from the source value.
+ // fp_class (nnan x), qnan|snan|other -> fp_class (nnan x), other
+ // fp_class (ninf x), ninf|pinf|other -> fp_class (ninf x), other
+ if ((Mask & Known.KnownFPClasses) != Mask)
+ return DAG.getNode(
+ ISD::IS_FPCLASS, DL, VT, Src,
+ DAG.getTargetConstant(Mask & Known.KnownFPClasses, DL, MVT::i32),
+ N->getFlags());
+
+ // If none of the tests which can return false are possible, fold to true.
+ // fp_class (nnan x), ~(qnan|snan) -> true
+ // fp_class (ninf x), ~(ninf|pinf) -> true
+ if (Mask == Known.KnownFPClasses)
----------------
arsenm wrote:
Shouldn't this be a subset test instead of equality? KnownFPClasses as fcNone should also fold to false?
https://github.com/llvm/llvm-project/pull/189944
More information about the llvm-commits
mailing list