https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90567
--- Comment #4 from msmaldi <msmaldi at hotmail dot com> --- -O2 generate better results, but gcc 7 continue faster gcc-7 with -O3 real 0m3,143s user 0m3,119s sys 0m0,008s gcc-8 with -O2 real 0m4,802s user 0m4,793s sys 0m0,009s gcc 7 assembly generated: fibo: push r15 lea eax, [rdi-1] push r14 push r13 push r12 push rbp push rbx sub rsp, 104 cmp eax, 1 mov DWORD PTR [rsp+68], 0 jbe .L2 mov edx, edi lea ecx, [rdi-4] lea eax, [rdi-2] sub edx, 3 and edx, -2 sub ecx, edx mov DWORD PTR [rsp+88], ecx .L19: cmp eax, 1 jbe .L21 lea ecx, [rax-3] lea edx, [rax-1] sub eax, 2 mov DWORD PTR [rsp+80], eax and eax, -2 mov DWORD PTR [rsp+72], 0 sub ecx, eax mov DWORD PTR [rsp+92], ecx .L18: cmp edx, 1 jbe .L22 lea eax, [rdx-2] lea esi, [rdx-3] lea ecx, [rdx-1] mov DWORD PTR [rsp+60], 0 mov DWORD PTR [rsp+84], eax and eax, -2 sub esi, eax mov DWORD PTR [rsp+76], esi .L17: cmp ecx, 1 jbe .L23 lea eax, [rcx-2] lea esi, [rcx-3] lea edx, [rcx-1] mov DWORD PTR [rsp+52], 0 mov DWORD PTR [rsp+64], eax and eax, -2 sub esi, eax mov DWORD PTR [rsp+56], esi .L16: cmp edx, 1 jbe .L24 lea eax, [rdx-2] lea esi, [rdx-3] lea ecx, [rdx-1] mov DWORD PTR [rsp+40], 0 mov DWORD PTR [rsp+48], eax and eax, -2 sub esi, eax mov DWORD PTR [rsp+44], esi .L15: cmp ecx, 1 jbe .L25 lea eax, [rcx-2] lea esi, [rcx-3] lea edx, [rcx-1] mov DWORD PTR [rsp+28], 0 mov DWORD PTR [rsp+36], eax and eax, -2 sub esi, eax mov DWORD PTR [rsp+32], esi .L14: cmp edx, 1 jbe .L26 lea eax, [rdx-2] lea ecx, [rdx-3] lea r13d, [rdx-1] mov DWORD PTR [rsp+16], 0 mov DWORD PTR [rsp+24], eax and eax, -2 sub ecx, eax mov DWORD PTR [rsp+20], ecx .L13: cmp r13d, 1 jbe .L27 lea eax, [r13-2] lea edx, [r13-1] lea r15d, [r13-3] xor ebp, ebp mov DWORD PTR [rsp+12], eax and eax, -2 mov ebx, edx sub r15d, eax .L12: cmp ebx, 1 jbe .L28 lea r13d, [rbx-2] xor r14d, r14d mov r12d, r13d and r12d, 1 .L11: mov edi, ebx sub ebx, 2 call fibo add r14d, eax cmp r12d, ebx jne .L11 add r14d, 1 .L10: add ebp, r14d cmp r15d, r13d mov ebx, r13d jne .L12 mov r13d, DWORD PTR [rsp+12] add ebp, 1 .L9: add DWORD PTR [rsp+16], ebp cmp DWORD PTR [rsp+20], r13d jne .L13 mov eax, DWORD PTR [rsp+16] mov edx, DWORD PTR [rsp+24] add eax, 1 .L8: add DWORD PTR [rsp+28], eax cmp DWORD PTR [rsp+32], edx jne .L14 mov eax, DWORD PTR [rsp+28] mov ecx, DWORD PTR [rsp+36] add eax, 1 .L7: add DWORD PTR [rsp+40], eax cmp DWORD PTR [rsp+44], ecx jne .L15 mov eax, DWORD PTR [rsp+40] mov edx, DWORD PTR [rsp+48] add eax, 1 .L6: add DWORD PTR [rsp+52], eax cmp DWORD PTR [rsp+56], edx jne .L16 mov eax, DWORD PTR [rsp+52] mov ecx, DWORD PTR [rsp+64] add eax, 1 .L5: add DWORD PTR [rsp+60], eax cmp DWORD PTR [rsp+76], ecx jne .L17 mov eax, DWORD PTR [rsp+60] mov edx, DWORD PTR [rsp+84] add eax, 1 .L4: add DWORD PTR [rsp+72], eax cmp DWORD PTR [rsp+92], edx jne .L18 mov edx, DWORD PTR [rsp+72] mov eax, DWORD PTR [rsp+80] add edx, 1 .L3: add DWORD PTR [rsp+68], edx cmp DWORD PTR [rsp+88], eax jne .L19 .L2: mov eax, DWORD PTR [rsp+68] add rsp, 104 pop rbx pop rbp add eax, 1 pop r12 pop r13 pop r14 pop r15 ret .L28: mov r14d, 1 lea r13d, [rbx-2] jmp .L10 .L27: lea eax, [r13-2] mov ebp, 1 mov DWORD PTR [rsp+12], eax mov r13d, eax jmp .L9 .L26: lea esi, [rdx-2] mov eax, 1 mov DWORD PTR [rsp+24], esi mov edx, esi jmp .L8 .L25: sub ecx, 2 mov eax, 1 mov DWORD PTR [rsp+36], ecx jmp .L7 .L24: lea ecx, [rdx-2] mov eax, 1 mov DWORD PTR [rsp+48], ecx mov edx, ecx jmp .L6 .L23: sub ecx, 2 mov eax, 1 mov DWORD PTR [rsp+64], ecx jmp .L5 .L22: lea ecx, [rdx-2] mov eax, 1 mov DWORD PTR [rsp+84], ecx mov edx, ecx jmp .L4 .L21: sub eax, 2 mov edx, 1 mov DWORD PTR [rsp+80], eax jmp .L3 gcc 8 assembly: fibo: push rbp push rbx sub rsp, 8 lea ebx, [rdi-1] mov eax, 1 cmp ebx, 1 jbe .L1 xor ebp, ebp .L3: mov edi, ebx call fibo add ebp, eax sub ebx, 2 cmp ebx, 1 ja .L3 lea eax, [rbp+1] .L1: add rsp, 8 pop rbx pop rbp ret