https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104049
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Before my patch we had on the gimple level: vect_sum_26.13_38 = VIEW_CONVERT_EXPR<vector(4) int>(vect__7.9_48); _36 = (vector(4) unsigned int) vect_sum_26.13_38; _35 = .REDUC_PLUS (_36); _34 = (int) _35; _44 = .REDUC_PLUS (vect__7.9_48); _20 = _34 & 65535; _10 = (unsigned int) _20; _12 = _44 >> 16; _13 = _10 + _12; _14 = _13 >> 1; _23 = (int) _14; After we get: _43 = .REDUC_PLUS (vect__7.11_47); _37 = _43 & 65535; _12 = _43 >> 16; _13 = _12 + _37; _14 = _13 >> 1; _23 = (int) _14; Which is obviously better really. So there is nothing to be done on the gimple level really. the only thing I can think of is how reducative plus is implemented.