unsigned long fibonacci(unsigned long n) {
  unsigned long alpha = 0, omega = 1, incra = 0, c = 0;
  for (; c < n; c++) {
    if (c <= 1) {
      incra = c;
      continue;
    }
    incra = alpha + omega;
    alpha = omega;
    omega = incra;
  }
  return (incra);
}


x86 assembly (clang, -O0):
<fibonacci>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movq   $0x0,-0x10(%rbp)
movq   $0x1,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x8(%rbp),%rax
jae    117b <fibonacci+0x7b>
cmpq   $0x1,-0x28(%rbp)
ja     114e <fibonacci+0x4e>
mov    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    116a <fibonacci+0x6a>
mov    -0x10(%rbp),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1128 <fibonacci+0x28>
mov    -0x20(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<fibonacci>:
test   %rdi,%rdi
je     114f <fibonacci+0x4f>
lea    -0x1(%rdi),%r8
mov    %edi,%r9d
and    $0x3,%r9d
cmp    $0x3,%r8
jae    1152 <fibonacci+0x52>
mov    $0x1,%eax
xor    %esi,%esi
xor    %ecx,%ecx
test   %r9,%r9
je     11b0 <fibonacci+0xb0>
mov    %rax,%rdi
nopl   0x0(%rax,%rax,1)
lea    (%rdi,%rcx,1),%rax
cmp    $0x2,%rsi
setb   %dl
cmovae %rdi,%rcx
cmovae %rax,%rdi
add    $0x1,%rsi
add    $0xffffffffffffffff,%r9
jne    1130 <fibonacci+0x30>
jmp    11b2 <fibonacci+0xb2>
xor    %eax,%eax
ret
and    $0xfffffffffffffffc,%rdi
neg    %rdi
mov    $0x1,%eax
xor    %esi,%esi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
test   %rsi,%rsi
mov    %rax,%rdx
cmove  %rcx,%rdx
cmove  %rsi,%rcx
mov    %rdx,%r10
cmove  %rsi,%r10
add    %rcx,%rax
test   %rsi,%rsi
cmovne %rax,%rdx
add    %r10,%rax
mov    %rdx,%rcx
add    %rax,%rcx
add    %rcx,%rax
add    $0xfffffffffffffffc,%rsi
cmp    %rsi,%rdi
jne    1170 <fibonacci+0x70>
neg    %rsi
test   %r9,%r9
jne    1128 <fibonacci+0x28>
xor    %edx,%edx
test   %dl,%dl
cmovne %r8,%rax
ret

LLVM IR (-O0):
define i64 @fibonacci(i64 %0) {
%2 = alloca i64
%3 = alloca i64
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
store i64 %0, i64* %2
store i64 0, i64* %3
store i64 1, i64* %4
store i64 0, i64* %5
store i64 0, i64* %6
br label %7
7: ; preds = %22, %1
%8 = load i64, i64* %6
%9 = load i64, i64* %2
%10 = icmp ult i64 %8, %9
br i1 %10, label %11, label %25
11: ; preds = %7
%12 = load i64, i64* %6
%13 = icmp ule i64 %12, 1
br i1 %13, label %14, label %16
14: ; preds = %11
%15 = load i64, i64* %6
store i64 %15, i64* %5
br label %22
16: ; preds = %11
%17 = load i64, i64* %3
%18 = load i64, i64* %4
%19 = add i64 %17, %18
store i64 %19, i64* %5
%20 = load i64, i64* %4
store i64 %20, i64* %3
%21 = load i64, i64* %5
store i64 %21, i64* %4
br label %22
22: ; preds = %16, %14
%23 = load i64, i64* %6
%24 = add i64 %23, 1
store i64 %24, i64* %6
br label %7
25: ; preds = %7
%26 = load i64, i64* %5
ret i64 %26
}

LLVM IR (-O2):
define i64 @fibonacci(i64 %0) {
%2 = icmp eq i64 %0, 0
br i1 %2, label %50, label %3
3: ; preds = %1
%4 = add i64 %0, -1
%5 = and i64 %0, 3
%6 = icmp ult i64 %4, 3
br i1 %6, label %27, label %7
7: ; preds = %3
%8 = and i64 %0, -4
br label %9
9: ; preds = %9, %7
%10 = phi i64 [ 0, %7 ], [ %24, %9 ]
%11 = phi i64 [ 1, %7 ], [ %23, %9 ]
%12 = phi i64 [ 0, %7 ], [ %22, %9 ]
%13 = phi i64 [ 0, %7 ], [ %25, %9 ]
%14 = icmp eq i64 %10, 0
%15 = select i1 %14, i64 %12, i64 %11
%16 = select i1 %14, i64 0, i64 %12
%17 = add i64 %11, %16
%18 = icmp eq i64 %10, 0
%19 = select i1 %18, i64 %15, i64 %17
%20 = select i1 %18, i64 0, i64 %15
%21 = add i64 %17, %20
%22 = add i64 %21, %19
%23 = add i64 %22, %21
%24 = add nuw i64 %10, 4
%25 = add i64 %13, 4
%26 = icmp eq i64 %25, %8
br i1 %26, label %27, label %9
27: ; preds = %9, %3
%28 = phi i64 [ undef, %3 ], [ %23, %9 ]
%29 = phi i64 [ 0, %3 ], [ %24, %9 ]
%30 = phi i64 [ 1, %3 ], [ %23, %9 ]
%31 = phi i64 [ 0, %3 ], [ %22, %9 ]
%32 = icmp eq i64 %5, 0
br i1 %32, label %45, label %33
33: ; preds = %27, %33
%34 = phi i64 [ %42, %33 ], [ %29, %27 ]
%35 = phi i64 [ %41, %33 ], [ %30, %27 ]
%36 = phi i64 [ %40, %33 ], [ %31, %27 ]
%37 = phi i64 [ %43, %33 ], [ 0, %27 ]
%38 = icmp ult i64 %34, 2
%39 = add i64 %35, %36
%40 = select i1 %38, i64 %36, i64 %35
%41 = select i1 %38, i64 %35, i64 %39
%42 = add nuw i64 %34, 1
%43 = add i64 %37, 1
%44 = icmp eq i64 %43, %5
br i1 %44, label %45, label %33
45: ; preds = %33, %27
%46 = phi i1 [ false, %27 ], [ %38, %33 ]
%47 = phi i64 [ %28, %27 ], [ %39, %33 ]
%48 = add i64 %0, -1
%49 = select i1 %46, i64 %48, i64 %47
br label %50
50: ; preds = %45, %1
%51 = phi i64 [ %49, %45 ], [ 0, %1 ]
ret i64 %51
}