https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99431
Bug ID: 99431 Summary: Return value of __builtin_memset() incorrect if partially optimized away Product: gcc Version: 9.3.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: jonathon.reinhart at gmail dot com Target Milestone: --- Created attachment 50319 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50319&action=edit Minimal example Please see attached code or https://godbolt.org/z/oTMhsd. If the address of a struct object is passed to __builtin_memset(), and some leading fields are assigned elsewhere in the function, GCC may effectively adjust the portion of the object written to by the memset(), to eliminate redundant writes. However, the return value of memset(), which should always match the first argument, is also (incorrectly) adjusted, leading to an invalid result. Specifically, this happens with -Os. I attempted to narrow this down to a specific set of optimizations by testing everything listed in the output of this command, but that was insufficient to reproduce the problem: gcc -Q -Os --help=optimizers I found it interesting, although not surprising, that adding this between the __builtin_memset() call and the "other" assignments caused the problem to go away: __asm__("" :::"memory"); GCC versions tested: 10.2 OK 10.1 OK 9.3 Broken 8.3 Broken 7.3 Broken 7.2 Broke 7.1 Broken 6.3 OK