[llvm] [llubi] Initial support for floating-point numbers (PR #188453)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 26 08:00:15 PDT 2026


================
@@ -860,41 +1072,141 @@ class InstExecutor : public InstVisitor<InstExecutor, void> {
     });
   }
 
+  void visitFCmpInst(FCmpInst &I) {
+    DenormalMode DenormMode = CurrentFrame->Func.getDenormalMode(
+        I.getOperand(0)->getType()->getScalarType()->getFltSemantics());
+    FastMathFlags FMF = I.getFastMathFlags();
+
+    visitBinOp(I, [&](const AnyValue &LHS, const AnyValue &RHS) -> AnyValue {
+      if (LHS.isPoison() || RHS.isPoison()) {
+        return AnyValue::poison();
+      }
+
+      if (auto ValidateRes = handleFMFFlags(LHS, FMF); ValidateRes.isPoison()) {
+        return ValidateRes;
+      }
+      if (auto ValidateRes = handleFMFFlags(RHS, FMF); ValidateRes.isPoison()) {
+        return ValidateRes;
+      }
+
+      APFloat FLHS = handleDenormal(LHS.asFloat(), DenormMode.Input);
+      APFloat FRHS = handleDenormal(RHS.asFloat(), DenormMode.Input);
+
+      APFloat::cmpResult CmpResult = FLHS.compare(FRHS);
+
+      bool Result = false;
+
+      switch (I.getPredicate()) {
+      case FCmpInst::FCMP_FALSE:
+        Result = false;
+        break;
+      case FCmpInst::FCMP_OEQ:
+        Result = (CmpResult == APFloat::cmpEqual);
+        break;
+      case FCmpInst::FCMP_OGT:
+        Result = (CmpResult == APFloat::cmpGreaterThan);
+        break;
+      case FCmpInst::FCMP_OGE:
+        Result = (CmpResult == APFloat::cmpEqual ||
+                  CmpResult == APFloat::cmpGreaterThan);
+        break;
+      case FCmpInst::FCMP_OLT:
+        Result = (CmpResult == APFloat::cmpLessThan);
+        break;
+      case FCmpInst::FCMP_OLE:
+        Result = (CmpResult == APFloat::cmpEqual ||
+                  CmpResult == APFloat::cmpLessThan);
+        break;
+      case FCmpInst::FCMP_ONE:
+        Result = (CmpResult == APFloat::cmpGreaterThan ||
+                  CmpResult == APFloat::cmpLessThan);
+        break;
+      case FCmpInst::FCMP_ORD:
+        Result = (CmpResult != APFloat::cmpUnordered);
+        break;
+      case FCmpInst::FCMP_UNO:
+        Result = (CmpResult == APFloat::cmpUnordered);
+        break;
+      case FCmpInst::FCMP_UEQ:
+        Result = (CmpResult == APFloat::cmpEqual ||
+                  CmpResult == APFloat::cmpUnordered);
+        break;
+      case FCmpInst::FCMP_UGT:
+        Result = (CmpResult == APFloat::cmpGreaterThan ||
+                  CmpResult == APFloat::cmpUnordered);
+        break;
+      case FCmpInst::FCMP_UGE:
+        Result = (CmpResult == APFloat::cmpEqual ||
+                  CmpResult == APFloat::cmpGreaterThan ||
+                  CmpResult == APFloat::cmpUnordered);
+        break;
+      case FCmpInst::FCMP_ULT:
+        Result = (CmpResult == APFloat::cmpLessThan ||
+                  CmpResult == APFloat::cmpUnordered);
+        break;
+      case FCmpInst::FCMP_ULE:
+        Result = (CmpResult == APFloatBase::cmpEqual ||
+                  CmpResult == APFloat::cmpLessThan ||
+                  CmpResult == APFloat::cmpUnordered);
+        break;
+      case FCmpInst::FCMP_UNE:
+        Result = (CmpResult != APFloatBase::cmpEqual);
+        break;
+      case FCmpInst::FCMP_TRUE:
+        Result = true;
+        break;
+      default:
+        llvm_unreachable("Invalid FCmp predicate");
+      }
----------------
nikic wrote:

I think we can replace this switch with `FCmpInst::compare()`?

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


More information about the llvm-commits mailing list