diff --git a/model/cpp2w.cat b/model/cpp2w.cat index e010e3a8..1fb23883 100644 --- a/model/cpp2w.cat +++ b/model/cpp2w.cat @@ -27,7 +27,7 @@ let pscb = ([SC] | [F & SC]; hb?); scb; ([SC] | hb? ; [F & SC]) let pscf = [F & SC]; (hb | hb; eco; hb); [F & SC] let psc = pscb | pscf -let tecotsb = ([A]; (eco); [A])+; sb +let tecotsb = ([A]; (eco); [A \ NORETURN])+; sb let cnf = ((W * _) | (_ * W)) & loc \ ((IW * _) | (_ * IW)) let dr = (cnf & ext) \ (hb | hb^-1 | A * A | tecotsb | tecotsb^-1) diff --git a/tests/mp/mp-fetch-add.litmus b/tests/mp/mp-fetch-add.litmus new file mode 100644 index 00000000..666193cc --- /dev/null +++ b/tests/mp/mp-fetch-add.litmus @@ -0,0 +1,16 @@ +C mp-fetch-add +{ [x] = 0; [y] = 0; } + +P0 (int* x, int* y) { + atomic_store_explicit(x, 1, memory_order_relaxed); + atomic_thread_fence(memory_order_release); + atomic_store_explicit(y, 1, memory_order_relaxed); +} + +P1 (int* x, int* y) { + int r1 = atomic_fetch_add_explicit(y, 1, memory_order_release); + atomic_thread_fence(memory_order_acquire); + int r0 = atomic_load_explicit(x, memory_order_relaxed); +} + +exists (1:r0=0 /\ y=2) diff --git a/tests/mp/mp-store-add.litmus b/tests/mp/mp-store-add.litmus new file mode 100644 index 00000000..64c6bad8 --- /dev/null +++ b/tests/mp/mp-store-add.litmus @@ -0,0 +1,16 @@ +C mp-store-add +{ [x] = 0; [y] = 0; } + +P0 (int* x, int* y) { + atomic_store_explicit(x, 1, memory_order_relaxed); + atomic_thread_fence(memory_order_release); + atomic_store_explicit(y, 1, memory_order_relaxed); +} + +P1 (int* x, int* y) { + atomic_store_add_explicit(y, 1, memory_order_release); + atomic_thread_fence(memory_order_acquire); + int r0 = atomic_load_explicit(x, memory_order_relaxed); +} + +exists (1:r0=0 /\ y=2)