This is an automated email from the ASF dual-hosted git repository.

raulcd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new a10f254cc3 GH-49921: [C++] Bump xsimd to 14.2.0 (#49922)
a10f254cc3 is described below

commit a10f254cc3f3ecea54b0da9743c83894bec46ef1
Author: Antoine Prouvost <[email protected]>
AuthorDate: Wed Jun 3 14:11:48 2026 +0200

    GH-49921: [C++] Bump xsimd to 14.2.0 (#49922)
    
    ### Rationale for this change
    - Fix for the current SVE ODR violation in the latest version
      https://github.com/xtensor-stack/xsimd/pull/1311
    - Pre-requisit to GH-45331
    
    ### What changes are included in this PR?
    Bump version and cleanup backports.
    
    ### Are these changes tested?
    Yes, in CI.
    
    ### Are there any user-facing changes?
    No
    
    * GitHub Issue: #49921
    
    Authored-by: AntoinePrv <[email protected]>
    Signed-off-by: Raúl Cumplido <[email protected]>
---
 c_glib/vcpkg.json                                  |  2 +-
 ci/conda_env_cpp.txt                               |  2 +-
 cpp/cmake_modules/ThirdpartyToolchain.cmake        |  2 +-
 cpp/src/arrow/util/bpacking_simd_kernel_internal.h | 92 ++--------------------
 cpp/thirdparty/versions.txt                        |  4 +-
 cpp/vcpkg.json                                     |  2 +-
 6 files changed, 13 insertions(+), 91 deletions(-)

diff --git a/c_glib/vcpkg.json b/c_glib/vcpkg.json
index 321f47bf63..e7919df65b 100644
--- a/c_glib/vcpkg.json
+++ b/c_glib/vcpkg.json
@@ -7,5 +7,5 @@
     "pkgconf"
   ],
   "$comment": "We can update builtin-baseline by 'vcpkg x-update-baseline'",
-  "builtin-baseline": "40c89449f0ccce12d21f8a906639f6c2c649b9e7"
+  "builtin-baseline": "9b965a116838c6cdcd36bca60d1b81b030c8ab8d"
 }
diff --git a/ci/conda_env_cpp.txt b/ci/conda_env_cpp.txt
index 470db4f8b9..e8a7d55239 100644
--- a/ci/conda_env_cpp.txt
+++ b/ci/conda_env_cpp.txt
@@ -47,6 +47,6 @@ rapidjson
 re2
 snappy
 thrift-cpp>=0.11.0
-xsimd>=14.0
+xsimd>=14.2
 zlib
 zstd
diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake 
b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index c08d0c4292..fd1752928e 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake
+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake
@@ -2858,7 +2858,7 @@ if(ARROW_USE_XSIMD)
                      IS_RUNTIME_DEPENDENCY
                      FALSE
                      REQUIRED_VERSION
-                     "14.0.0")
+                     "14.2.0")
 
   if(xsimd_SOURCE STREQUAL "BUNDLED")
     set(ARROW_XSIMD arrow::xsimd)
diff --git a/cpp/src/arrow/util/bpacking_simd_kernel_internal.h 
b/cpp/src/arrow/util/bpacking_simd_kernel_internal.h
index fe879bb5b0..83a969cca6 100644
--- a/cpp/src/arrow/util/bpacking_simd_kernel_internal.h
+++ b/cpp/src/arrow/util/bpacking_simd_kernel_internal.h
@@ -151,73 +151,6 @@ constexpr bool IsSse2 = std::is_base_of_v<xsimd::sse2, 
Arch>;
 template <typename Arch>
 constexpr bool IsAvx2 = std::is_base_of_v<xsimd::avx2, Arch>;
 
-/// Whether we are compiling for the Neon or above in the arm64 family.
-template <typename Arch>
-constexpr bool IsNeon = std::is_base_of_v<xsimd::neon, Arch>;
-
-/// Wrapper around ``xsimd::bitwise_lshift`` with optimizations for non 
implemented sizes.
-///
-/// We replace the variable left shift by a variable multiply with a power of 
two.
-///
-/// This trick is borrowed from Daniel Lemire and Leonid Boytsov, Decoding 
billions of
-/// integers per second through vectorization, Software Practice & Experience 
45 (1),
-/// 2015. http://arxiv.org/abs/1209.2137
-///
-/// TODO(xsimd) Tracking in https://github.com/xtensor-stack/xsimd/pull/1220
-/// When migrating, be sure to use batch_constant overload, and not the batch 
one.
-template <typename Arch, typename Int, Int... kShifts>
-ARROW_FORCE_INLINE auto left_shift(const xsimd::batch<Int, Arch>& batch,
-                                   xsimd::batch_constant<Int, Arch, 
kShifts...> shifts)
-    -> xsimd::batch<Int, Arch> {
-  constexpr bool kIsSse2 = IsSse2<Arch>;
-  constexpr bool kIsAvx2 = IsAvx2<Arch>;
-  static_assert(
-      !(kIsSse2 && kIsAvx2),
-      "In xsimd, an x86 arch is either part of the SSE family or of the AVX 
family,"
-      "not both. If this check fails, it means the assumptions made here to 
detect SSE "
-      "and AVX are out of date.");
-
-  constexpr auto kMults = xsimd::make_batch_constant<Int, 1, Arch>() << shifts;
-
-  constexpr auto IntSize = sizeof(Int);
-
-  // Sizes and architecture for which there is no variable left shift and 
there is a
-  // multiplication
-  if constexpr (                                                               
  //
-      (kIsSse2 && (IntSize == sizeof(uint16_t) || IntSize == 
sizeof(uint32_t)))  //
-      || (kIsAvx2 && (IntSize == sizeof(uint16_t)))                            
  //
-  ) {
-    return batch * kMults;
-  }
-
-  // Architecture for which there is no variable left shift on uint8_t but a 
fallback
-  // exists for uint16_t.
-  if constexpr ((kIsSse2 || kIsAvx2) && (IntSize == sizeof(uint8_t))) {
-    const auto batch16 = xsimd::bitwise_cast<uint16_t>(batch);
-
-    constexpr auto kShifts0 = select_stride<uint16_t, 0>(shifts);
-    const auto shifted0 = left_shift(batch16, kShifts0) & 0x00FF;
-
-    constexpr auto kShifts1 = select_stride<uint16_t, 1>(shifts);
-    const auto shifted1 = left_shift(batch16 & 0xFF00, kShifts1);
-
-    return xsimd::bitwise_cast<Int>(shifted0 | shifted1);
-  }
-
-  // TODO(xsimd) bug fixed in xsimd 14.1.0
-  // https://github.com/xtensor-stack/xsimd/pull/1266
-#if XSIMD_VERSION_MAJOR < 14 || ((XSIMD_VERSION_MAJOR == 14) && 
XSIMD_VERSION_MINOR == 0)
-  if constexpr (IsNeon<Arch>) {
-    using SInt = std::make_signed_t<Int>;
-    constexpr auto signed_shifts =
-        xsimd::batch_constant<SInt, Arch, static_cast<SInt>(kShifts)...>();
-    return xsimd::kernel::bitwise_lshift(batch, signed_shifts.as_batch(), 
Arch{});
-  }
-#endif
-
-  return batch << shifts;
-}
-
 /// Fallback for variable shift right.
 ///
 /// When we know that the relevant bits will not overflow, we can instead 
shift left all
@@ -243,9 +176,8 @@ ARROW_FORCE_INLINE auto right_shift_by_excess(
 
   constexpr auto IntSize = sizeof(Int);
 
-  // Architecture for which there is no variable right shift but a larger 
fallback exists.
-  // TODO(xsimd) Tracking for Avx2 in 
https://github.com/xtensor-stack/xsimd/pull/1220
-  // When migrating, be sure to use batch_constant overload, and not the batch 
one.
+  // Architectures for which there is no variable right shift but a larger 
fallback
+  // exists.
   if constexpr (kIsAvx2 && (IntSize == sizeof(uint8_t) || IntSize == 
sizeof(uint16_t))) {
     using twice_uint = SizedUint<2 * IntSize>;
 
@@ -262,27 +194,17 @@ ARROW_FORCE_INLINE auto right_shift_by_excess(
     return xsimd::bitwise_cast<Int>(shifted0 | shifted1);
   }
 
-  // These conditions are the ones matched in `left_shift`, i.e. the ones 
where variable
-  // shift right will not be available but a left shift (fallback) exists.
+  // Architectures for which there is no variable right shift but a left shift 
exists
+  // (possibly using the multiply trick inside of xsimd).
+  // We use a variable left shift and fixed right shift.
   if constexpr (kIsSse2 && (IntSize != sizeof(uint64_t))) {
     constexpr Int kMaxRShift = max_value(std::array{kShifts...});
 
     constexpr auto kLShifts =
         xsimd::make_batch_constant<Int, kMaxRShift, Arch>() - shifts;
 
-    return xsimd::bitwise_rshift<kMaxRShift>(left_shift(batch, kLShifts));
-  }
-
-  // TODO(xsimd) bug fixed in xsimd 14.1.0
-  // https://github.com/xtensor-stack/xsimd/pull/1266
-#if XSIMD_VERSION_MAJOR < 14 || ((XSIMD_VERSION_MAJOR == 14) && 
XSIMD_VERSION_MINOR == 0)
-  if constexpr (IsNeon<Arch>) {
-    using SInt = std::make_signed_t<Int>;
-    constexpr auto signed_shifts =
-        xsimd::batch_constant<SInt, Arch, static_cast<SInt>(kShifts)...>();
-    return xsimd::kernel::bitwise_rshift(batch, signed_shifts.as_batch(), 
Arch{});
+    return xsimd::bitwise_rshift<kMaxRShift>(batch << kLShifts);
   }
-#endif
 
   return batch >> shifts;
 }
@@ -1040,7 +962,7 @@ struct LargeKernel {
 
     const auto high_swizzled = xsimd::swizzle(bytes, kHighSwizzles);
     const auto high_words = xsimd::bitwise_cast<unpacked_type>(high_swizzled);
-    const auto high_shifted = left_shift(high_words, kHighLShifts);
+    const auto high_shifted = high_words << kHighLShifts;
 
     // We can have a single mask and apply it after OR because the shifts will 
ensure that
     // there are zeros where the high/low values are incomplete.
diff --git a/cpp/thirdparty/versions.txt b/cpp/thirdparty/versions.txt
index 2895247e9f..c6f4b01a71 100644
--- a/cpp/thirdparty/versions.txt
+++ b/cpp/thirdparty/versions.txt
@@ -115,8 +115,8 @@ 
ARROW_UTF8PROC_BUILD_SHA256_CHECKSUM=6f4f1b639daa6dca9f80bc5db1233e9cbaa31a67790
 # WIL (Windows Implementation Libraries) is required by Azure SDK on Windows 
for WinHTTP transport
 ARROW_WIL_BUILD_VERSION=v1.0.250325.1
 
ARROW_WIL_BUILD_SHA256_CHECKSUM=c9e667d5f86ded43d17b5669d243e95ca7b437e3a167c170805ffd4aa8a9a786
-ARROW_XSIMD_BUILD_VERSION=14.0.0
-ARROW_XSIMD_BUILD_SHA256_CHECKSUM=17de0236954955c10c09d6938d4c5f3a3b92d31be5dadd1d5d09fc1b15490dce
+ARROW_XSIMD_BUILD_VERSION=14.2.0
+ARROW_XSIMD_BUILD_SHA256_CHECKSUM=21e841ab684b05331e81e7f782431753a029ef7b7d9d6d3ddab837e7782a40ee
 ARROW_ZLIB_BUILD_VERSION=1.3.1
 
ARROW_ZLIB_BUILD_SHA256_CHECKSUM=9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23
 ARROW_ZSTD_BUILD_VERSION=1.5.7
diff --git a/cpp/vcpkg.json b/cpp/vcpkg.json
index 4b018476d2..1773c216b5 100644
--- a/cpp/vcpkg.json
+++ b/cpp/vcpkg.json
@@ -57,5 +57,5 @@
     "zstd"
   ],
   "$comment": "We can update builtin-baseline by 'vcpkg x-update-baseline'",
-  "builtin-baseline": "40c89449f0ccce12d21f8a906639f6c2c649b9e7"
+  "builtin-baseline": "9b965a116838c6cdcd36bca60d1b81b030c8ab8d"
 }

Reply via email to