https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63677
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
With the patch from PR63864 we still don't optimize:
<bb 2>:
vect_cst_.12_23 = { 0, 1, 2, 3 };
vect_cst_.11_32 = { 4, 5, 6, 7 };
vectp.14_2 = &a[0];
MEM[(int *)&a] = { 0, 1, 2, 3 };
vectp.14_21 = &a[0] + 16;
MEM[(int *)vectp.14_21] = { 4, 5, 6, 7 };
vectp_a.5_22 = &a;
vect__13.6_20 = MEM[(int *)&a];
this is because while seeing the candidate MEM[(int *)&a] = { 0, 1, 2, 3 };
for the load vect__13.6_20 = MEM[(int *)&a]; we fail to disambiguate
against the store to MEM[(int *)vectp.14_21] which is not simplified
to MEM[&a, 16] = { 4, 5, 6, 7 }; because DOM does not have the "trick"
of representing invariant-ptr + CST as &MEM[&..., CST'] for propagation.
If I fix that (huh, not sure why we don't simply fold the pointer-plus that
way,
now four places do that trick for propagation...) then it works:
LKUP STMT vect__13.6_20 = MEM[(int *)&a]
vect__13.6_20 = MEM[(int *)&a];
FIND: { 0, 1, 2, 3 }
Replaced redundant expr 'MEM[(int *)&a]' with '{ 0, 1, 2, 3 }'
t.c.183t.optimized:
foo ()
{
<bb 2>:
return 28;
}