[libc-commits] [libc] [libc][math] Fix subtraction of infinity in fputil::add_or_sub (PR #152017)

Krishna Pandey via libc-commits libc-commits at lists.llvm.org
Mon Aug 4 12:46:32 PDT 2025


https://github.com/krishna2803 updated https://github.com/llvm/llvm-project/pull/152017

>From 7678bcd7c3e40cce798f0ad85f6450d1d5482c68 Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81930 at gmail.com>
Date: Tue, 5 Aug 2025 00:39:41 +0530
Subject: [PATCH 1/4] fix: consider IsSub in finite - infinity case

Signed-off-by: Krishna Pandey <kpandey81930 at gmail.com>
---
 libc/src/__support/FPUtil/generic/add_sub.h | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/libc/src/__support/FPUtil/generic/add_sub.h b/libc/src/__support/FPUtil/generic/add_sub.h
index 7205d8d41f5bd..3f80191dcf017 100644
--- a/libc/src/__support/FPUtil/generic/add_sub.h
+++ b/libc/src/__support/FPUtil/generic/add_sub.h
@@ -87,8 +87,12 @@ add_or_sub(InType x, InType y) {
       return OutFPBits::inf(x_bits.sign()).get_val();
     }
 
-    if (y_bits.is_inf())
-      return OutFPBits::inf(y_bits.sign()).get_val();
+    if (y_bits.is_inf()) {
+      if constexpr (IsSub)
+        OutFPBits::inf(y_bits.sign().negate()).get_val();
+      else
+        return OutFPBits::inf(y_bits.sign()).get_val();
+    }
 
     if (x_bits.is_zero()) {
       if (y_bits.is_zero()) {

>From fd3e5ec2f1dfc8284b622ba47f09a09bc952c6ea Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81930 at gmail.com>
Date: Tue, 5 Aug 2025 00:40:37 +0530
Subject: [PATCH 2/4] chore: add unit tests for x - inf

Signed-off-by: Krishna Pandey <kpandey81930 at gmail.com>
---
 libc/test/src/math/smoke/SubTest.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/libc/test/src/math/smoke/SubTest.h b/libc/test/src/math/smoke/SubTest.h
index c344db28b7fc6..5fafde00778c0 100644
--- a/libc/test/src/math/smoke/SubTest.h
+++ b/libc/test/src/math/smoke/SubTest.h
@@ -47,6 +47,8 @@ class SubTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
     EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.zero));
     EXPECT_FP_EQ(inf, func(in.inf, in.neg_zero));
     EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.neg_zero));
+    EXPECT_FP_EQ(neg_inf, func(in.zero, in.inf));
+    EXPECT_FP_EQ(inf, func(in.zero, in.neg_inf));
   }
 
   void test_invalid_operations(SubFunc func) {

>From 30dca295ec0d394364fc2a1e352828d2eabf43ec Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81930 at gmail.com>
Date: Tue, 5 Aug 2025 00:46:13 +0530
Subject: [PATCH 3/4] fix: add missing return

---
 libc/src/__support/FPUtil/generic/add_sub.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/src/__support/FPUtil/generic/add_sub.h b/libc/src/__support/FPUtil/generic/add_sub.h
index 3f80191dcf017..d4a4129496640 100644
--- a/libc/src/__support/FPUtil/generic/add_sub.h
+++ b/libc/src/__support/FPUtil/generic/add_sub.h
@@ -89,7 +89,7 @@ add_or_sub(InType x, InType y) {
 
     if (y_bits.is_inf()) {
       if constexpr (IsSub)
-        OutFPBits::inf(y_bits.sign().negate()).get_val();
+        return OutFPBits::inf(y_bits.sign().negate()).get_val();
       else
         return OutFPBits::inf(y_bits.sign()).get_val();
     }

>From d6575f9bb95902266720533504f9445f4bf868b4 Mon Sep 17 00:00:00 2001
From: Krishna Pandey <kpandey81930 at gmail.com>
Date: Tue, 5 Aug 2025 01:16:15 +0530
Subject: [PATCH 4/4] chore: add more unit tests for Sub and Add

Signed-off-by: Krishna Pandey <kpandey81930 at gmail.com>
---
 libc/test/src/math/smoke/AddTest.h | 4 ++++
 libc/test/src/math/smoke/SubTest.h | 2 ++
 2 files changed, 6 insertions(+)

diff --git a/libc/test/src/math/smoke/AddTest.h b/libc/test/src/math/smoke/AddTest.h
index 68a4bbef01a2e..4bd794c91927e 100644
--- a/libc/test/src/math/smoke/AddTest.h
+++ b/libc/test/src/math/smoke/AddTest.h
@@ -47,6 +47,10 @@ class AddTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
     EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.zero));
     EXPECT_FP_EQ(inf, func(in.inf, in.neg_zero));
     EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.neg_zero));
+    EXPECT_FP_EQ(inf, func(in.zero, in.inf));
+    EXPECT_FP_EQ(inf, func(in.neg_zero, in.inf));
+    EXPECT_FP_EQ(neg_inf, func(in.zero, in.neg_inf));
+    EXPECT_FP_EQ(neg_inf, func(in.neg_zero, in.neg_inf));
   }
 
   void test_invalid_operations(AddFunc func) {
diff --git a/libc/test/src/math/smoke/SubTest.h b/libc/test/src/math/smoke/SubTest.h
index 5fafde00778c0..4ff4f3dbbbbad 100644
--- a/libc/test/src/math/smoke/SubTest.h
+++ b/libc/test/src/math/smoke/SubTest.h
@@ -48,7 +48,9 @@ class SubTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
     EXPECT_FP_EQ(inf, func(in.inf, in.neg_zero));
     EXPECT_FP_EQ(neg_inf, func(in.neg_inf, in.neg_zero));
     EXPECT_FP_EQ(neg_inf, func(in.zero, in.inf));
+    EXPECT_FP_EQ(neg_inf, func(in.neg_zero, in.inf));
     EXPECT_FP_EQ(inf, func(in.zero, in.neg_inf));
+    EXPECT_FP_EQ(inf, func(in.neg_zero, in.neg_inf));
   }
 
   void test_invalid_operations(SubFunc func) {



More information about the libc-commits mailing list