diff --git a/sycl/include/CL/sycl/ONEAPI/atomic_ref.hpp b/sycl/include/CL/sycl/ONEAPI/atomic_ref.hpp index 625a8902d9c86..c98c4f55857b8 100644 --- a/sycl/include/CL/sycl/ONEAPI/atomic_ref.hpp +++ b/sycl/include/CL/sycl/ONEAPI/atomic_ref.hpp @@ -454,9 +454,11 @@ class atomic_ref_impl< T fetch_add(T operand, memory_order order = default_read_modify_write_order, memory_scope scope = default_scope) const noexcept { auto load_order = detail::getLoadOrder(order); - T expected = load(load_order, scope); + T expected; T desired; do { + expected = + load(load_order, scope); // performs better with load in CAS loop. desired = expected + operand; } while (!compare_exchange_weak(expected, desired, order, scope)); return expected; @@ -563,9 +565,10 @@ class atomic_ref_impl memory_scope scope = default_scope) const noexcept { // TODO: Find a way to avoid compare_exchange here auto load_order = detail::getLoadOrder(order); - T *expected = load(load_order, scope); + T *expected; T *desired; do { + expected = load(load_order, scope); desired = expected + operand; } while (!compare_exchange_weak(expected, desired, order, scope)); return expected; diff --git a/sycl/include/CL/sycl/atomic.hpp b/sycl/include/CL/sycl/atomic.hpp index c14529736dd39..34770fbdbb5ee 100644 --- a/sycl/include/CL/sycl/atomic.hpp +++ b/sycl/include/CL/sycl/atomic.hpp @@ -237,8 +237,7 @@ class atomic { Ptr); cl_int TmpVal = __spirv_AtomicLoad( TmpPtr, SpirvScope, detail::getSPIRVMemorySemanticsMask(Order)); - cl_float ResVal; - detail::memcpy(&ResVal, &TmpVal, sizeof(TmpVal)); + cl_float ResVal = detail::bit_cast(TmpVal); return ResVal; } #else