Fair enough, I tried with starm-clang and it's trying to compile atomic_load()/atomic_store() into function calls, which is nonsense (GCC is doing the right thing). I guess, if one has no other choice for the toolchain, they would have to implement their own load/store as macros that expand into a combination of __DMB() and assignment (or whatever makes sense on the processor).
The point however still stands that an SPSC queue, a loop checking a ready-flag, and other simple cases need read-acquire and write-release operations. Volatile qualifiers do not implement those, with the exception of single core (maybe also multicore x86) + every single memory access being volatile. Relying on either is a recipe for future headaches in my opinion, but then everyone has their own approach to things.