https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111764
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- Shorter testcase, fails at -O2 -ftree-vectorize short b; int main() { b = 2; for (int a = 1; a <= 9; a++) b = b * b; if (b != 0) __builtin_abort (); } it "works" with unsigned short b because the non-path reduction detection doesn't allow two uses of 'b': t.c:5:21: note: Analyze phi: b_lsm.6_2 = PHI <powmult_3(7), 2(2)> t.c:5:21: missed: reduction used in loop. t.c:5:21: missed: Unknown def-use cycle pattern. but the path based reduction detection has /* We want to allow x + x but not x < 1 ? x : 2. */ if (is_gimple_assign (op_use_stmt) && gimple_assign_rhs_code (op_use_stmt) == COND_EXPR) which also allows x * x to slip through. Even when fixing the earlier issue of the initial value we end up with vect_b.13_27 = { 2, 1, 1, 1, 1, 1, 1, 1 }; vect_powmult_5.14_28 = vect_b.13_27 * vect_b.13_27; allowing x + x is only OK because it's 2 * x and we will actually never see it as x + x.