https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84524
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- It reproduces even with __attribute__((noipa)) on foo, so the problem is just in that function. In assembly we can see: vpsllw $8, %zmm6, %zmm5 addq $64, %rdi vpmovzxwd %ymm5, %zmm0 vpcmpgtw %zmm5, %zmm2, %k1 vpslld $1, %zmm0, %zmm1 vextracti64x4 $0x1, %zmm5, %ymm0 vpmovzxwd %ymm0, %zmm0 vpslld $1, %zmm0, %zmm0 vpermt2w %zmm0, %zmm4, %zmm1 vpsllw $9, %zmm6, %zmm0 vpaddw %zmm7, %zmm6, %zmm6 vpxorq %zmm3, %zmm1, %zmm0 vpmovzxwd %ymm0, %zmm1 vpcmpgtw %zmm0, %zmm2, %k1 vpslld $1, %zmm1, %zmm5 vextracti64x4 $0x1, %zmm0, %ymm1 the compares into %k1 are useless, nothing really uses the %k1 afterwards, but it should be used for conditional moves (the cond ? (v << 1) ^ 0x1021 : (v << 9) conditional moves). Looking into this.