https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114192
Tamar Christina <tnfchris at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Status|UNCONFIRMED |NEW Last reconfirmed| |2024-03-01 --- Comment #1 from Tamar Christina <tnfchris at gcc dot gnu.org> --- Confirmed. It looks like DCE6 no longer thinks: # sum_10 = PHI <sum_7(7), 0(11)> _1 = aD.4432[i_12]; sum_7 = _1 + sum_11; is dead after vectorization. it removes the only dead consumer of sum_7, a PHI node left over in the guard block which becomes unused after the reduction is vectorized. DCE says: marking necessary through sum_11 stmt sum_11 = PHI <sum_7(7), 0(11)> processing: sum_11 = PHI <sum_7(7), 0(11)> marking necessary through sum_7 stmt sum_7 = _1 + sum_11; processing: sum_7 = _1 + sum_11; marking necessary through _1 stmt _1 = a[i_12]; processing: _1 = a[i_12]; so it thinks the closed definition is needed? This seems to only happen with reductions, other live operations look fine: extern int a[1024]; int f4(int *x, int n) { int sum = 0; for (int i = 0; i < n; i++) { sum = a[i]; if (a[i] == 42) break; } return sum; }