Skip to content

Commit f5da092

Browse files
committed
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.
1 parent 7d48a38 commit f5da092

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8787,6 +8787,31 @@ SDValue TargetLowering::expandIS_FPCLASS(EVT ResultVT, SDValue Op,
87878787
IsOrdered ? OrderedOp : UnorderedOp);
87888788
}
87898789
}
8790+
8791+
if (FPTestMask == fcNormal) {
8792+
// TODO: Handle unordered
8793+
ISD::CondCode IsFiniteOp = IsInvertedFP ? ISD::SETUGE : ISD::SETOLT;
8794+
ISD::CondCode IsNormalOp = IsInvertedFP ? ISD::SETOLT : ISD::SETUGE;
8795+
8796+
if (isCondCodeLegalOrCustom(IsFiniteOp,
8797+
OperandVT.getScalarType().getSimpleVT()) &&
8798+
isCondCodeLegalOrCustom(IsNormalOp,
8799+
OperandVT.getScalarType().getSimpleVT()) &&
8800+
isFAbsFree(OperandVT)) {
8801+
// isnormal(x) --> fabs(x) < infinity && !(fabs(x) < smallest_normal)
8802+
SDValue Inf =
8803+
DAG.getConstantFP(APFloat::getInf(Semantics), DL, OperandVT);
8804+
SDValue SmallestNormal = DAG.getConstantFP(
8805+
APFloat::getSmallestNormalized(Semantics), DL, OperandVT);
8806+
8807+
SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
8808+
SDValue IsFinite = DAG.getSetCC(DL, ResultVT, Abs, Inf, IsFiniteOp);
8809+
SDValue IsNormal =
8810+
DAG.getSetCC(DL, ResultVT, Abs, SmallestNormal, IsNormalOp);
8811+
unsigned LogicOp = IsInvertedFP ? ISD::OR : ISD::AND;
8812+
return DAG.getNode(LogicOp, DL, ResultVT, IsFinite, IsNormal);
8813+
}
8814+
}
87908815
}
87918816

87928817
// Some checks may be represented as inversion of simpler check, for example

0 commit comments

Comments
 (0)