https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56049
--- Comment #18 from Richard Biener <rguenth at gcc dot gnu.org> --- So on trunk we are left with <bb 2> [0.01%]: a = {}; <bb 3> [1.39%]: # ivtmp.77_134 = PHI <ivtmp.77_135(3), 0(2)> prephitmp_170 = (integer(kind=4)) ivtmp.77_134; vect_cst__281 = {prephitmp_170, prephitmp_170, prephitmp_170, prephitmp_170}; vect__101.74_196 = vect_cst__281 + { 1, 1, 1, 1 }; ivtmp.77_135 = ivtmp.77_134 + 1; if (ivtmp.77_135 == 10000000) goto <bb 4>; [1.01%] else goto <bb 3>; [98.99%] <bb 4> [0.01%]: MEM[(c_char * {ref-all})&a] = vect__101.74_196; MEM[(c_char * {ref-all})&a + 16B] = vect__101.74_196; MEM[(c_char * {ref-all})&a + 32B] = vect__101.74_196; ... not too bad I'd say. If we'd use SCEV-ccp as a service then for example phi-only-cprop could clean this up (we'd need to teach SCEV about vectors though... ugh). Btw, it's IVOPTs that cleans up the load of IVs generated by PRE.