[llvm] [DAG] computeKnownFPClass - Add handling for AssertNoFPClass (PR #190185)

Joao Victor Amorim Vieira via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 2 07:58:52 PDT 2026


https://github.com/joaovam created https://github.com/llvm/llvm-project/pull/190185

Resolves #189478

Adds code to handle AssertNoFPClass in computeKnownFPClass and adds IR test coverage for X86.

>From b14426626c6f642e42ec675218ce001259b93643 Mon Sep 17 00:00:00 2001
From: joaovam <amorimvictorjoao3 at gmail.com>
Date: Thu, 2 Apr 2026 11:22:38 -0300
Subject: [PATCH] add computeKnownFpClass handling for AssertNoFPClass

---
 .../lib/CodeGen/SelectionDAG/SelectionDAG.cpp |  9 ++++++
 llvm/test/CodeGen/X86/known-fpclass.ll        | 29 +++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 60b1fc6a5166b..626066c7cc41c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -6094,6 +6094,15 @@ KnownFPClass SelectionDAG::computeKnownFPClass(SDValue Op,
     Known = KnownFPClass::bitcast(VT.getFltSemantics(), Bits);
     break;
   }
+  case ISD::AssertNoFPClass: {
+    Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
+                                InterestedClasses, Depth + 1);
+    FPClassTest AssertedClasses =
+        static_cast<FPClassTest>(Op->getConstantOperandVal(1));
+    Known.KnownFPClasses &= ~AssertedClasses;
+    break;
+  }
+
   default:
     if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
         Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
diff --git a/llvm/test/CodeGen/X86/known-fpclass.ll b/llvm/test/CodeGen/X86/known-fpclass.ll
index 020f0dd5f59d4..2eeefca850a10 100644
--- a/llvm/test/CodeGen/X86/known-fpclass.ll
+++ b/llvm/test/CodeGen/X86/known-fpclass.ll
@@ -29,3 +29,32 @@ define i1 @sqrt_neginf_v4f32(<4 x float> %a0, ptr %p1) {
   %res = tail call i1 @llvm.is.fpclass.f32(float %elt, i32 4)  ; 0x4 = "neginf"
   ret i1 %res
 }
+
+define i1 @demanded_elts_safe_lane(float %unknown) {
+; CHECK-LABEL: demanded_elts_safe_lane:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    retq
+  %vec1 = insertelement <2 x float> poison, float %unknown, i32 0
+  %vec2 = insertelement <2 x float> %vec1, float 1.000000e+00, i32 1
+
+  %ext = extractelement <2 x float> %vec2, i32 1
+
+  %cmp = fcmp uno float %ext, 0.000000e+00
+  ret i1 %cmp
+}
+
+define i1 @demanded_elts_unknown_lane(float %unknown) {
+; CHECK-LABEL: demanded_elts_unknown_lane:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vucomiss %xmm0, %xmm0
+; CHECK-NEXT:    setp %al
+; CHECK-NEXT:    retq
+  %vec1 = insertelement <2 x float> poison, float %unknown, i32 0
+  %vec2 = insertelement <2 x float> %vec1, float 1.000000e+00, i32 1
+
+  %ext = extractelement <2 x float> %vec2, i32 0
+
+  %cmp = fcmp uno float %ext, 0.000000e+00
+  ret i1 %cmp
+}



More information about the llvm-commits mailing list