From a21672f8ee6c70c48cf6bd7909f890a432e73bc6 Mon Sep 17 00:00:00 2001 From: Govind Yadav Date: Fri, 4 Sep 2026 11:36:58 +0530 Subject: [PATCH 1/2] Fix 64-bit safe integer boundaries --- src/support/safe_integer.cpp | 6 ++---- test/gtest/CMakeLists.txt | 1 + test/gtest/safe-integer.cpp | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 test/gtest/safe-integer.cpp diff --git a/src/support/safe_integer.cpp b/src/support/safe_integer.cpp index 86ba2547a53..5e4f6974774 100644 --- a/src/support/safe_integer.cpp +++ b/src/support/safe_integer.cpp @@ -50,13 +50,11 @@ int32_t wasm::toSInteger32(double x) { } bool wasm::isUInteger64(double x) { - return !std::signbit(x) && isInteger(x) && - x <= static_cast(std::numeric_limits::max()); + return !std::signbit(x) && isInteger(x) && x < 0x1p64; } bool wasm::isSInteger64(double x) { - return isInteger(x) && x >= std::numeric_limits::min() && - x <= static_cast(std::numeric_limits::max()); + return isInteger(x) && x >= -0x1p63 && x < 0x1p63; } uint64_t wasm::toUInteger64(double x) { diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt index b0a73d21d1e..fcdab893ee9 100644 --- a/test/gtest/CMakeLists.txt +++ b/test/gtest/CMakeLists.txt @@ -31,6 +31,7 @@ set(unittest_SOURCES principal-type.cpp printing.cpp public-type-validator.cpp + safe-integer.cpp scc.cpp sizes.cpp span.cpp diff --git a/test/gtest/safe-integer.cpp b/test/gtest/safe-integer.cpp new file mode 100644 index 00000000000..e89fbc10263 --- /dev/null +++ b/test/gtest/safe-integer.cpp @@ -0,0 +1,19 @@ +#include +#include + +#include "support/safe_integer.h" +#include "gtest/gtest.h" + +TEST(SafeInteger, Unsigned64Boundaries) { + EXPECT_TRUE(wasm::isUInteger64(std::nextafter(0x1p64, 0.0))); + EXPECT_FALSE(wasm::isUInteger64(0x1p64)); + EXPECT_FALSE(wasm::isUInteger64(-0.0)); +} + +TEST(SafeInteger, Signed64Boundaries) { + EXPECT_FALSE(wasm::isSInteger64( + std::nextafter(-0x1p63, -std::numeric_limits::infinity()))); + EXPECT_TRUE(wasm::isSInteger64(-0x1p63)); + EXPECT_TRUE(wasm::isSInteger64(std::nextafter(0x1p63, 0.0))); + EXPECT_FALSE(wasm::isSInteger64(0x1p63)); +} From db3f9b9f021710ca1596831c8507bb80f45ff0fd Mon Sep 17 00:00:00 2001 From: Govind Yadav Date: Fri, 11 Sep 2026 17:08:31 +0530 Subject: [PATCH 2/2] Update safe integer boundary expectations --- test/lit/passes/inlining-optimizing_optimize-level=3.wast | 4 ++-- test/lit/passes/nontrapping-fptoint-lowering.wast | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/lit/passes/inlining-optimizing_optimize-level=3.wast b/test/lit/passes/inlining-optimizing_optimize-level=3.wast index f6df7305620..ea2346d1530 100644 --- a/test/lit/passes/inlining-optimizing_optimize-level=3.wast +++ b/test/lit/passes/inlining-optimizing_optimize-level=3.wast @@ -693,7 +693,7 @@ ;; CHECK-NEXT: (call $_frexp ;; CHECK-NEXT: (f64.mul ;; CHECK-NEXT: (local.get $0) - ;; CHECK-NEXT: (f64.const 18446744073709551615) + ;; CHECK-NEXT: (f64.const 18446744073709551616) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) @@ -793,7 +793,7 @@ (call $_frexp (f64.mul (local.get $0) - (f64.const 18446744073709551615) + (f64.const 18446744073709551616) ) (local.get $1) ) diff --git a/test/lit/passes/nontrapping-fptoint-lowering.wast b/test/lit/passes/nontrapping-fptoint-lowering.wast index e4598dcf9ff..bac38497d88 100644 --- a/test/lit/passes/nontrapping-fptoint-lowering.wast +++ b/test/lit/passes/nontrapping-fptoint-lowering.wast @@ -127,7 +127,7 @@ ;; CHECK-NEXT: (local.tee $7 ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (f32.const 18446744073709551615) + ;; CHECK-NEXT: (f32.const 18446744073709551616) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (f32.ge ;; CHECK-NEXT: (local.get $7) @@ -175,7 +175,7 @@ ;; CHECK-NEXT: (local.tee $9 ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (f64.const 18446744073709551615) + ;; CHECK-NEXT: (f64.const 18446744073709551616) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (f64.ge ;; CHECK-NEXT: (local.get $9)