[llvm] ValueTracking: Move sin/cos computeKnownFPClass handling to support (PR #178240)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 27 07:46:10 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-support

@llvm/pr-subscribers-llvm-analysis

Author: Matt Arsenault (arsenm)

<details>
<summary>Changes</summary>

These are the same for now but keep the separate names for future
use.

---
Full diff: https://github.com/llvm/llvm-project/pull/178240.diff


3 Files Affected:

- (modified) llvm/include/llvm/Support/KnownFPClass.h (+6) 
- (modified) llvm/lib/Analysis/ValueTracking.cpp (+2-3) 
- (modified) llvm/lib/Support/KnownFPClass.cpp (+15) 


``````````diff
diff --git a/llvm/include/llvm/Support/KnownFPClass.h b/llvm/include/llvm/Support/KnownFPClass.h
index b222bbe7bad9a..2ce4fcbe34bba 100644
--- a/llvm/include/llvm/Support/KnownFPClass.h
+++ b/llvm/include/llvm/Support/KnownFPClass.h
@@ -284,6 +284,12 @@ struct KnownFPClass {
   /// Report known values for exp, exp2 and exp10.
   LLVM_ABI static KnownFPClass exp(const KnownFPClass &Src);
 
+  /// Report known values for sin
+  LLVM_ABI static KnownFPClass sin(const KnownFPClass &Src);
+
+  /// Report known values for cos
+  LLVM_ABI static KnownFPClass cos(const KnownFPClass &Src);
+
   /// Return true if the sign bit must be 0, ignoring the sign of nans.
   bool signBitIsZeroOrNaN() const { return isKnownNever(fcNegative); }
 
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index a02ec1983b9b3..ffd26e55eac29 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -5218,9 +5218,8 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
       KnownFPClass KnownSrc;
       computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
                           KnownSrc, Q, Depth + 1);
-      Known.knownNot(fcInf);
-      if (KnownSrc.isKnownNeverNaN() && KnownSrc.isKnownNeverInfinity())
-        Known.knownNot(fcNan);
+      Known = IID == Intrinsic::sin ? KnownFPClass::sin(KnownSrc)
+                                    : KnownFPClass::cos(KnownSrc);
       break;
     }
     case Intrinsic::maxnum:
diff --git a/llvm/lib/Support/KnownFPClass.cpp b/llvm/lib/Support/KnownFPClass.cpp
index 30b355f8d4c90..6e92322ab4fe2 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -521,6 +521,21 @@ KnownFPClass KnownFPClass::sqrt(const KnownFPClass &KnownSrc,
   return Known;
 }
 
+KnownFPClass KnownFPClass::sin(const KnownFPClass &KnownSrc) {
+  KnownFPClass Known;
+
+  // Return NaN on infinite inputs.
+  Known.knownNot(fcInf);
+  if (KnownSrc.isKnownNeverNaN() && KnownSrc.isKnownNeverInfinity())
+    Known.knownNot(fcNan);
+
+  return Known;
+}
+
+KnownFPClass KnownFPClass::cos(const KnownFPClass &KnownSrc) {
+  return sin(KnownSrc);
+}
+
 KnownFPClass KnownFPClass::fpext(const KnownFPClass &KnownSrc,
                                  const fltSemantics &DstTy,
                                  const fltSemantics &SrcTy) {

``````````

</details>


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


More information about the llvm-commits mailing list