Skip to content

Commit d1b75bd

Browse files
authored
c11_atomics: Filter invalid memory orders for 2 order instructions (#2506)
* OpenCL C (and SPIR-V) require that the failure memory order is not stronger than the success memory order. Also see Khronos internal memory model issue #181 CC @bashbaug
1 parent 2174715 commit d1b75bd

1 file changed

Lines changed: 26 additions & 10 deletions

File tree

test_conformance/c11_atomics/common.h

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,28 @@ class CBasicTestMemOrder2Scope
702702
cl_context context,
703703
cl_command_queue queue)
704704
{
705+
// Comparator for orders and scopes.
706+
const auto checkValidity = [](TExplicitMemoryOrderType success,
707+
TExplicitMemoryOrderType failure,
708+
TExplicitMemoryScopeType scope) {
709+
// Both memory order arguments must be set (or neither).
710+
if ((success == MEMORY_ORDER_EMPTY || failure == MEMORY_ORDER_EMPTY)
711+
&& success != failure)
712+
return false;
713+
714+
// Memory scope without memory order is disallowed.
715+
if (success == MEMORY_ORDER_EMPTY && scope != MEMORY_SCOPE_EMPTY)
716+
return false;
717+
718+
// Failure must not be release or acq_rel.
719+
if (failure == MEMORY_ORDER_RELEASE
720+
|| failure == MEMORY_ORDER_ACQ_REL)
721+
return false;
722+
723+
// Failure must not be stronger than success.
724+
return failure <= success;
725+
};
726+
705727
// repeat test for each reasonable memory order/scope combination
706728
std::vector<TExplicitMemoryOrderType> memoryOrder;
707729
std::vector<TExplicitMemoryScopeType> memoryScope;
@@ -719,16 +741,10 @@ class CBasicTestMemOrder2Scope
719741
{
720742
for (unsigned si = 0; si < memoryScope.size(); si++)
721743
{
722-
if ((memoryOrder[oi] == MEMORY_ORDER_EMPTY
723-
|| memoryOrder[o2i] == MEMORY_ORDER_EMPTY)
724-
&& memoryOrder[oi] != memoryOrder[o2i])
725-
continue; // both memory order arguments must be set (or
726-
// none)
727-
if ((memoryOrder[oi] == MEMORY_ORDER_EMPTY
728-
|| memoryOrder[o2i] == MEMORY_ORDER_EMPTY)
729-
&& memoryScope[si] != MEMORY_SCOPE_EMPTY)
730-
continue; // memory scope without memory order is not
731-
// allowed
744+
if (!checkValidity(memoryOrder[oi], memoryOrder[o2i],
745+
memoryScope[si]))
746+
continue;
747+
732748
MemoryOrder(memoryOrder[oi]);
733749
MemoryOrder2(memoryOrder[o2i]);
734750
MemoryScope(memoryScope[si]);

0 commit comments

Comments
 (0)