Skip to content

Commit ece9569

Browse files
authored
[SYCL] Avoid illegal order in compare_exchange_* (#19723)
The atomic_ref compare_exchange_* functions, which take only one memory order argument, call the respective compare_exchange_* functions, which take two memory order arguments, and use the same order for both the success and failure memory orders. This might result in UB where the 'acquire' or 'release' failure order is used. This commit ensures that an illegal failure order is never passed.
1 parent e6de775 commit ece9569

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

sycl/include/sycl/atomic_ref.hpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,14 @@ class atomic_ref_base {
232232
compare_exchange_strong(T &expected, T desired,
233233
memory_order order = default_read_modify_write_order,
234234
memory_scope scope = default_scope) const noexcept {
235-
return compare_exchange_strong(expected, desired, order, order, scope);
235+
memory_order success = order;
236+
memory_order failure = order;
237+
if (order == memory_order::acq_rel) {
238+
failure = memory_order::acquire;
239+
} else if (order == memory_order::release) {
240+
failure = memory_order::relaxed;
241+
}
242+
return compare_exchange_strong(expected, desired, success, failure, scope);
236243
}
237244

238245
bool
@@ -256,7 +263,14 @@ class atomic_ref_base {
256263
compare_exchange_weak(T &expected, T desired,
257264
memory_order order = default_read_modify_write_order,
258265
memory_scope scope = default_scope) const noexcept {
259-
return compare_exchange_weak(expected, desired, order, order, scope);
266+
memory_order success = order;
267+
memory_order failure = order;
268+
if (order == memory_order::acq_rel) {
269+
failure = memory_order::acquire;
270+
} else if (order == memory_order::release) {
271+
failure = memory_order::relaxed;
272+
}
273+
return compare_exchange_weak(expected, desired, success, failure, scope);
260274
}
261275

262276
protected:

0 commit comments

Comments
 (0)