diff --git a/compiler-rt/lib/builtins/atomic.c b/compiler-rt/lib/builtins/atomic.c --- a/compiler-rt/lib/builtins/atomic.c +++ b/compiler-rt/lib/builtins/atomic.c @@ -233,10 +233,19 @@ return; LOCK_FREE_CASES(ptr); #undef LOCK_FREE_ACTION + int i; Lock *l = lock_for_pointer(ptr); lock(l); - memcpy(old, ptr, size); - memcpy(ptr, val, size); + if (val != old) { + memcpy(old, ptr, size); + memcpy(ptr, val, size); + } else { + for (i = 0; i < size; ++i) { + *((char *)ptr + i) ^= *((char *)old + i); + *((char *)old + i) ^= *((char *)ptr + i); + *((char *)ptr + i) ^= *((char *)old + i); + } + } unlock(l); }