http://gcc.gnu.org/bugzilla/show_bug.cgi?id=61108
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- The tree level looks fine at least to me: vect_val_8.15_127 = MEM[(const uint32_t *)vectp_vals.14_85]; vect_patt_47.16_128 = WIDEN_MULT_EVEN_EXPR <vect_val_8.15_127, { 613566757, 613566757, 613566757, 613566757 }>; vect_patt_47.16_129 = WIDEN_MULT_ODD_EXPR <vect_val_8.15_127, { 613566757, 613566757, 613566757, 613566757 }>; vect__11.18_130 = vect_patt_47.16_128 >> 32; vect__11.18_131 = vect_patt_47.16_129 >> 32; vect_q_12.19_132 = VEC_PACK_TRUNC_EXPR <vect__11.18_130, vect__11.18_131>; vect__13.20_133 = vect_q_12.19_132 + vect_val_8.15_127; vect_t_14.21_134 = vect__13.20_133 >> 1; But the assembly code looks broken: leaq (%rdi,%r8,4), %r8 movdqa .LC0(%rip), %xmm1 cmpl $2, %r10d movdqa (%r8), %xmm2 movdqa %xmm2, %xmm0 movdqa %xmm2, %xmm3 pmuludq %xmm1, %xmm0 psrlq $32, %xmm0 psrlq $32, %xmm3 <---- where did this come from? pmuludq %xmm1, %xmm3 psrlq $32, %xmm3 shufps $136, %xmm3, %xmm0 paddd %xmm2, %xmm0 psrld $1, %xmm0