Algorithmic Structure in Weak Memory
and RDMA Verification
Stephan Spengler
Uppsala University, Sweden
10.03.2026
P ::= skip
| P1 ; P2
| P1 + P2
| P*
| x := v
| assume(x == v)
| mfence
x = 0
y = 0
P ::= skip | P1 ; P2 | P1 + P2 | P*
| x := vw | assume(x == vr)
| x := y | y := x
| rfence(n) | poll(n)
x = 1
y = 0
z = 0
w = 1
nrR(w, 1) lW(x, 2) nlR(x, 2) nrW(z, 2) nlW(y, 1)
nrR(w, 1) nlR(x, 1) nrW(z, 1) nlW(y, 1)
nrR(w, 1) nlW(y, 1) nlR(x, 1) nrW(z, 1)
nrR(w, 1) lW(x, 2) nlW(y, 1) nlR(x, 2) nrW(z, 2)
nrR(w, 1) lW(x, 2) nlR(x, 2) nrW(z, 2) nlW(y, 1)
⇓
nrR(w, 1) lW(x, 2) nlW(y, 1) nlR(x, 2) nrW(z, 2)
nrR(w, 1) lW(x, 2) nlW(y, 1) nlR(x, 2) nrW(z, 2)