From 3e299aac83b50f57926bb2f124a04d0ce09df6b4 Mon Sep 17 00:00:00 2001 From: Robert Szafarczyk Date: Fri, 18 Jul 2025 10:54:57 +0100 Subject: [PATCH] [SYCL][E2E] Avoid illegal failure order in compare_exchange_strong test The AtomicRef/compare_exchange_strong E2E test allowed `acq_rel` and `release` being passed as the failure memory order. This is not allowed by the SYCL AtomicRef spec (see Table 132), and might cause failures on some backends. This change explicitly sets the failure order argument in compare_exchange_strong, instead of relaying on an overload function, which used the same order for failure and success. --- sycl/test-e2e/AtomicRef/compare_exchange.h | 27 +++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/sycl/test-e2e/AtomicRef/compare_exchange.h b/sycl/test-e2e/AtomicRef/compare_exchange.h index 2ae2215ff0dd8..896b34f38ac06 100644 --- a/sycl/test-e2e/AtomicRef/compare_exchange.h +++ b/sycl/test-e2e/AtomicRef/compare_exchange.h @@ -49,7 +49,14 @@ void compare_exchange_local_test(queue q, size_t N) { : order, scope, space > (loc[0]); T result = T(N); // Avoid copying pointer - bool success = atm.compare_exchange_strong(result, (T)gid, order); + // From SYCL AtomicRef spec: The failure memory order of this atomic + // operation must be relaxed, acquire or seq_cst. + auto failure_order = + (order == memory_order::acq_rel || order == memory_order::release) + ? memory_order::relaxed + : order; + bool success = + atm.compare_exchange_strong(result, (T)gid, order, failure_order); if (success) { out[gid] = result; } else { @@ -99,7 +106,14 @@ void compare_exchange_global_test(queue q, size_t N) { : order, scope, space > (exc[0]); T result = T(N); // Avoid copying pointer - bool success = atm.compare_exchange_strong(result, (T)gid, order); + // From SYCL AtomicRef spec: The failure memory order of this atomic + // operation must be relaxed, acquire or seq_cst. + auto failure_order = + (order == memory_order::acq_rel || order == memory_order::release) + ? memory_order::relaxed + : order; + bool success = + atm.compare_exchange_strong(result, (T)gid, order, failure_order); if (success) { out[gid] = result; } else { @@ -140,7 +154,14 @@ void compare_exchange_global_test_usm_shared(queue q, size_t N) { : order, scope, space > (exc[0]); T result = initial; // Avoid copying pointer - bool success = atm.compare_exchange_strong(result, (T)gid, order); + // From SYCL AtomicRef spec: The failure memory order of this atomic + // operation must be relaxed, acquire or seq_cst. + auto failure_order = + (order == memory_order::acq_rel || order == memory_order::release) + ? memory_order::relaxed + : order; + bool success = + atm.compare_exchange_strong(result, (T)gid, order, failure_order); if (success) { output[gid] = result; } else {