https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102970
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- The gimple level looks correct: <bb 4> [local count: 8209314308]: # __cur_2 = PHI <__cur_149(5), _141(3)> # __first_156 = PHI <__first_148(5), &D.24777(3)> # prephitmp_155 = PHI <pretmp_3(5), 900(3)> # prephitmp_153 = PHI <pretmp_142(5), 11(3)> # prephitmp_108 = PHI <pretmp_109(5), 22(3)> # prephitmp_105 = PHI <pretmp_106(5), 33(3)> MEM[(int *)__cur_2] = prephitmp_155; MEM[(int *)__cur_2 + 4B] = prephitmp_153; MEM[(int *)__cur_2 + 8B] = prephitmp_108; MEM[(int *)__cur_2 + 12B] = prephitmp_105; __first_148 = __first_156 + 16; __cur_149 = __cur_2 + 16; if (&MEM <const struct box[19]> [(void *)&D.24777 + 304B] != __first_148) goto <bb 5>; [89.00%] else goto <bb 6>; [11.00%] <bb 5> [local count: 7306289739]: pretmp_3 = MEM[(int *)__first_148]; pretmp_142 = MEM[(int *)__first_148 + 4B]; pretmp_109 = MEM[(int *)__first_148 + 8B]; pretmp_106 = MEM[(int *)__first_148 + 12B]; goto <bb 4>; [100.00%] I suspect the rtl level unroller messes up the first iteration for the stores in the above case.