The underlying issue here was assumptions in WiredTiger about atomic loads and stores of 64-bit values.
In particular, we maintain a "current transaction ID" in the WT_TXN_GLOBAL struct, usually referred to as txn_global->current. When establishing a snapshot, we read that value into a local variable and rely on getting an atomic read. The local copy is then used to establish the snapshot. It is critical for correctness that allocated snapshot IDs are visible in the global transaction state table before and thread sees txn_global->current incremented. Otherwise, the result is an invalid transaction snapshot where values are visible before their transaction commits.
We update txn_global->currrent when a new transaction ID is allocated, and that is done inside a spinlock to guarantee uniqueness. The ID is published with a write barrier before executing ++txn_global->current, then the spinlock is released.
On x86, this is sufficient, and readers only see the increment after the ID is published. On PowerPC, we have seen a variety of results where reading txn_global->current results in unexpected values and thus invalid snapshots. Replacing the ordinary increment with an atomic_fetch_and_add eliminates these errors in testing.