[llvm] [GISel] Add KnownFPClass Analysis to GISelValueTrackingPass (PR #134611)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu May 8 03:05:23 PDT 2025
================
@@ -637,6 +653,1096 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
ComputeKnownBitsCache[R] = Known;
}
+static bool outputDenormalIsIEEEOrPosZero(const MachineFunction &MF, LLT Ty) {
+ Ty = Ty.getScalarType();
+ DenormalMode Mode = MF.getDenormalMode(getFltSemanticForLLT(Ty));
+ return Mode.Output == DenormalMode::IEEE ||
+ Mode.Output == DenormalMode::PositiveZero;
+}
+
+std::pair<Register, FPClassTest> GISelValueTracking::fcmpToClassTest(
+ FCmpInst::Predicate Pred, const MachineFunction &MF, Register LHS,
+ const APFloat *ConstRHS, bool LookThroughSrc) {
+
+ auto [Src, ClassIfTrue, ClassIfFalse] =
+ fcmpImpliesClass(Pred, MF, LHS, *ConstRHS, LookThroughSrc);
+ if (Src && ClassIfTrue == ~ClassIfFalse)
+ return {Src, ClassIfTrue};
+
+ return {Register(), fcAllFlags};
+}
+
+std::tuple<Register, FPClassTest, FPClassTest>
+GISelValueTracking::fcmpImpliesClass(CmpInst::Predicate Pred,
+ const MachineFunction &MF, Register LHS,
+ FPClassTest RHSClass,
+ bool LookThroughSrc) {
+ auto LookThrough = [&](Register LHS, Register &Src) {
+ return LookThroughSrc && mi_match(LHS, MRI, m_GFabs(m_Reg(Src)));
+ };
+
+ LLT Ty = MRI.getType(LHS);
+ DenormalMode Mode = MF.getDenormalMode(getFltSemanticForLLT(Ty));
+
+ return llvm::fcmpImpliesClass(Pred, Mode, LHS, RHSClass, LookThrough);
+}
+
+std::tuple<Register, FPClassTest, FPClassTest>
+GISelValueTracking::fcmpImpliesClass(CmpInst::Predicate Pred,
+ const MachineFunction &MF, Register LHS,
+ const APFloat &ConstRHS,
+ bool LookThroughSrc) {
+ auto LookThrough = [&](Register LHS, Register &Src) {
+ return LookThroughSrc && mi_match(LHS, MRI, m_GFabs(m_Reg(Src)));
+ };
+
+ LLT Ty = MRI.getType(LHS);
+ DenormalMode Mode = MF.getDenormalMode(getFltSemanticForLLT(Ty));
----------------
arsenm wrote:
Should avoid eagerly querying the denormal mode. It rarely matters and is a string parse and map lookup, can you keep this in the same use position as it was?
https://github.com/llvm/llvm-project/pull/134611
More information about the llvm-commits
mailing list