[llvm] [GISel] Add KnownFPClass Analysis to GISelValueTrackingPass (PR #134611)

Tim Gymnich via llvm-commits llvm-commits at lists.llvm.org
Thu May 8 07:39:56 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));
----------------
tgymnich wrote:

switched to lazy eval

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


More information about the llvm-commits mailing list