https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93820
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
On the original testcase, the reason why dse3 doesn't help is we have:
a[4] = 1;
_4 = *c.0_1;
a[5] = _4;
a[3] = 1;
e = 0;
a[8] = 0;
MEM <vector(4) int> [(int *)&a + 16B] = { 0, 0, 0, 0 };
and c.0_1 might alias the a array, so dse3 removes a[5] store as redundant, but
only later cddce removes the _4 = *c.0_1 load and only then the a[4] = 1; store
could be also removed (i.e. it would require iteration, or performing some kind
of (cheap) dce in the dse pass after removing each store).