[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