[llvm] b7758ef - [KnownFPClass] Refine sNaN handling for asin/acos (#215159)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 12 06:44:04 PDT 2026
Author: ZERICO2005
Date: 2026-08-12T15:43:59+02:00
New Revision: b7758efbdf1d493ad1d9ff8bfad4309c588d504e
URL: https://github.com/llvm/llvm-project/commit/b7758efbdf1d493ad1d9ff8bfad4309c588d504e
DIFF: https://github.com/llvm/llvm-project/commit/b7758efbdf1d493ad1d9ff8bfad4309c588d504e.diff
LOG: [KnownFPClass] Refine sNaN handling for asin/acos (#215159)
Addresses
https://github.com/llvm/llvm-project/pull/213812#pullrequestreview-4877840442
`asin` and `acos` can only produce `sNaN` if the source is `sNaN`.
Otherwise finite arguments outside the range `-1.0 <= x <= +1.0` will
still produce `qNaN`.
Added:
Modified:
llvm/lib/Support/KnownFPClass.cpp
llvm/test/Transforms/Attributor/nofpclass-trig.ll
llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Support/KnownFPClass.cpp b/llvm/lib/Support/KnownFPClass.cpp
index eccd83451a05f..0d72e2317ef6f 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -644,6 +644,9 @@ KnownFPClass KnownFPClass::asin(const KnownFPClass &KnownSrc) {
// asin is bounded to [-pi/2, pi/2], never Inf.
Known.knownNot(fcInf);
+ if (KnownSrc.isKnownNever(fcSNan))
+ Known.knownNot(fcSNan);
+
// asin is sign-preserving.
if (KnownSrc.isKnownNever(fcNegative))
Known.knownNot(fcNegative);
@@ -660,6 +663,9 @@ KnownFPClass KnownFPClass::acos(const KnownFPClass &KnownSrc) {
Known.knownNot(fcInf);
Known.knownNot(fcNegative);
+ if (KnownSrc.isKnownNever(fcSNan))
+ Known.knownNot(fcSNan);
+
// NaN propagates. acos(x) is also NaN for |x| > 1, so we cannot rule
// out NaN without knowing the source is in [-1, 1].
return Known;
diff --git a/llvm/test/Transforms/Attributor/nofpclass-trig.ll b/llvm/test/Transforms/Attributor/nofpclass-trig.ll
index c832432d42e31..f4eb5ffc3c71b 100644
--- a/llvm/test/Transforms/Attributor/nofpclass-trig.ll
+++ b/llvm/test/Transforms/Attributor/nofpclass-trig.ll
@@ -137,9 +137,9 @@ define float @ret_asin_nonneg(float nofpclass(ninf nzero nsub nnorm) %arg) {
}
define float @ret_asin_nonan(float nofpclass(nan) %arg) {
-; CHECK-LABEL: define nofpclass(inf) float @ret_asin_nonan
+; CHECK-LABEL: define nofpclass(snan inf) float @ret_asin_nonan
; CHECK-SAME: (float nofpclass(nan) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf) float @llvm.asin.f32(float nofpclass(nan) [[ARG]]) #[[ATTR2]]
+; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf) float @llvm.asin.f32(float nofpclass(nan) [[ARG]]) #[[ATTR2]]
; CHECK-NEXT: ret float [[CALL]]
;
%call = call float @llvm.asin.f32(float %arg)
@@ -158,9 +158,9 @@ define float @ret_acos(float %arg) {
}
define float @ret_acos_nonan(float nofpclass(nan) %arg) {
-; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_acos_nonan
+; CHECK-LABEL: define nofpclass(snan inf nzero nsub nnorm) float @ret_acos_nonan
; CHECK-SAME: (float nofpclass(nan) [[ARG:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.acos.f32(float nofpclass(nan) [[ARG]]) #[[ATTR2]]
+; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(snan inf nzero nsub nnorm) float @llvm.acos.f32(float nofpclass(nan) [[ARG]]) #[[ATTR2]]
; CHECK-NEXT: ret float [[CALL]]
;
%call = call float @llvm.acos.f32(float %arg)
diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
index 9e3ed2f159b6f..95fda0a19c19f 100644
--- a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
@@ -1517,7 +1517,7 @@ TEST_F(AArch64GISelMITest, TestFPClassFAsinPos) {
Register SrcReg = FinalCopy->getOperand(1).getReg();
GISelValueTracking Info(*MF);
KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
- EXPECT_EQ(fcPosFinite | fcNan, Known.KnownFPClasses);
+ EXPECT_EQ(fcPosFinite | fcQNan, Known.KnownFPClasses);
EXPECT_EQ(std::nullopt, Known.SignBit);
}
@@ -1559,7 +1559,7 @@ TEST_F(AArch64GISelMITest, TestFPClassFAcosPos) {
Register SrcReg = FinalCopy->getOperand(1).getReg();
GISelValueTracking Info(*MF);
KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
- EXPECT_EQ(fcPosFinite | fcNan, Known.KnownFPClasses);
+ EXPECT_EQ(fcPosFinite | fcQNan, Known.KnownFPClasses);
EXPECT_EQ(std::nullopt, Known.SignBit);
}
More information about the llvm-commits
mailing list