https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120182
--- Comment #3 from mcccs at gmx dot com --- MEM <unsigned long> [(void *)2654208B] = 256; MEM[(char *)2654209B] = 0; MEM[(char *)2654210B] = 0; MEM[(char *)2654211B] = 0; MEM[(char *)2654212B] = 0; MEM[(char *)2654213B] = 0; MEM[(char *)2654214B] = 0; MEM[(char *)2654215B] = 0; _43 = MEM[(struct S *)2654208B].next; if (_43 != 0B) goto <bb 5>; [70.00%] else goto <bb 6>; [30.00%] <bb 5> [local count: 27834968]: # DEBUG BEGIN_STMT _43->next = 256B; Looking at the optimized pass output for the end of the 0th iteration and the 1st iteration afterwards, for some reason, in the 1st iteration: for(char *addr = (char *)s1; addr < (char *)s1 + sizeof(*s1); ++addr) was interpreted as for(char *addr = 1 + (char *)s1; addr < (char *)s1 + sizeof(*s1); ++addr) likewise for the end of 1st iteration and the 2nd iteration