https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118140
--- Comment #8 from Robin Dapp <rdapp at gcc dot gnu.org> --- The optimized tree looks good apart from 'd' and the return value :) <bb 2> [local count: 76665171]: e_lsm.8_12 = e; _55 = .MASK_LEN_LOAD (&MEM <_Bool[17]> [(void *)&f + 4B], 8B, { -1, ... }, _54(D), 13, 0); vect__10.16_59 = .VCOND_MASK_LEN ({ -1, ... }, _55, { 0, ... }, 13, 0); _61 = .REDUC_PLUS (vect__10.16_59); _62 = e_lsm.8_12 + _61; d = 1; e = _62; return 1; Already during/after vectorization we have: ... # prephitmp_41 = PHI <1(3)> # vect__10.16_60 = PHI <vect__10.16_59(3)> _61 = .REDUC_PLUS (vect__10.16_60); _62 = _61 + e_lsm.8_12; # .MEM_29 = VDEF <.MEM_46> dD.2785 = prephitmp_41; # .MEM_30 = VDEF <.MEM_29> eD.2786 = _62; # RANGE [irange] int [0, 1] MASK 0x1 VALUE 0x0 _13 = (intD.1) prephitmp_41; # VUSE <.MEM_30> return _13; where prephitmp_41 seems just wrong.