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.