| C ISA2+pooncerelease+poacquirerelease+poacquireonce | 
 |  | 
 | (* | 
 |  * Result: Never | 
 |  * | 
 |  * This litmus test demonstrates that a release-acquire chain suffices | 
 |  * to order P0()'s initial write against P2()'s final read.  The reason | 
 |  * that the release-acquire chain suffices is because in all but one | 
 |  * case (P2() to P0()), each process reads from the preceding process's | 
 |  * write.  In memory-model-speak, there is only one non-reads-from | 
 |  * (AKA non-rf) link, so release-acquire is all that is needed. | 
 |  *) | 
 |  | 
 | {} | 
 |  | 
 | P0(int *x, int *y) | 
 | { | 
 | 	WRITE_ONCE(*x, 1); | 
 | 	smp_store_release(y, 1); | 
 | } | 
 |  | 
 | P1(int *y, int *z) | 
 | { | 
 | 	int r0; | 
 |  | 
 | 	r0 = smp_load_acquire(y); | 
 | 	smp_store_release(z, 1); | 
 | } | 
 |  | 
 | P2(int *x, int *z) | 
 | { | 
 | 	int r0; | 
 | 	int r1; | 
 |  | 
 | 	r0 = smp_load_acquire(z); | 
 | 	r1 = READ_ONCE(*x); | 
 | } | 
 |  | 
 | exists (1:r0=1 /\ 2:r0=1 /\ 2:r1=0) |