https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64716
Bug ID: 64716 Summary: Missed vectorization in a hot code of SPEC2000 ammp Product: gcc Version: 5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: vmakarov at gcc dot gnu.org Created attachment 34521 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=34521&action=edit Preprocessed rectmm.c from SPEC2000 amp GCC does not vectorize one of the hotest code in SPECFP2000 ammp (function mm_fv_update_nonbon in file rectmm.c) on x86-64 when -Ofast -march=core-avx2 -ffast-math -fno-schedule-insns2 is used. The preprocessed rectmm.i is in the attachment. The source code in the consideration is r0 = 1./(*vector)[j+3]; r = r0*r0; r = r*r*r; xt = a1->q*a2->q*dielectric*r0; yt = a1->a*a2->a*r; zt = a1->b*a2->b*r*r; k = xt - yt + zt; xt = xt*r0; yt = yt*r0; zt = zt*r0; k1 = xt - yt*6. + zt*12.; xt = xt*r0; yt = yt*r0; zt = zt*r0; k2 = xt*3.; ka2 = - yt*6.*8.; kb2 = zt*12.*14; k1 = -k1; xt = (*vector)[j]*r0 ; yt = (*vector)[j+1]*r0 ; zt = (*vector)[j+2] *r0; a1->VP += k; a2->dpx -= k1*xt; a1->dpx += k1*xt; a2->dpy -= k1*yt; a1->dpy += k1*yt; a2->dpz -= k1*zt; a1->dpz += k1*zt; xt2 = xt*xt; yt2 = yt*yt; zt2 = zt*zt; a2->qxx -= k2*(xt2 - 1./3) + ka2*(xt2 - 1./8)+kb2*(xt2-1./14) ; a1->qxx -= k2*(xt2 - 1./3) + ka2*(xt2 - 1./8)+kb2*(xt2-1./14) ; a2->qxy -= (k2+ka2+kb2)*yt*xt; a1->qxy -= (k2+ka2+kb2)*yt*xt; a2->qxz -= (k2+ka2+kb2)*zt*xt; a1->qxz -= (k2+ka2+kb2)*zt*xt; a2->qyy -= k2*(yt2 - 1./3) + ka2*(yt2 - 1./8)+kb2*(yt2-1./14) ; a1->qyy -= k2*(yt2 - 1./3) + ka2*(yt2 - 1./8)+kb2*(yt2-1./14) ; a2->qyz -= (k2+ka2+kb2)*yt*zt; a1->qyz -= (k2+ka2+kb2)*yt*zt; a2->qzz -= k2*(zt2 - 1./3) + ka2*(zt2 - 1./8)+kb2*(zt2-1./14) ; a1->qzz -= k2*(zt2 - 1./3) + ka2*(zt2 - 1./8)+kb2*(zt2-1./14) ; GCC on the trunk generates 118 insns .L85: .cfi_restore_state vmovsd .LC12(%rip), %xmm7 vdivsd %xmm0, %xmm7, %xmm6 vmulsd %xmm6, %xmm6, %xmm0 vmulsd %xmm0, %xmm0, %xmm10 vmulsd %xmm10, %xmm0, %xmm0 vmovsd 56(%rbx), %xmm12 vmulsd 56(%rdi), %xmm12, %xmm12 vmulsd %xmm4, %xmm12, %xmm12 vmulsd %xmm12, %xmm6, %xmm12 vmovsd 64(%rbx), %xmm10 vmulsd 64(%rdi), %xmm10, %xmm10 vmulsd %xmm10, %xmm0, %xmm11 vmovsd 72(%rbx), %xmm10 vmulsd 72(%rdi), %xmm10, %xmm10 vmulsd %xmm10, %xmm0, %xmm10 vmulsd %xmm0, %xmm10, %xmm10 vmulsd %xmm12, %xmm6, %xmm0 vmulsd %xmm11, %xmm6, %xmm1 vmulsd %xmm10, %xmm6, %xmm2 vmulsd .LC22(%rip), %xmm2, %xmm8 vfnmadd231sd %xmm9, %xmm1, %xmm8 vaddsd %xmm8, %xmm0, %xmm8 vmulsd .LC21(%rip), %xmm6, %xmm5 vmulsd %xmm0, %xmm5, %xmm5 vmulsd %xmm1, %xmm6, %xmm0 vxorpd %xmm15, %xmm0, %xmm0 vmulsd .LC24(%rip), %xmm0, %xmm3 vmulsd .LC25(%rip), %xmm6, %xmm7 vmulsd %xmm2, %xmm7, %xmm7 vxorpd %xmm15, %xmm8, %xmm8 movslq %esi, %rax vmulsd (%r12,%rax,8), %xmm6, %xmm2 leal 1(%rsi), %eax cltq vmulsd (%r12,%rax,8), %xmm6, %xmm1 leal 2(%rsi), %eax cltq vmulsd (%r12,%rax,8), %xmm6, %xmm0 vaddsd 208(%rbx), %xmm12, %xmm12 vaddsd %xmm12, %xmm10, %xmm10 vsubsd %xmm11, %xmm10, %xmm10 vmovsd %xmm10, 208(%rbx) vmovapd %xmm8, %xmm6 vfnmadd213sd 240(%rdi), %xmm2, %xmm6 vmovsd %xmm6, 240(%rdi) vmovapd %xmm8, %xmm6 vfmadd213sd 240(%rbx), %xmm2, %xmm6 vmovsd %xmm6, 240(%rbx) vmovapd %xmm8, %xmm6 vfnmadd213sd 248(%rdi), %xmm1, %xmm6 vmovsd %xmm6, 248(%rdi) vmovapd %xmm8, %xmm6 vfmadd213sd 248(%rbx), %xmm1, %xmm6 vmovsd %xmm6, 248(%rbx) vmovapd %xmm8, %xmm6 vfnmadd213sd 256(%rdi), %xmm0, %xmm6 vmovsd %xmm6, 256(%rdi) vfmadd213sd 256(%rbx), %xmm0, %xmm8 vmovsd %xmm8, 256(%rbx) vmovsd .LC26(%rip), %xmm8 vmovapd %xmm2, %xmm11 vfnmadd132sd %xmm2, %xmm8, %xmm11 vmulsd %xmm11, %xmm5, %xmm11 vmovsd .LC27(%rip), %xmm6 vmovapd %xmm2, %xmm10 vfnmadd132sd %xmm2, %xmm6, %xmm10 vmovapd %xmm10, %xmm12 vfmadd132sd %xmm7, %xmm11, %xmm12 vmovsd .LC28(%rip), %xmm10 vmovapd %xmm2, %xmm11 vfnmadd132sd %xmm2, %xmm10, %xmm11 vfmadd132sd %xmm3, %xmm12, %xmm11 vaddsd 264(%rdi), %xmm11, %xmm12 vmovsd %xmm12, 264(%rdi) vaddsd 264(%rbx), %xmm11, %xmm11 vmovsd %xmm11, 264(%rbx) vaddsd %xmm7, %xmm5, %xmm12 vaddsd %xmm12, %xmm3, %xmm12 vmulsd %xmm12, %xmm1, %xmm11 vmovapd %xmm2, %xmm13 vfnmadd213sd 272(%rdi), %xmm11, %xmm13 vmovsd %xmm13, 272(%rdi) vmovapd %xmm2, %xmm13 vfnmadd213sd 272(%rbx), %xmm11, %xmm13 vmovsd %xmm13, 272(%rbx) vmulsd %xmm0, %xmm2, %xmm2 vmovapd %xmm12, %xmm13 vfnmadd213sd 280(%rdi), %xmm2, %xmm13 vmovsd %xmm13, 280(%rdi) vfnmadd213sd 280(%rbx), %xmm12, %xmm2 vmovsd %xmm2, 280(%rbx) vmovapd %xmm1, %xmm2 vfnmadd132sd %xmm1, %xmm8, %xmm2 vmulsd %xmm2, %xmm5, %xmm12 vmovapd %xmm1, %xmm2 vfnmadd132sd %xmm1, %xmm6, %xmm2 vfmadd132sd %xmm7, %xmm12, %xmm2 vfnmadd132sd %xmm1, %xmm10, %xmm1 vfmadd132sd %xmm3, %xmm2, %xmm1 vaddsd 288(%rdi), %xmm1, %xmm2 vmovsd %xmm2, 288(%rdi) vaddsd 288(%rbx), %xmm1, %xmm1 vmovsd %xmm1, 288(%rbx) vmovapd %xmm0, %xmm1 vfnmadd213sd 296(%rdi), %xmm11, %xmm1 vmovsd %xmm1, 296(%rdi) vfnmadd213sd 296(%rbx), %xmm0, %xmm11 vmovsd %xmm11, 296(%rbx) vfnmadd231sd %xmm0, %xmm0, %xmm8 vmulsd %xmm8, %xmm5, %xmm5 vfnmadd231sd %xmm0, %xmm0, %xmm6 vfmadd132sd %xmm6, %xmm5, %xmm7 vfnmadd132sd %xmm0, %xmm10, %xmm0 vfmadd132sd %xmm3, %xmm7, %xmm0 vaddsd 304(%rdi), %xmm0, %xmm1 vmovsd %xmm1, 304(%rdi) vaddsd 304(%rbx), %xmm0, %xmm0 vmovsd %xmm0, 304(%rbx) LLVM-3.5 with -Ofast -ffast-math -march=core-avx2 generates 107 insns (10% less than GCC!): .LBB0_135: # %if.then1703 # in Loop: Header=BB0_132 Depth=3 leal (,%r15,4), %eax vmovsd .LCPI0_4(%rip), %xmm1 vdivsd %xmm0, %xmm1, %xmm1 vmulsd %xmm1, %xmm1, %xmm0 vmulsd %xmm0, %xmm0, %xmm2 vmulsd %xmm2, %xmm0, %xmm0 vmovsd 56(%r13), %xmm2 vmovsd 64(%r13), %xmm3 vmulsd 56(%rcx), %xmm2, %xmm2 vmovsd 368(%rsp), %xmm4 # 8-byte Reload vmulsd %xmm2, %xmm4, %xmm2 vmulsd %xmm2, %xmm1, %xmm2 vmulsd 64(%rcx), %xmm3, %xmm3 vmulsd %xmm3, %xmm0, %xmm3 vmovsd 72(%r13), %xmm4 vmulsd 72(%rcx), %xmm4, %xmm4 vmulsd %xmm0, %xmm0, %xmm0 vmulsd %xmm4, %xmm0, %xmm0 vsubsd %xmm3, %xmm2, %xmm4 vaddsd %xmm0, %xmm4, %xmm5 vmulsd %xmm2, %xmm1, %xmm2 vmulsd %xmm3, %xmm1, %xmm3 vmulsd %xmm0, %xmm1, %xmm0 vmovsd .LCPI0_9(%rip), %xmm4 vfmsub213sd %xmm2, %xmm3, %xmm4 vmovsd .LCPI0_10(%rip), %xmm6 vfmadd213sd %xmm4, %xmm0, %xmm6 vmulsd %xmm2, %xmm1, %xmm2 vmulsd %xmm3, %xmm1, %xmm4 vmulsd %xmm0, %xmm1, %xmm0 vmulsd .LCPI0_11(%rip), %xmm2, %xmm11 vmulsd .LCPI0_12(%rip), %xmm4, %xmm14 vmulsd .LCPI0_13(%rip), %xmm0, %xmm10 cltq vpermilpd $0, %xmm1, %xmm0 # xmm0 = xmm1[0,0] vmulpd (%r11,%rax,8), %xmm0, %xmm0 orl $2, %eax cltq vmulsd (%r11,%rax,8), %xmm1, %xmm9 vaddsd 208(%r13), %xmm5, %xmm5 vmovsd %xmm5, 208(%r13) vpermilpd $0, %xmm6, %xmm5 # xmm5 = xmm6[0,0] vmulpd %xmm0, %xmm5, %xmm5 vmovupd 240(%rcx), %xmm7 vsubpd %xmm5, %xmm7, %xmm7 vmovupd %xmm7, 240(%rcx) vaddpd 240(%r13), %xmm5, %xmm5 vmovupd %xmm5, 240(%r13) vmulsd %xmm6, %xmm9, %xmm5 vmovsd 256(%rcx), %xmm6 vsubsd %xmm5, %xmm6, %xmm6 vmovsd %xmm6, 256(%rcx) vaddsd 256(%r13), %xmm5, %xmm5 vmovsd %xmm5, 256(%r13) vmulsd %xmm0, %xmm0, %xmm5 vunpckhpd %xmm0, %xmm0, %xmm8 # xmm8 = xmm0[1,1] vmulsd %xmm8, %xmm8, %xmm15 vmulsd %xmm9, %xmm9, %xmm7 vmovsd .LCPI0_14(%rip), %xmm3 vaddsd %xmm3, %xmm5, %xmm1 vmovsd .LCPI0_15(%rip), %xmm4 vaddsd %xmm4, %xmm5, %xmm2 vmulsd %xmm2, %xmm14, %xmm2 vfmadd213sd %xmm2, %xmm11, %xmm1 vmovsd .LCPI0_16(%rip), %xmm6 vaddsd %xmm6, %xmm5, %xmm5 vfmadd213sd %xmm1, %xmm10, %xmm5 vaddsd %xmm3, %xmm15, %xmm1 vaddsd %xmm4, %xmm15, %xmm2 vmulsd %xmm2, %xmm14, %xmm2 vfmadd213sd %xmm2, %xmm11, %xmm1 vaddsd %xmm3, %xmm7, %xmm2 vaddsd %xmm4, %xmm7, %xmm3 vmulsd %xmm3, %xmm14, %xmm3 vfmadd213sd %xmm3, %xmm11, %xmm2 vaddsd %xmm14, %xmm11, %xmm3 vaddsd %xmm6, %xmm15, %xmm4 vfmadd213sd %xmm1, %xmm10, %xmm4 vaddsd %xmm6, %xmm7, %xmm1 vfmadd213sd %xmm2, %xmm10, %xmm1 vaddsd %xmm10, %xmm3, %xmm2 vmulsd %xmm2, %xmm8, %xmm3 vmulsd %xmm3, %xmm0, %xmm6 vunpcklpd %xmm6, %xmm5, %xmm5 # xmm5 = xmm5[0],xmm6[0] vmovupd 264(%rcx), %xmm6 vsubpd %xmm5, %xmm6, %xmm6 vmovupd %xmm6, 264(%rcx) vmovupd 264(%r13), %xmm6 vsubpd %xmm5, %xmm6, %xmm5 vmovupd %xmm5, 264(%r13) vmulsd %xmm2, %xmm9, %xmm2 vmulsd %xmm2, %xmm0, %xmm0 vunpcklpd %xmm4, %xmm0, %xmm0 # xmm0 = xmm0[0],xmm4[0] vmovupd 280(%rcx), %xmm2 vsubpd %xmm0, %xmm2, %xmm2 vmovupd %xmm2, 280(%rcx) vmovupd 280(%r13), %xmm2 vsubpd %xmm0, %xmm2, %xmm0 vmovupd %xmm0, 280(%r13) vmulsd %xmm3, %xmm9, %xmm0 vunpcklpd %xmm1, %xmm0, %xmm0 # xmm0 = xmm0[0],xmm1[0] vmovupd 296(%rcx), %xmm1 vsubpd %xmm0, %xmm1, %xmm1 vmovupd %xmm1, 296(%rcx) vmovupd 296(%r13), %xmm1 vsubpd %xmm0, %xmm1, %xmm0 vmovupd %xmm0, 296(%r13) It is achieved by vectorization, please see vsubpd and vmulpd in LLVM generated code.