https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108058
Bug ID: 108058 Summary: Missed optimization with O3 and m32 when unwinding a loop Product: gcc Version: 12.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: pionere at freemail dot hu Target Milestone: --- An unwinded loop produces a suboptimal code with O3 and m32 flags. Example: #include <stdint.h> void copyFunc(uint8_t* dst, uint8_t* src, int n) { while (n > 0) { *(uint32_t*)dst = *(uint32_t*)src; dst += 4; src += 4; n--; } } Since v 4.9.4 the loop is unwinded and produces two return points: ... .L1: pop ebx pop esi pop edi ret ... pop ebx pop esi pop edi ret Apparently this does not seem to happen if m32 is not set (probably there are enough registers to use).