https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107567
Bug ID: 107567 Summary: __atomic_test_and_set generates non-atomic code on armv6-m Product: gcc Version: 11.3.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: chris.n.copeland at gmail dot com Target Milestone: --- Created attachment 53847 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53847&action=edit test and set via __atomic_test_and_set and via _atomic_exchange armv6-m doesn't provide the the load/store exclusive instructions, and most of the atomic builtins are compiled to calls to functions that don't exist for that platform unless provided separately (e.g., using interrupt disable and memory barriers). __atomic_test_and_set however generates a non-atomic sequence no function calls or locking, etc. What I would expect is that the __atomic_test_and_set code generates a similar call as the other builtins do. Minimal example showing the problem: _Bool test_and_set(_Bool *flag) { return __atomic_test_and_set(flag, __ATOMIC_SEQ_CST); } compiled with: arm-none-eabi-gcc -S -Os -march=armv6-m -o test_and_set.S test_and_set.c There's no preprocessor use in the example. assembly output is this (directives and comments removed): test_and_set: movs r2, #1 ldrb r3, [r0] strb r2, [r0] uxtb r0, r3 bx lr Compare this with the equivalent operation using atomic exchange, compiled with the same options: _Bool test_and_set_exchange(_Bool *flag) { _Bool val = 1; _Bool ret; __atomic_exchange(flag, &val, &ret, __ATOMIC_SEQ_CST); return ret; } test_and_set_exchange: push {r4, lr} movs r2, #5 movs r1, #1 bl __atomic_exchange_1 pop {r4, pc} $ arm-none-eabi-gcc --version arm-none-eabi-gcc (Arm GNU Toolchain 11.3.Rel1) 11.3.1 20220712 Copyright (C) 2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Here is a godbolt link as well showing that `clang` generates a call to __atomic_exchange_1 in both cases: https://godbolt.org/z/an6TWqoq5