diff --git a/sycl/include/sycl/ext/intel/esimd/memory.hpp b/sycl/include/sycl/ext/intel/esimd/memory.hpp index 7afde198b93eb..b9a105c4298a7 100644 --- a/sycl/include/sycl/ext/intel/esimd/memory.hpp +++ b/sycl/include/sycl/ext/intel/esimd/memory.hpp @@ -4089,15 +4089,22 @@ slm_atomic_update_impl(simd offsets, simd src0, constexpr lsc_data_size EDS = expand_data_size(finalize_data_size()); constexpr lsc_vector_size VS = to_lsc_vector_size<1>(); constexpr lsc_data_order Transposed = lsc_data_order::nontranspose; - using MsgT = typename lsc_expand_type::type; constexpr int IOp = lsc_to_internal_atomic_op(); - simd Msg_data = lsc_format_input(src0); - simd Tmp = - __esimd_lsc_xatomic_slm_1(pred.data(), offsets.data(), - Msg_data.data()); - return lsc_format_ret(Tmp); + if constexpr (std::is_same_v) { + return __esimd_lsc_xatomic_slm_1(pred.data(), offsets.data(), + src0.data()); + } else { + using MsgT = typename lsc_expand_type::type; + simd Msg_data = lsc_format_input(src0); + simd Tmp = + __esimd_lsc_xatomic_slm_1(pred.data(), offsets.data(), + Msg_data.data()); + return lsc_format_ret(Tmp); + } } /// SLM atomic. @@ -4126,16 +4133,23 @@ __ESIMD_API simd slm_atomic_update_impl(simd offsets, constexpr lsc_data_size EDS = expand_data_size(finalize_data_size()); constexpr lsc_vector_size VS = to_lsc_vector_size<1>(); constexpr lsc_data_order Transposed = lsc_data_order::nontranspose; - using MsgT = typename lsc_expand_type::type; constexpr int IOp = lsc_to_internal_atomic_op(); - simd Msg_data0 = lsc_format_input(src0); - simd Msg_data1 = lsc_format_input(src1); - simd Tmp = - __esimd_lsc_xatomic_slm_2(pred.data(), offsets.data(), - Msg_data0.data(), Msg_data1.data()); - return lsc_format_ret(Tmp); + if constexpr (std::is_same_v) { + return __esimd_lsc_xatomic_slm_2(pred.data(), offsets.data(), + src0.data(), src1.data()); + } else { + using MsgT = typename lsc_expand_type::type; + simd Msg_data0 = lsc_format_input(src0); + simd Msg_data1 = lsc_format_input(src1); + simd Tmp = + __esimd_lsc_xatomic_slm_2(pred.data(), offsets.data(), + Msg_data0.data(), Msg_data1.data()); + return lsc_format_ret(Tmp); + } } } // namespace detail diff --git a/sycl/test-e2e/ESIMD/unified_memory_api/Inputs/atomic_update_slm.hpp b/sycl/test-e2e/ESIMD/unified_memory_api/Inputs/atomic_update_slm.hpp index ea5fec0503ede..92f000711e137 100644 --- a/sycl/test-e2e/ESIMD/unified_memory_api/Inputs/atomic_update_slm.hpp +++ b/sycl/test-e2e/ESIMD/unified_memory_api/Inputs/atomic_update_slm.hpp @@ -612,8 +612,7 @@ bool test_fp_types(queue q) { if constexpr (Features == TestFeatures::DG2 || Features == TestFeatures::PVC) { - // TODO: fmin/max for double does not pass validation likely due to - // a driver bug. fcmpwr is hanging. + // TODO: fmin/fmax/fcmpxchg for double requires a newer GPU driver. if constexpr (!std::is_same_v, ImplLSCFmax> && !std::is_same_v, ImplLSCFmin> && !std::is_same_v, ImplLSCFcmpwr>) {