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).