kpdev42 added a comment.

At the moment, in case of compiler-rt, `__sync_add_and_fetch` boils down to
`__sync_add_and_fetch_N`, where `N` is the size of data being fetched (4 for 
int).
The implementation of `__sync_fetch_and_add_N` does approximately the following:

1. Sets memory barrier
2. Calls atomic load from memory location
3. Modifies data
4. Calls atomic store to memory location
5. Checks that operation is consistent, if not goes to step 2.

IMO, performance-wise there is not much difference (if any) between this and
modifying data with acquiring spinlock.

No code in compiler-rt disables interrupts, so it can and will be interrupted 
in the middle,
by a different thread however I don't see any problem in this.

Now if we are on a platform which doesn't support SMP we can use ordinary 
memory operations instead
of atomic ones, can't we?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D116088/new/

https://reviews.llvm.org/D116088

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to