[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