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.

Reply via email to