[llvm-branch-commits] [llvm] DAG: Lower fcNormal is.fpclass to compare with inf (PR #100389)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Jul 26 11:49:12 PDT 2024
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/100389
>From f515257afc80ac1874ffb0e3d2697b2447a1bf5f Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Wed, 1 Feb 2023 09:06:59 -0400
Subject: [PATCH] DAG: Lower fcNormal is.fpclass to compare with inf
Looks worse for x86 without the fabs check. Not sure if
this is useful for any targets.
---
.../CodeGen/SelectionDAG/TargetLowering.cpp | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 18cd368e24259..dcc65549d7a0e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -8673,6 +8673,31 @@ SDValue TargetLowering::expandIS_FPCLASS(EVT ResultVT, SDValue Op,
IsOrdered ? OrderedOp : UnorderedOp);
}
}
+
+ if (FPTestMask == fcNormal) {
+ // TODO: Handle unordered
+ ISD::CondCode IsFiniteOp = IsInvertedFP ? ISD::SETUGE : ISD::SETOLT;
+ ISD::CondCode IsNormalOp = IsInvertedFP ? ISD::SETOLT : ISD::SETUGE;
+
+ if (isCondCodeLegalOrCustom(IsFiniteOp,
+ OperandVT.getScalarType().getSimpleVT()) &&
+ isCondCodeLegalOrCustom(IsNormalOp,
+ OperandVT.getScalarType().getSimpleVT()) &&
+ isFAbsFree(OperandVT)) {
+ // isnormal(x) --> fabs(x) < infinity && !(fabs(x) < smallest_normal)
+ SDValue Inf =
+ DAG.getConstantFP(APFloat::getInf(Semantics), DL, OperandVT);
+ SDValue SmallestNormal = DAG.getConstantFP(
+ APFloat::getSmallestNormalized(Semantics), DL, OperandVT);
+
+ SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
+ SDValue IsFinite = DAG.getSetCC(DL, ResultVT, Abs, Inf, IsFiniteOp);
+ SDValue IsNormal =
+ DAG.getSetCC(DL, ResultVT, Abs, SmallestNormal, IsNormalOp);
+ unsigned LogicOp = IsInvertedFP ? ISD::OR : ISD::AND;
+ return DAG.getNode(LogicOp, DL, ResultVT, IsFinite, IsNormal);
+ }
+ }
}
// Some checks may be represented as inversion of simpler check, for example
More information about the llvm-branch-commits
mailing list