https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108298
Bug ID: 108298 Summary: Wrong optimization of volatile access from gcc 11 and beyond Product: gcc Version: 12.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: daniel.lundin.mail at gmail dot com Target Milestone: --- Created attachment 54194 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54194&action=edit Example to reproduce incorrect optimizations Before gcc 11.0.0, the attached example compiled under -O3 would result in the whole function getting optimized into a single load instruction when volatile was not used. Adding a volatile access would lead to instructions for fetching the value from the stack getting generated. This appears to be conforming behavior, references ISO/IEC 9899:2018 5.1.2.3, particularly §2, §4 and §6. I believe gcc 10.4 or older behaves correctly. After gcc 11.0.0, the function is optimized regardless of if volatile is used or not. See attached example. With FREE_TO_OPTIMIZE defined, I would expect the compiler to optimize the code under -O3. Without it, I would expect the compiler to generate a read instruction since this is a "side effect". For convenience, here is also an online compiler example for x86-64 Linux https://godbolt.org/z/4qez1P746