https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103585

--- Comment #2 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
Doing some basic perfing shows that perdida seems to account for about 36% of
runtime of the benchmark and has interesting property that most of time it will
return without looping (and that probbly explains PR103592).  It is not clear
to me why one runs faster than other - we do a lot of spilling in both paths.

This is comparing with -fno-tree-vectorize -fno-tree-slp-vectorize since I find
it easier to parse

  36.91%  a.out-slow  a.out-slow            [.]
__perdida_m_MOD_perdida.constprop.0
  34.15%  a.out-fast  a.out-fast            [.] MAIN__                          
  17.96%  a.out-slow  a.out-slow            [.] MAIN__                          
   7.37%  a.out-slow  a.out-slow            [.]
__perdida_m_MOD_generalized_hookes_law.constprop.0.isra.0
   2.43%  a.out-fast  a.out-fast            [.]
__perdida_m_MOD_generalized_hookes_law.constprop.0.isra.0
   0.24%  a.out-slow  a.out-slow            [.]
__perdida_m_MOD_generalized_hookes_law.constprop.1.isra.0
   0.21%  a.out-fast  a.out-fast            [.]
__perdida_m_MOD_generalized_hookes_law.constprop.1.isra.0

perdida:
       │                                                             ◆
       │     0000000000402500 <__perdida_m_MOD_perdida.constprop.0>: ▒
       │     __perdida_m_MOD_perdida.constprop.0():                  ▒
  1.37 │       push         %rbp                                     ▒
  0.00 │       vxorpd       %xmm13,%xmm13,%xmm13                     ▒
       │       mov          %rsp,%rbp                                ▒
  0.00 │       push         %r15                                     ▒
  2.07 │       push         %r14                                     ▒
  0.01 │       mov          %rdx,%r15                                ▒
  0.00 │       push         %r13                                     ▒
  0.00 │       push         %r12                                     ▒
  0.69 │       push         %rbx                                     ▒
  0.01 │       sub          $0x3c8,%rsp                              ▒
  0.01 │       mov          0x30(%rbp),%rax                          ▒
  0.02 │       vmovsd       (%rsi),%xmm6                             ▒
  0.01 │       mov          %rcx,-0x300(%rbp)                        ▒
  2.01 │       vmovsd       (%rdx),%xmm1                             ▒
  0.00 │       mov          %rdi,-0x380(%rbp)                        ▒
  0.01 │       mov          %r8,-0x388(%rbp)                         ▒
  0.04 │       lea          -0x240(%rbp),%rdi                        ▒
  0.00 │       mov          %r9,-0x390(%rbp)                         ▒
  0.66 │       mov          %rsi,-0x308(%rbp)                        ▒
  0.03 │       lea          -0x2a0(%rbp),%rsi                        ▒
  0.00 │       movq         $0x1,-0x218(%rbp)                        ▒
  0.01 │       movq         $0x3,-0x200(%rbp)                        ▒
  0.66 │       movq         $0x3,-0x260(%rbp)                        ▒
  0.02 │       mov          (%rax),%rbx                              ▒
  0.06 │       mov          0x38(%rbp),%rax                          ▒
  0.00 │       vmovsd       %xmm6,-0x3d8(%rbp)                       ▒
  0.08 │       vmovsd       %xmm1,-0x3e0(%rbp)                       ▒
  0.65 │       mov          %rbx,-0x240(%rbp)                        ▒
  0.74 │       mov          (%rax),%r14                              ▒
  0.67 │       mov          0x40(%rbp),%rax                          ▒
  0.01 │       mov          (%rax),%r13                              ▒
  0.74 │       mov          0x58(%rbp),%rax                          ▒
  0.00 │       mov          (%rax),%r12                              ▒
  0.70 │       mov          0x48(%rbp),%rax                          ▒
  0.00 │       mov          (%rax),%rax                              ▒
  0.69 │       mov          %rax,-0x310(%rbp)                        ▒
  0.00 │       mov          %rsp,%rax                                ▒
  0.00 │       sub          $0x50,%rsp                               ▒
       │       mov          %rsp,%rcx                                ▒
  0.00 │       mov          %rax,-0x2f8(%rbp)                        ▒
  0.01 │       mov          %rcx,-0x2a0(%rbp)                        ▒
  0.01 │       vmovsd       (%r14),%xmm0                             ▒
  0.68 │       vsubsd       0x0(%r13),%xmm0,%xmm0                    ▒
  2.85 │       vmovsd       %xmm0,(%rsp)                             ▒
  2.09 │       vmovsd       0x8(%r14),%xmm0                          ▒
  0.00 │       vsubsd       0x8(%r13),%xmm0,%xmm0                    ▒
  0.01 │       vmovsd       %xmm0,0x8(%rcx)                          ▒
  0.70 │       vmovsd       0x10(%r14),%xmm0                         ▒
  0.01 │       vsubsd       0x10(%r13),%xmm0,%xmm0                   ▒
  0.02 │       vmovsd       %xmm0,0x10(%rcx)                         ▒
  0.69 │       vmovsd       0x18(%r14),%xmm0                         ▒
  0.00 │       vsubsd       0x18(%r13),%xmm0,%xmm0                   ▒
  0.59 │       vmovsd       %xmm0,0x18(%rcx)                         ▒
  1.83 │       vmovsd       0x20(%r14),%xmm0                         ▒
  0.00 │       vsubsd       0x20(%r13),%xmm0,%xmm0                   ▒
  0.02 │       vmovsd       %xmm0,0x20(%rcx)                         ▒
  0.72 │       vmovsd       0x28(%r14),%xmm0                         ◆
  0.00 │       vsubsd       0x28(%r13),%xmm0,%xmm0                   ▒
  0.01 │       vmovsd       %xmm0,0x28(%rcx)                         ▒
  0.13 │       vmovsd       0x30(%r14),%xmm0                         ▒
  0.01 │       vsubsd       0x30(%r13),%xmm0,%xmm0                   ▒
  0.01 │       vmovsd       %xmm0,0x30(%rcx)                         ▒
  0.70 │       vmovsd       0x38(%r14),%xmm0                         ▒
  0.00 │       vsubsd       0x38(%r13),%xmm0,%xmm0                   ▒
  0.02 │       vmovsd       %xmm0,0x38(%rcx)                         ▒
  0.69 │       vmovsd       0x40(%r14),%xmm0                         ▒
  0.00 │       vsubsd       0x40(%r13),%xmm0,%xmm0                   ▒
  0.01 │       vmovsd       %xmm0,0x40(%rcx)                         ▒
  0.70 │       vmovsd       %xmm6,%xmm6,%xmm0                        ▒
  0.00 │     → call         __perdida_m_MOD_generalized_hookes_law.co▒
  0.00 │       mov          0x68(%rbp),%rax                          ▒
  0.00 │       vmovsd       delim.4+0xc,%xmm1                        ▒
  0.00 │       mov          -0x2f8(%rbp),%rsp                        ▒
  0.01 │       mov          -0x308(%rbp),%r10                        ▒
  0.01 │       vmovsd       (%rax),%xmm4                             ▒
  0.01 │       vsubsd       %xmm4,%xmm1,%xmm8                        ▒
  0.04 │       vmulsd       (%rbx),%xmm8,%xmm2                       ▒
  1.46 │       vmulsd       0x20(%rbx),%xmm8,%xmm1                   ▒
  3.40 │       vcomisd      %xmm13,%xmm4                             ▒
  0.00 │       vmulsd       0x40(%rbx),%xmm8,%xmm0                   ▒
  0.75 │       vmulsd       0x8(%rbx),%xmm8,%xmm9                    ▒
  0.11 │       vmulsd       0x10(%rbx),%xmm8,%xmm6                   ▒
  0.13 │       vmulsd       0x18(%rbx),%xmm8,%xmm11                  ▒
  0.00 │       vaddsd       %xmm1,%xmm2,%xmm3                        ▒
  0.01 │       vmovsd       %xmm2,(%rbx)                             ▒
  0.01 │       vmulsd       0x28(%rbx),%xmm8,%xmm5                   ▒
  0.02 │       vmovsd       %xmm1,0x20(%rbx)                         ▒
  0.00 │       vmulsd       0x30(%rbx),%xmm8,%xmm10                  ▒
  0.60 │       vaddsd       %xmm0,%xmm3,%xmm3                        ▒
  1.50 │       vmovsd       %xmm9,0x8(%rbx)                          ▒
  0.01 │       vmulsd       0x38(%rbx),%xmm8,%xmm7                   ▒
  0.00 │       vmovsd       %xmm0,0x40(%rbx)                         ▒
       │       vmovsd       %xmm6,0x10(%rbx)                         ▒
  0.00 │       vmovsd       %xmm11,0x18(%rbx)                        ▒
  0.01 │       vmovsd       %xmm5,0x28(%rbx)                         ▒
  0.02 │       vmovsd       %xmm10,0x30(%rbx)                        ▒
  0.02 │       vmovsd       %xmm7,0x38(%rbx)                         ▒
  0.69 │     ↓ jbe          207                                      ▒
  0.00 │       vcomisd      0xd6e2f(%rip),%xmm3        # 4d9530 <deli▒
  0.86 │     ↓ jb           cf3                                      ▒
  0.24 │207:   vmovsd       delim.4+0x1c,%xmm7                       ▒
  0.01 │       mov          delim.4+0xc,%rax                         ▒
  0.00 │       mov          %rax,-0x330(%rbp)                        ▒
  0.86 │     ↓ jb           cf3                                      ▒
  0.24 │207:   vmovsd       delim.4+0x1c,%xmm7                       ▒
  0.01 │       mov          delim.4+0xc,%rax                         ▒
  0.00 │       mov          %rax,-0x330(%rbp)                        ▒
  0.00 │       vmulsd       %xmm7,%xmm3,%xmm6                        ▒
  1.78 │       vmovsd       %xmm6,-0x2f8(%rbp)                       ▒
  0.45 │229:   vmovsd       %xmm7,-0x3a8(%rbp)                       ▒
  0.00 │       vmovsd       -0x2f8(%rbp),%xmm7                       ▒
  5.12 │       vmovsd       0x8(%rbx),%xmm5                          ▒
  0.02 │       vmovsd       0x10(%rbx),%xmm4                         ▒
  0.04 │       vmovsd       0x18(%rbx),%xmm3                         ▒
  0.01 │       vmovsd       0x28(%rbx),%xmm15                        ▒
  0.03 │       vmovsd       0x38(%rbx),%xmm9                         ◆
  0.04 │       vmovsd       0x30(%rbx),%xmm14                        ▒
  0.03 │       vsubsd       %xmm7,%xmm2,%xmm6                        ▒
  2.00 │       vmovsd       delim.4+0xc,%xmm2                        ▒
  0.00 │       vsubsd       %xmm7,%xmm1,%xmm1                        ▒
  0.69 │       vsubsd       %xmm7,%xmm0,%xmm7                        ▒
  0.69 │       vmovsd       %xmm5,-0x350(%rbp)                       ▒
  0.00 │       vmovsd       %xmm4,-0x358(%rbp)                       ▒
  0.01 │       vmovsd       %xmm3,-0x360(%rbp)                       ▒
  0.01 │       vmovsd       %xmm6,-0x338(%rbp)                       ▒
  0.68 │       vmovsd       %xmm1,-0x340(%rbp)                       ▒
  0.69 │       vmovsd       %xmm9,-0x378(%rbp)                       ▒
  0.01 │       vmovsd       %xmm15,-0x368(%rbp)                      ▒
  0.02 │       vmovsd       %xmm14,-0x370(%rbp)                      ▒
  0.01 │       vmovsd       %xmm7,-0x348(%rbp)                       ▒
  0.68 │       vdivsd       %xmm8,%xmm2,%xmm8                        ▒
  0.03 │       vmulsd       %xmm5,%xmm8,%xmm11                       ▒
  0.03 │       vsubsd       0x8(%r12),%xmm11,%xmm0                   ▒
  0.01 │       vmulsd       %xmm4,%xmm8,%xmm5                        ▒
  0.00 │       vmulsd       %xmm6,%xmm8,%xmm6                        ▒
  0.04 │       vsubsd       (%r12),%xmm6,%xmm4                       ▒
  0.72 │       vmulsd       %xmm3,%xmm8,%xmm12                       ▒
  0.00 │       vmovsd       %xmm5,-0x318(%rbp)                       ▒
  0.02 │       vmulsd       %xmm1,%xmm8,%xmm10                       ▒
  0.00 │       vsubsd       0x18(%r12),%xmm12,%xmm1                  ▒
  0.01 │       vmulsd       %xmm15,%xmm8,%xmm3                       ▒
  0.00 │       vmovsd       %xmm6,-0x320(%rbp)                       ▒
  0.02 │       vmulsd       %xmm0,%xmm0,%xmm0                        ▒
  0.10 │       vmulsd       %xmm9,%xmm8,%xmm2                        ▒
  0.64 │       vsubsd       0x28(%r12),%xmm3,%xmm9                   ▒
  0.01 │       vmovsd       %xmm3,-0x308(%rbp)                       ▒
  0.01 │       vfmadd132sd  %xmm4,%xmm0,%xmm4                        ▒
  2.70 │       vsubsd       0x10(%r12),%xmm5,%xmm0                   ▒
  0.00 │       vmulsd       %xmm14,%xmm8,%xmm15                      ▒
  0.00 │       vmovsd       %xmm2,-0x3a0(%rbp)                       ▒
  0.00 │       vmulsd       %xmm7,%xmm8,%xmm8                        ▒
  0.00 │       vmulsd       %xmm1,%xmm1,%xmm1                        ▒
  0.01 │       vmulsd       %xmm9,%xmm9,%xmm9                        ▒
  0.01 │       vfmadd132sd  %xmm0,%xmm1,%xmm0                        ▒
  0.06 │       vsubsd       0x20(%r12),%xmm10,%xmm1                  ▒
  0.66 │       vfmadd132sd  %xmm1,%xmm9,%xmm1                        ▒
  0.06 │       vsubsd       0x30(%r12),%xmm15,%xmm9                  ▒
  0.00 │       vaddsd       %xmm0,%xmm1,%xmm1                        ▒
  2.07 │       vsubsd       0x38(%r12),%xmm2,%xmm0                   ▒
  0.00 │       vmulsd       %xmm0,%xmm0,%xmm0                        ▒
  0.01 │       vfmadd231sd  %xmm9,%xmm9,%xmm0                        ▒
  0.08 │       vsubsd       0x40(%r12),%xmm8,%xmm9                   ▒
  0.00 │       vfmadd132sd  %xmm9,%xmm4,%xmm9                        ▒
  0.65 │       vaddsd       %xmm9,%xmm0,%xmm0                        ▒
  2.04 │       vaddsd       %xmm1,%xmm0,%xmm0                        ▒
  2.09 │       vmulsd       delim.4+0x24,%xmm0,%xmm14                ▒
  3.47 │       mov          -0x300(%rbp),%rax                        ▒
  0.00 │       vmovsd       (%rax),%xmm9                             ▒
  0.00 │       mov          0x60(%rbp),%rax                          ▒
  0.00 │       vaddsd       (%rax),%xmm9,%xmm4                       ▒
  0.01 │       vsqrtsd      %xmm14,%xmm14,%xmm14                     ▒
 13.94 │       vsubsd       %xmm4,%xmm14,%xmm4                       ▒
  0.71 │       vcomisd      %xmm4,%xmm13                             ▒
  2.88 │       vmovsd       %xmm4,-0x398(%rbp)                       ▒
  0.00 │     ↓ ja           3b0                                      ▒
  0.16 │       vcomisd      0xd6c9a(%rip),%xmm0        # 4d9548 <deli◆
  0.04 │     ↓ jae          3bf                                      ▒
  1.30 │3b0:   lea          -0x28(%rbp),%rsp                         ▒
  0.00 │       pop          %rbx                                     ▒
  0.00 │       pop          %r12                                     ▒
  0.00 │       pop          %r13                                     ▒
  0.00 │       pop          %r14                                     ▒
  0.00 │       pop          %r15                                     ▒
  0.02 │       pop          %rbp                                     ▒
  0.01 │     ← ret                                                   ▒

inlined variant:
Percent│        vmovsd       (%r14),%xmm0                            ▒
  0.01 │        mov          %rsp,%rax                               ▒
  0.01 │        sub          $0x50,%rsp                              ▒
  0.00 │        vmovsd       -0x448(%rbp),%xmm5                      ▒
  0.06 │        vsubsd       0x0(%r13),%xmm0,%xmm0                   ▒
  0.71 │        mov          %rsp,%rdx                               ▒
  0.02 │        vmovsd       -0x440(%rbp),%xmm1                      ▒
  0.00 │        mov          %rcx,-0x508(%rbp)                       ▒
  0.00 │        mov          %r10,-0x4e8(%rbp)                       ▒
  0.01 │        mov          %rax,-0x4e0(%rbp)                       ◆
  0.00 │        lea          -0x250(%rbp),%rsi                       ▒
       │        lea          -0x2b0(%rbp),%rdi                       ▒
  0.05 │        mov          %rdx,-0x250(%rbp)                       ▒
  0.67 │        movq         $0x1,-0x288(%rbp)                       ▒
  0.02 │        vxorpd       %xmm13,%xmm13,%xmm13                    ▒
  0.00 │        movq         $0x3,-0x270(%rbp)                       ▒
  0.00 │        mov          %r12,-0x2b0(%rbp)                       ▒
  0.01 │        movq         $0x3,-0x210(%rbp)                       ▒
  0.00 │        vmovsd       %xmm5,-0x618(%rbp)                      ▒
  0.00 │        vmovsd       %xmm1,-0x620(%rbp)                      ▒
  0.06 │        vmovsd       %xmm0,(%rsp)                            ▒
  0.69 │        vmovsd       0x8(%r14),%xmm0                         ▒
  0.03 │        vsubsd       0x8(%r13),%xmm0,%xmm0                   ▒
  0.01 │        vmovsd       %xmm0,0x8(%rdx)                         ▒
  0.01 │        vmovsd       0x10(%r14),%xmm0                        ▒
  0.02 │        vsubsd       0x10(%r13),%xmm0,%xmm0                  ▒
  0.00 │        vmovsd       %xmm0,0x10(%rdx)                        ▒
  0.01 │        vmovsd       0x18(%r14),%xmm0                        ▒
  0.06 │        vsubsd       0x18(%r13),%xmm0,%xmm0                  ▒
  0.69 │        vmovsd       %xmm0,0x18(%rdx)                        ▒
  0.03 │        vmovsd       0x20(%r14),%xmm0                        ▒
  0.01 │        vsubsd       0x20(%r13),%xmm0,%xmm0                  ▒
  0.01 │        vmovsd       %xmm0,0x20(%rdx)                        ▒
  0.02 │        vmovsd       0x28(%r14),%xmm0                        ▒
  0.00 │        vsubsd       0x28(%r13),%xmm0,%xmm0                  ▒
  0.00 │        vmovsd       %xmm0,0x28(%rdx)                        ▒
  0.06 │        vmovsd       0x30(%r14),%xmm0                        ▒
  0.67 │        vsubsd       0x30(%r13),%xmm0,%xmm0                  ▒
  0.03 │        vmovsd       %xmm0,0x30(%rdx)                        ▒
  0.01 │        vmovsd       0x38(%r14),%xmm0                        ▒
  0.00 │        vsubsd       0x38(%r13),%xmm0,%xmm0                  ▒
  0.02 │        vmovsd       %xmm0,0x38(%rdx)                        ▒
  0.01 │        vmovsd       0x40(%r14),%xmm0                        ▒
  0.00 │        vsubsd       0x40(%r13),%xmm0,%xmm0                  ▒
  0.06 │        vmovsd       %xmm0,0x40(%rdx)                        ▒
  0.68 │        vmovsd       %xmm5,%xmm5,%xmm0                       ▒
  0.01 │      → call         __perdida_m_MOD_generalized_hookes_law.c▒
  0.00 │        mov          -0x510(%rbp),%rax                       ▒
  0.00 │        vmovsd       delim.4+0x1c,%xmm6                      ▒
  0.00 │        mov          -0x4e0(%rbp),%rsp                       ▒
  0.05 │        mov          -0x4e8(%rbp),%r10                       ▒
  0.01 │        mov          -0x508(%rbp),%rcx                       ▒
  0.07 │        vmovsd       -0x10(%rax,%r15,8),%xmm4                ▒
  0.64 │        vsubsd       %xmm4,%xmm6,%xmm8                       ▒
  0.06 │        vmulsd       0x8(%r12),%xmm8,%xmm6                   ▒
  0.40 │        vmulsd       0x10(%r12),%xmm8,%xmm7                  ▒
  0.25 │        vcomisd      %xmm13,%xmm4                            ▒
  0.02 │        vmovsd       %xmm4,-0x570(%rbp)                      ▒
  0.00 │        vmulsd       0x18(%r12),%xmm8,%xmm5                  ▒
  0.10 │        vmulsd       (%r12),%xmm8,%xmm2                      ▒
  0.54 │        vmulsd       0x20(%r12),%xmm8,%xmm1                  ▒
  0.85 │        vmulsd       0x40(%r12),%xmm8,%xmm0                  ▒
  0.44 │        vmovsd       %xmm6,-0x4f0(%rbp)                      ▒
  0.04 │        vmovsd       %xmm6,0x8(%r12)                         ▒
  0.10 │        vmovsd       %xmm7,-0x4f8(%rbp)                      ▒
  0.01 │        vmovsd       %xmm7,0x10(%r12)                        ◆
  0.14 │        vmulsd       0x28(%r12),%xmm8,%xmm6                  ▒
  0.19 │        vmulsd       0x38(%r12),%xmm8,%xmm7                  ▒
  0.25 │        vmovsd       %xmm5,-0x500(%rbp)                      ▒
  0.03 │        vmovsd       %xmm5,0x18(%r12)                        ▒
  0.37 │        vmovsd       %xmm2,(%r12)                            ▒
  0.03 │        vmulsd       0x30(%r12),%xmm8,%xmm5                  ▒
  0.09 │        vaddsd       %xmm1,%xmm2,%xmm3                       ▒
  0.00 │        vmovsd       %xmm1,0x20(%r12)                        ▒
  0.19 │        vmovsd       %xmm0,0x40(%r12)                        ▒
  0.16 │        vaddsd       %xmm0,%xmm3,%xmm3                       ▒
  0.76 │        vmovsd       %xmm6,0x28(%r12)                        ▒
  0.09 │        vmovsd       %xmm7,0x38(%r12)                        ▒
  0.10 │        vmovsd       %xmm5,0x30(%r12)                        ▒
  0.10 │      ↓ jbe          b51                                     ▒
  0.01 │        vcomisd      0xd17ed(%rip),%xmm3        # 4d8578 <del▒
  0.55 │      ↓ jb           1a11                                    ▒
  0.23 │ b51:   vmovsd       delim.4+0x64,%xmm4                      ▒
  0.01 │        vmulsd       %xmm4,%xmm3,%xmm3                       ▒
  1.38 │        vmovsd       %xmm4,-0x5d8(%rbp)                      ▒
  0.01 │        vmovsd       %xmm3,-0x508(%rbp)                      ▒
  0.48 │ b6d:   vsubsd       %xmm3,%xmm2,%xmm4                       ▒
  0.02 │        vsubsd       %xmm3,%xmm1,%xmm2                       ▒
  0.57 │        vmovsd       %xmm5,-0x600(%rbp)                      ▒
  0.15 │        vmovsd       %xmm6,-0x608(%rbp)                      ▒
  0.18 │        vsubsd       %xmm3,%xmm0,%xmm1                       ▒
  0.52 │        vmovsd       %xmm7,-0x5f8(%rbp)                      ▒
  0.30 │        vmovsd       delim.4+0x1c,%xmm3                      ▒
  0.09 │        vmovsd       %xmm4,-0x578(%rbp)                      ▒
  0.95 │        vmovsd       %xmm2,-0x580(%rbp)                      ▒
  0.73 │        vmovsd       %xmm1,-0x588(%rbp)                      ▒
  0.55 │        vdivsd       %xmm8,%xmm3,%xmm0                       ▒
  5.95 │        vmulsd       -0x4f0(%rbp),%xmm0,%xmm13               ▒
  2.14 │        vmulsd       -0x4f8(%rbp),%xmm0,%xmm12               ▒
  0.65 │        vmulsd       %xmm0,%xmm5,%xmm10                      ▒
  0.09 │        vmulsd       %xmm6,%xmm0,%xmm3                       ▒
  0.01 │        vmovsd       0x8(%rbx),%xmm5                         ▒
  0.01 │        vmulsd       %xmm7,%xmm0,%xmm6                       ▒
  0.68 │        vmulsd       %xmm1,%xmm0,%xmm1                       ▒
  0.15 │        vmovsd       (%rbx),%xmm7                            ▒
  0.00 │        vmovsd       %xmm3,-0x5e0(%rbp)                      ▒
  0.01 │        vmulsd       %xmm4,%xmm0,%xmm9                       ▒
  0.69 │        vmulsd       %xmm2,%xmm0,%xmm14                      ▒
  0.10 │        vmovsd       %xmm1,-0x4e8(%rbp)                      ▒
  0.05 │        vmovsd       %xmm6,-0x4e0(%rbp)                      ▒
  0.62 │        vmovsd       %xmm5,-0x520(%rbp)                      ▒
  0.05 │        vmovsd       0x10(%rbx),%xmm6                        ▒
  0.00 │        vmulsd       -0x500(%rbp),%xmm0,%xmm4                ▒
  0.11 │        vsubsd       %xmm5,%xmm13,%xmm0                      ▒
  0.01 │        vsubsd       %xmm7,%xmm9,%xmm2                       ▒
  0.09 │        vmovsd       %xmm9,-0x5c0(%rbp)                      ▒
  0.70 │        vmovsd       %xmm7,-0x518(%rbp)                      ▒
  0.06 │        vmovsd       %xmm14,-0x5c8(%rbp)                     ▒
  0.64 │        vmulsd       %xmm0,%xmm0,%xmm1                       ▒
  0.06 │        vmovsd       %xmm0,-0x5a8(%rbp)                      ▒
  0.71 │        vmovsd       %xmm2,-0x5a0(%rbp)                      ▒
  0.72 │        vfmadd231sd  %xmm2,%xmm2,%xmm1                       ◆
  0.81 │        vmovsd       0x18(%rbx),%xmm2                        ▒
  0.01 │        vsubsd       %xmm6,%xmm12,%xmm15                     ▒
  0.00 │        vmovsd       %xmm6,-0x528(%rbp)                      ▒
  0.05 │        vmovsd       %xmm15,-0x5b0(%rbp)                     ▒
  0.07 │        vmovsd       %xmm4,-0x5f0(%rbp)                      ▒
  0.63 │        vmovsd       %xmm2,-0x530(%rbp)                      ▒
  0.07 │        vsubsd       %xmm2,%xmm4,%xmm2                       ▒
  0.01 │        vmovsd       0x20(%rbx),%xmm4                        ▒
  0.10 │        vmulsd       %xmm2,%xmm2,%xmm0                       ▒
  0.06 │        vmovsd       %xmm2,-0x5e8(%rbp)                      ▒
  0.62 │        vfmadd231sd  %xmm15,%xmm15,%xmm0                     ▒
  1.14 │        vmovsd       %xmm4,-0x538(%rbp)                      ▒
  0.07 │        vsubsd       %xmm4,%xmm14,%xmm14                     ▒
  0.00 │        vaddsd       %xmm0,%xmm1,%xmm1                       ▒
  2.07 │        vmovsd       0x28(%rbx),%xmm0                        ▒
  0.00 │        vsubsd       %xmm0,%xmm3,%xmm15                      ▒
  0.00 │        vmovsd       %xmm0,-0x540(%rbp)                      ▒
  0.04 │        vmovsd       0x30(%rbx),%xmm3                        ▒
  0.00 │        vmovsd       -0x4e8(%rbp),%xmm4                      ▒
  0.01 │        vmovsd       %xmm10,-0x5d0(%rbp)                     ▒
  0.05 │        vmovsd       0x38(%rbx),%xmm9                        ▒
  0.00 │        vmovsd       -0x4e0(%rbp),%xmm7                      ▒
  0.69 │        vmulsd       %xmm15,%xmm15,%xmm0                     ▒
  0.00 │        mov          -0x568(%rbp),%rax                       ▒
  0.00 │        vfmadd231sd  %xmm14,%xmm14,%xmm0                     ▒
  0.02 │        vsubsd       %xmm3,%xmm10,%xmm11                     ▒
  0.00 │        vmovsd       0x40(%rbx),%xmm10                       ▒
  0.00 │        vmovsd       %xmm3,-0x548(%rbp)                      ▒
  0.05 │        vmovsd       %xmm9,-0x550(%rbp)                      ▒
  0.06 │        vsubsd       %xmm9,%xmm7,%xmm3                       ▒
  0.68 │        vfmadd231sd  %xmm11,%xmm11,%xmm0                     ▒
  0.19 │        vmovsd       %xmm3,-0x5b8(%rbp)                      ▒
  0.06 │        vmovsd       %xmm10,-0x558(%rbp)                     ▒
  0.06 │        vsubsd       %xmm10,%xmm4,%xmm10                     ▒
  0.00 │        vxorpd       %xmm4,%xmm4,%xmm4                       ▒
  0.00 │        vaddsd       %xmm0,%xmm1,%xmm1                       ▒
  0.91 │        vmulsd       %xmm10,%xmm10,%xmm0                     ▒
  0.02 │        vfmadd231sd  %xmm3,%xmm3,%xmm0                       ▒
  0.78 │        vaddsd       %xmm1,%xmm0,%xmm0                       ▒
  2.21 │        vmovsd       -0x10(%rax,%r15,8),%xmm1                ▒
  0.01 │        vmulsd       delim.4+0x6c,%xmm0,%xmm9                ▒
  3.77 │        vmovsd       %xmm1,-0x590(%rbp)                      ▒
  0.00 │        vaddsd       -0x3f8(%rbp),%xmm1,%xmm1                ▒
  0.00 │        vsqrtsd      %xmm9,%xmm9,%xmm9                       ▒
 15.05 │        vsubsd       %xmm1,%xmm9,%xmm5                       ▒
  0.81 │        vmovsd       %xmm1,-0x560(%rbp)                      ▒
  0.00 │        vcomisd      %xmm5,%xmm4                             ▒
  3.48 │        vmovsd       %xmm5,-0x598(%rbp)                      ▒
  0.00 │      ↑ ja           910                                     ▒
  0.17 │        vcomisd      0xd15d4(%rip),%xmm0        # 4d8590 <del▒
  0.07 │      ↑ jb           910                                     ▒

Which does look very similar to me except for the bookkeping moves.  
With perf stat I get:

 Performance counter stats for './a.out-slow':

         37,676.01 msec task-clock                #    1.000 CPUs utilized      
               113      context-switches          #    2.999 /sec               
                24      cpu-migrations            #    0.637 /sec               
                70      page-faults               #    1.858 /sec               
   142,922,291,843      cycles                    #    3.793 GHz                
       128,124,341      stalled-cycles-frontend   #    0.09% frontend cycles
idle   
   110,415,979,659      stalled-cycles-backend    #   77.26% backend cycles
idle    
   260,215,601,013      instructions              #    1.82  insn per cycle     
                                                  #    0.42  stalled cycles per
insn
     9,809,351,864      branches                  #  260.361 M/sec              
        23,585,751      branch-misses             #    0.24% of all branches    

      37.682154164 seconds time elapsed

      37.677998000 seconds user
       0.000000000 seconds sys


 Performance counter stats for './a.out-fast':



         23,892.07 msec task-clock                #    1.000 CPUs utilized      
                36      context-switches          #    1.507 /sec               
                13      cpu-migrations            #    0.544 /sec               
                70      page-faults               #    2.930 /sec               
    84,630,483,861      cycles                    #    3.542 GHz                
       105,428,600      stalled-cycles-frontend   #    0.12% frontend cycles
idle   
    59,095,901,330      stalled-cycles-backend    #   69.83% backend cycles
idle    
   191,156,427,437      instructions              #    2.26  insn per cycle     
                                                  #    0.31  stalled cycles per
insn
     8,612,504,734      branches                  #  360.475 M/sec              
        23,436,092      branch-misses             #    0.27% of all branches    

      23.902460280 seconds time elapsed

      23.885982000 seconds user
       0.008000000 seconds sys

So there is 13% difference in instruction count that I could imagine to be
mostly the moves.
Perhaps perdida is simply very expensive to call given the job it does

  0.00 │16d0:   mov          0x38(%rsp),%rax                         ▒
  0.01 │        mov          %r10,0x18(%rsp)                         ▒
  0.00 │        mov          %r11,0x2f8(%rsp)                        ▒
  0.06 │        mov          %r11,0x358(%rsp)                        ▒
  0.03 │        mov          %r11,0x3b8(%rsp)                        ▒
  1.37 │        movq         $0xfffffffffffffffc,0x2e8(%rsp)         ▒
  0.01 │        movq         $0x8,0x2f0(%rsp)                        ▒
  0.01 │        movq         $0x8,0x300(%rsp)                        ◆
  0.01 │        movq         $0x1,0x308(%rsp)                        ▒
  0.02 │        add          %rbp,%rax                               ▒
  0.00 │        movq         $0x1,0x310(%rsp)                        ▒
  0.05 │        movq         $0x3,0x318(%rsp)                        ▒
  0.03 │        mov          %rax,0x2e0(%rsp)                        ▒
  1.34 │        movq         $0x3,0x320(%rsp)                        ▒
  0.03 │        movq         $0x1,0x328(%rsp)                        ▒
  0.01 │        movq         $0x3,0x330(%rsp)                        ▒
  0.03 │        movq         $0xfffffffffffffffc,0x348(%rsp)         ▒
  0.01 │        movq         $0x8,0x350(%rsp)                        ▒
  0.02 │        movq         $0x8,0x360(%rsp)                        ▒
  0.05 │        movq         $0x1,0x368(%rsp)                        ▒
  0.04 │        movq         $0x1,0x370(%rsp)                        ▒
  1.35 │        movq         $0x3,0x378(%rsp)                        ▒
  0.03 │        movq         $0x3,0x380(%rsp)                        ▒
  0.01 │        movq         $0x1,0x388(%rsp)                        ▒
  0.26 │        movq         $0x3,0x390(%rsp)                        ▒
  0.02 │        movq         $0xfffffffffffffffc,0x3a8(%rsp)         ▒
  0.26 │        movq         $0x8,0x3b0(%rsp)                        ▒
  0.05 │        movq         $0x8,0x3c0(%rsp)                        ▒
  0.09 │        movq         $0x1,0x3c8(%rsp)                        ▒
  1.34 │        mov          0x28(%rsp),%rax                         ▒
  0.02 │        add          %rbp,%rax                               ▒
  0.01 │        mov          %rax,0x340(%rsp)                        ▒
  0.02 │        mov          0x40(%rsp),%rax                         ▒
  0.01 │        add          %rbp,%rax                               ▒
  0.00 │        mov          %rax,0x3a0(%rsp)                        ▒
  0.09 │        movq         $0x1,0x3d0(%rsp)                        ▒
  0.04 │        mov          0x30(%rsp),%rax                         ▒
  1.35 │        mov          %r11,0x418(%rsp)                        ▒
  0.03 │        mov          %r11,0x478(%rsp)                        ▒
  0.02 │        movq         $0x3,0x3d8(%rsp)                        ▒
  0.04 │        movq         $0x3,0x3e0(%rsp)                        ▒
  0.01 │        movq         $0x1,0x3e8(%rsp)                        ▒
  0.07 │        movq         $0x3,0x3f0(%rsp)                        ▒
  0.06 │        add          %rbp,%rax                               ▒
  0.02 │        movq         $0xfffffffffffffffc,0x408(%rsp)         ▒
  1.36 │        movq         $0x8,0x410(%rsp)                        ▒
  0.48 │        mov          %rax,0x400(%rsp)                        ▒
  0.01 │        movq         $0x8,0x420(%rsp)                        ▒
  0.24 │        movq         $0x1,0x428(%rsp)                        ▒
  0.01 │        movq         $0x1,0x430(%rsp)                        ▒
  0.24 │        movq         $0x3,0x438(%rsp)                        ▒
  0.01 │        movq         $0x3,0x440(%rsp)                        ▒
  0.28 │        movq         $0x1,0x448(%rsp)                        ▒
  1.32 │        movq         $0x3,0x450(%rsp)                        ▒
 13.32 │        movq         $0xfffffffffffffffc,0x468(%rsp)         ▒
  0.01 │        movq         $0x8,0x470(%rsp)                        ▒
  5.68 │        movq         $0x8,0x480(%rsp)                        ▒
  0.01 │        movq         $0x1,0x488(%rsp)                        ▒
  2.87 │        movq         $0x1,0x490(%rsp)                        ▒
  0.06 │        movq         $0x3,0x498(%rsp)                        ▒
  2.82 │        movq         $0x3,0x4a0(%rsp)                        ▒
  0.02 │        movq         $0x1,0x4a8(%rsp)                        ▒
  2.87 │        movq         $0x3,0x4b0(%rsp)                        ▒
  0.02 │        mov          0x48(%rsp),%rax                         ◆
  1.41 │        add          %rbp,%rax                               ▒
  0.02 │        add          $0x48,%rbp                              ▒
  0.00 │        mov          %rax,0x460(%rsp)                        ▒
  1.43 │        lea          0x170(%rsp),%rax                        ▒
  0.00 │        push         %rax                                    ▒
  1.42 │        lea          0x190(%rsp),%rax                        ▒
  0.02 │        push         %rax                                    ▒
  4.28 │        push         %r13                                    ▒
  0.01 │        add          $0x8,%r13                               ▒
  0.00 │        push         %r14                                    ▒
  4.27 │        add          $0x8,%r14                               ▒
       │        lea          0x480(%rsp),%rax                        ▒
  0.01 │        push         %rax                                    ▒
  0.03 │        push         %r12                                    ▒
  0.00 │        add          $0x8,%r12                               ▒
  0.00 │        lea          0x430(%rsp),%rax                        ▒
  1.42 │        push         %rax                                    ▒
  2.77 │        lea          0x3d8(%rsp),%rax                        ▒
  0.01 │        push         %rax                                    ▒
  1.43 │        lea          0x380(%rsp),%rax                        ▒
  0.01 │        push         %rax                                    ▒
  1.47 │        lea          0x328(%rsp),%rax                        ▒
  0.00 │        push         %rax                                    ▒
  4.16 │        lea          0x1f8(%rsp),%rax                        ▒
  0.01 │        push         %rax                                    ▒
  2.86 │        lea          0x1d8(%rsp),%rax                        ▒
  0.00 │        push         %rax                                    ▒
  1.56 │        lea          0x1f0(%rsp),%rax                        ▒
  0.01 │        push         %rax                                    ▒
  5.42 │        lea          0x248(%rsp),%rax                        ▒
  0.01 │        push         %rax                                    ▒
  1.43 │        lea          0x1c8(%rsp),%r9                         ▒
  0.00 │        lea          0x220(%rsp),%r8                         ▒
  0.0  0.00 │        lea          0x210(%rsp),%rdx                        ▒
  0.00 │        lea          0x208(%rsp),%rsi                        ▒
  0.01 │        lea          0x1e8(%rsp),%rdi                        ▒
  0.03 │      → call         __perdida_m_MOD_perdida.constprop.0     ▒
 0 │        lea          0x258(%rsp),%rcx                        ▒

We do constant propagate the array descriptor (up to the one variable entry)
but we do not optimize out the code initializing them.

Reply via email to