https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65084
--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> --- I see the first testcase produces: .L2: vpand a+32(%rax), %ymm4, %ymm1 vpand a(%rax), %ymm4, %ymm0 addq $64, %rax vpaddw b-32(%rax), %ymm2, %ymm5 vpackuswb %ymm1, %ymm0, %ymm0 vpermq $216, %ymm0, %ymm0 vextracti128 $0x1, %ymm0, %xmm1 vpmovsxbw %xmm0, %ymm0 vpmovsxbw %xmm1, %ymm1 vpaddw %ymm3, %ymm0, %ymm0 vpaddw %ymm3, %ymm1, %ymm1 vpaddw %ymm5, %ymm1, %ymm1 vpaddw b-64(%rax), %ymm2, %ymm5 vmovdqa %ymm1, a-32(%rax) vpaddw %ymm5, %ymm0, %ymm0 vmovdqa %ymm0, a-64(%rax) cmpq $2048, %rax jne .L2 While the second one produces: .L6: vmovdqa a(%rax), %ymm3 vpaddw b(%rax), %ymm2, %ymm1 addq $32, %rax vpsllw $8, %ymm3, %ymm0 vpsraw $8, %ymm0, %ymm0 vpaddw %ymm1, %ymm0, %ymm0 vmovdqa %ymm0, a-32(%rax) cmpq $2048, %rax jne .L6