[llvm] [KnownFPClass] Improve sign-preservation for `asin` (PR #216119)

Tim Gymnich via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 24 07:48:38 PDT 2026


https://github.com/tgymnich updated https://github.com/llvm/llvm-project/pull/216119

>From 322011caf541925595e363d2d79c806e1c29bc11 Mon Sep 17 00:00:00 2001
From: zerico <zerico2005 at gmail.com>
Date: Thu, 13 Aug 2026 11:01:30 -0600
Subject: [PATCH] [KnownFPClass] Improve sign-preservation for asin

---
 llvm/lib/Support/KnownFPClass.cpp                 |  6 +++---
 llvm/test/Transforms/Attributor/nofpclass-trig.ll | 10 ++++++++++
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Support/KnownFPClass.cpp b/llvm/lib/Support/KnownFPClass.cpp
index ac9406ecd0280..dccf7b6c49371 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -658,9 +658,9 @@ KnownFPClass KnownFPClass::asin(const KnownFPClass &KnownSrc) {
 
   Known.propagateNonSNaN(KnownSrc);
 
-  // asin is sign-preserving.
-  if (KnownSrc.isKnownNever(fcNegative))
-    Known.knownNot(fcNegative);
+  // asin is sign-preserving for finite arguments.
+  if (KnownSrc.isKnownNever(fcNegFinite))
+    Known.knownNot(fcNegFinite);
 
   // NaN propagates. asin(x) is also NaN for |x| > 1, so we cannot rule
   // out NaN without knowing the source is in [-1, 1].
diff --git a/llvm/test/Transforms/Attributor/nofpclass-trig.ll b/llvm/test/Transforms/Attributor/nofpclass-trig.ll
index a2d6a19975041..7a6c583653650 100644
--- a/llvm/test/Transforms/Attributor/nofpclass-trig.ll
+++ b/llvm/test/Transforms/Attributor/nofpclass-trig.ll
@@ -136,6 +136,16 @@ define float @ret_asin_nonneg(float nofpclass(ninf nzero nsub nnorm) %arg) {
   ret float %call
 }
 
+define float @ret_asin_nonnegfinite(float nofpclass(nzero nsub nnorm) %arg) {
+; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @ret_asin_nonnegfinite
+; CHECK-SAME: (float nofpclass(nzero nsub nnorm) [[ARG:%.*]]) #[[ATTR1]] {
+; CHECK-NEXT:    [[CALL:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.asin.f32(float nofpclass(nzero nsub nnorm) [[ARG]]) #[[ATTR2]]
+; CHECK-NEXT:    ret float [[CALL]]
+;
+  %call = call float @llvm.asin.f32(float %arg)
+  ret float %call
+}
+
 define float @ret_asin_nonan(float nofpclass(nan) %arg) {
 ; CHECK-LABEL: define nofpclass(snan inf) float @ret_asin_nonan
 ; CHECK-SAME: (float nofpclass(nan) [[ARG:%.*]]) #[[ATTR1]] {



More information about the llvm-commits mailing list