According to https://www.ibm.com/docs/en/xl-c-and-cpp-aix/16.1?topic=functions-compare-swap-compare-swaplp
XL's __compare_and_swap has a weird behavior that
In either case, the contents of the memory location specified by addr are copied into the memory location specified by old_val_addr.
(unlike c11 atomic_compare_exchange specified in http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf)
This patch let clang's implementation follow this behavior.