[llvm] [RISCV] Simplify float-point boundary comparisons with FCLASS (PR #228984)

Julian Zhu via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 6 03:34:02 PDT 2026


================
@@ -20852,6 +20852,59 @@ combineVectorSizedSetCCEquality(EVT VT, SDValue X, SDValue Y, ISD::CondCode CC,
                       DAG.getConstant(0, DL, XLenVT), CC);
 }
 
+static SDValue combineFPBoundarySetCC(SDNode *N, SelectionDAG &DAG,
+                                      const RISCVSubtarget &Subtarget) {
+  SDValue X = N->getOperand(0);
+  SDValue Bound = N->getOperand(1);
+  EVT FPVT = X.getValueType();
+  if ((FPVT != MVT::f32 && FPVT != MVT::f64) ||
+      (FPVT == MVT::f32 && !Subtarget.hasStdExtFOrZfinx()) ||
+      (FPVT == MVT::f64 && !Subtarget.hasStdExtDOrZdinx()) ||
+      !isa<ConstantFPSDNode>(Bound))
+    return SDValue();
+
+  const APFloat &C = cast<ConstantFPSDNode>(Bound)->getValueAPF();
+  ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();
+  FPClassTest Mask = fcNone;
+  FPClassTest NaNs = fcSNan | fcQNan;
+  if (C.bitwiseIsEqual(APFloat::getLargest(C.getSemantics(), true))) {
+    if (CC == ISD::SETOLT || CC == ISD::SETULT)
+      Mask = fcNegInf;
+    else if (CC == ISD::SETOGE || CC == ISD::SETUGE)
+      Mask = fcAllFlags & ~(fcNegInf | NaNs);
+  } else if (C.bitwiseIsEqual(APFloat::getLargest(C.getSemantics()))) {
+    if (CC == ISD::SETOGT || CC == ISD::SETUGT)
+      Mask = fcPosInf;
+    else if (CC == ISD::SETOLE || CC == ISD::SETULE)
+      Mask = fcAllFlags & ~(fcPosInf | NaNs);
+  } else if (!Subtarget.hasStdExtZfa() && FPVT == MVT::f64 &&
+             DAG.getDenormalMode(FPVT).Input == DenormalMode::IEEE) {
+    // Without FLI.D, materializing this bound costs more than FCLASS.D.
+    FPClassTest Below = fcNegInf | fcNegNormal | fcNegSubnormal | fcNegZero |
+                        fcPosZero | fcPosSubnormal;
+    if (C.bitwiseIsEqual(APFloat::getSmallestNormalized(C.getSemantics()))) {
+      if (CC == ISD::SETOLT || CC == ISD::SETULT)
+        Mask = Below;
+      else if (CC == ISD::SETOGE || CC == ISD::SETUGE)
+        Mask = fcPosNormal | fcPosInf;
+    } else if (C.bitwiseIsEqual(
+                   APFloat::getSmallestNormalized(C.getSemantics(), true))) {
----------------
HeliC829 wrote:

done

https://github.com/llvm/llvm-project/pull/228984


More information about the llvm-commits mailing list