[llvm] [Analysis] Adding convert_from_arbitrary_fp support in computeKnownFPClass. (PR #208585)

Chirag Patel via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 10 18:51:50 PDT 2026


================
@@ -0,0 +1,41 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT
+
+; Test 1: Float4E2M1FN has absolutely no NaN or Inf support. 
+; The Attributor should deduce and attach nofpclass(nan inf) to the function return.
+define float @ret_arbitrary_fp_no_nan_no_inf(i8 %bits) {
+; CHECK-LABEL: define nofpclass(nan inf) float @ret_arbitrary_fp_no_nan_no_inf
+; CHECK-SAME: (i8 [[BITS:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:    %fp = call nofpclass(nan inf) float @llvm.convert.from.arbitrary.fp.f32.i8(i8 [[BITS]], metadata !"Float4E2M1FN") #[[ATTR2:[0-9]+]]
+; CHECK-NEXT:    ret float %fp
+;
+  %fp = call float @llvm.convert.from.arbitrary.fp(i8 %bits, metadata !"Float4E2M1FN")
+  ret float %fp
+}
+
+; Test 2: Float8E4M3FN supports NaNs but lacks Infinities (NaNOnly).
+; The Attributor should safely deduce and attach nofpclass(inf) to the function return.
+define float @ret_arbitrary_fp_nan_only(i8 %bits) {
+; CHECK-LABEL: define nofpclass(inf) float @ret_arbitrary_fp_nan_only
+; CHECK-SAME: (i8 [[BITS:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:    %fp = call nofpclass(inf) float @llvm.convert.from.arbitrary.fp.f32.i8(i8 [[BITS]], metadata !"Float8E4M3FN") #[[ATTR2:[0-9]+]]
+; CHECK-NEXT:    ret float %fp
+;
+  %fp = call float @llvm.convert.from.arbitrary.fp(i8 %bits, metadata !"Float8E4M3FN")
+  ret float %fp
+}
+
+; Test 3: Vector variation checking that your getScalarType() unpacks cleanly.
+; The Attributor should successfully attach nofpclass(nan inf) to the returning vector topology.
+define <4 x float> @ret_arbitrary_fp_vector(<4 x i8> %bits) {
+; CHECK-LABEL: define nofpclass(nan inf) <4 x float> @ret_arbitrary_fp_vector
+; CHECK-SAME: (<4 x i8> [[BITS:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:    %fp = call nofpclass(nan inf) <4 x float> @llvm.convert.from.arbitrary.fp.v4f32.v4i8(<4 x i8> [[BITS]], metadata !"Float4E2M1FN") #[[ATTR2:[0-9]+]]
+; CHECK-NEXT:    ret <4 x float> %fp
+;
+  %fp = call <4 x float> @llvm.convert.from.arbitrary.fp.v4f32(<4 x i8> %bits, metadata !"Float4E2M1FN")
+  ret <4 x float> %fp
+}
+
----------------
ChiragPatel8 wrote:

Seems like lookup entries are not there while other things are present.

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


More information about the llvm-commits mailing list