void cg_daxpy(double *x, double *d, double alpha, long int n) {
  long int i, n5;
  n5 = n % 5;
  if (alpha == -((double)1)) {
    for (i = 0; i < n5; i++)
      x[i] -= d[i];
    for (; i < n; i += 5) {
      x[i] -= d[i];
      x[i + 1] -= d[i + 1];
      x[i + 2] -= d[i + 2];
      x[i + 3] -= d[i + 3];
      x[i + 4] -= d[i + 4];
    }
  } else {
    for (i = 0; i < n5; i++)
      x[i] += alpha * d[i];
    for (; i < n; i += 5) {
      x[i] += alpha * d[i];
      x[i + 1] += alpha * d[i + 1];
      x[i + 2] += alpha * d[i + 2];
      x[i + 3] += alpha * d[i + 3];
      x[i + 4] += alpha * d[i + 4];
    }
  }
  return;
}


x86 assembly (clang, -O0):
<cg_daxpy>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    $0x5,%ecx
cqto
idiv   %rcx
mov    %rdx,-0x30(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  0xecc(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1272 <cg_daxpy+0x172>
jp     1272 <cg_daxpy+0x172>
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x30(%rbp),%rax
jge    118e <cg_daxpy+0x8e>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    114c <cg_daxpy+0x4c>
jmp    1193 <cg_daxpy+0x93>
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    126d <cg_daxpy+0x16d>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x8(%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x8(%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x10(%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x10(%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x18(%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x18(%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,0x18(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x20(%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x20(%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,0x20(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
add    $0x5,%rax
mov    %rax,-0x28(%rbp)
jmp    1193 <cg_daxpy+0x93>
jmp    13d6 <cg_daxpy+0x2d6>
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x30(%rbp),%rax
jge    12c5 <cg_daxpy+0x1c5>
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    127a <cg_daxpy+0x17a>
jmp    12ca <cg_daxpy+0x1ca>
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    13d1 <cg_daxpy+0x2d1>
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x8(%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x8(%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax,%rcx,8)
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x10(%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x10(%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax,%rcx,8)
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x18(%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x18(%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x18(%rax,%rcx,8)
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x20(%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  0x20(%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x20(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
add    $0x5,%rax
mov    %rax,-0x28(%rbp)
jmp    12ca <cg_daxpy+0x1ca>
jmp    13d6 <cg_daxpy+0x2d6>
pop    %rbp
ret

x86 assembly (clang, -O2):
<cg_daxpy>:
push   %rbx
mov    %rdx,%r10
movabs $0x6666666666666667,%rcx
66 66 66
mov    %rdx,%rax
imul   %rcx
mov    %rdx,%rax
shr    $0x3f,%rax
sar    %rdx
add    %rax,%rdx
lea    (%rdx,%rdx,4),%rax
mov    %r10,%rcx
sub    %rax,%rcx
ucomisd 0xecd(%rip),%xmm0
jne    11db <cg_daxpy+0xdb>
jp     11db <cg_daxpy+0xdb>
test   %rcx,%rcx
jle    1290 <cg_daxpy+0x190>
movsd  (%rdi),%xmm0
subsd  (%rsi),%xmm0
movsd  %xmm0,(%rdi)
cmp    $0x1,%rcx
je     12fb <cg_daxpy+0x1fb>
movsd  0x8(%rdi),%xmm0
subsd  0x8(%rsi),%xmm0
movsd  %xmm0,0x8(%rdi)
cmp    $0x2,%rcx
je     12fb <cg_daxpy+0x1fb>
movsd  0x10(%rdi),%xmm0
subsd  0x10(%rsi),%xmm0
movsd  %xmm0,0x10(%rdi)
cmp    $0x3,%rcx
je     12fb <cg_daxpy+0x1fb>
movsd  0x18(%rdi),%xmm0
subsd  0x18(%rsi),%xmm0
movsd  %xmm0,0x18(%rdi)
cmp    $0x4,%rcx
je     12fb <cg_daxpy+0x1fb>
movsd  0x20(%rdi),%xmm0
movsd  0x28(%rdi),%xmm1
subsd  0x20(%rsi),%xmm0
movsd  %xmm0,0x20(%rdi)
subsd  0x28(%rsi),%xmm1
movsd  %xmm1,0x28(%rdi)
movsd  0x30(%rdi),%xmm0
subsd  0x30(%rsi),%xmm0
movsd  %xmm0,0x30(%rdi)
jmp    12fb <cg_daxpy+0x1fb>
test   %rcx,%rcx
jle    1305 <cg_daxpy+0x205>
movsd  (%rsi),%xmm1
mulsd  %xmm0,%xmm1
addsd  (%rdi),%xmm1
movsd  %xmm1,(%rdi)
cmp    $0x1,%rcx
je     1307 <cg_daxpy+0x207>
movsd  0x8(%rsi),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x8(%rdi),%xmm1
movsd  %xmm1,0x8(%rdi)
cmp    $0x2,%rcx
je     1307 <cg_daxpy+0x207>
movsd  0x10(%rsi),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x10(%rdi),%xmm1
movsd  %xmm1,0x10(%rdi)
cmp    $0x3,%rcx
je     1307 <cg_daxpy+0x207>
movsd  0x18(%rsi),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x18(%rdi),%xmm1
movsd  %xmm1,0x18(%rdi)
cmp    $0x4,%rcx
je     1307 <cg_daxpy+0x207>
movsd  0x20(%rsi),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x20(%rdi),%xmm1
movsd  %xmm1,0x20(%rdi)
movsd  0x28(%rsi),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x28(%rdi),%xmm1
movsd  %xmm1,0x28(%rdi)
movsd  0x30(%rsi),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x30(%rdi),%xmm1
movsd  %xmm1,0x30(%rdi)
jmp    1307 <cg_daxpy+0x207>
xor    %ecx,%ecx
jmp    12fb <cg_daxpy+0x1fb>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rdi,%rcx,8),%xmm0
subsd  (%rsi,%rcx,8),%xmm0
movsd  0x8(%rdi,%rcx,8),%xmm1
movsd  %xmm0,(%rdi,%rcx,8)
subsd  0x8(%rsi,%rcx,8),%xmm1
movsd  %xmm1,0x8(%rdi,%rcx,8)
movsd  0x10(%rdi,%rcx,8),%xmm0
subsd  0x10(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x10(%rdi,%rcx,8)
movsd  0x18(%rdi,%rcx,8),%xmm0
subsd  0x18(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x18(%rdi,%rcx,8)
movsd  0x20(%rdi,%rcx,8),%xmm0
subsd  0x20(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x20(%rdi,%rcx,8)
add    $0x5,%rcx
cmp    %r10,%rcx
jl     12a0 <cg_daxpy+0x1a0>
jmp    1504 <cg_daxpy+0x404>
xor    %ecx,%ecx
cmp    %r10,%rcx
jge    1504 <cg_daxpy+0x404>
mov    %rcx,%r9
not    %r9
add    %r10,%r9
movabs $0xcccccccccccccccd,%r11
cc cc cc
mov    %r9,%rax
mul    %r11
cmp    $0x5,%r9
jae    1337 <cg_daxpy+0x237>
mov    %rcx,%rax
jmp    1490 <cg_daxpy+0x390>
mov    %rdx,%r8
lea    (%rdi,%rcx,8),%rbx
mov    %r9,%rax
mul    %r11
shr    $0x2,%rdx
lea    (%rdx,%rdx,4),%rax
add    %rcx,%rax
lea    (%rsi,%rax,8),%rdx
add    $0x28,%rdx
cmp    %rdx,%rbx
jae    1375 <cg_daxpy+0x275>
lea    (%rdi,%rax,8),%rax
add    $0x28,%rax
lea    (%rsi,%rcx,8),%rdx
cmp    %rax,%rdx
jae    1375 <cg_daxpy+0x275>
mov    %rcx,%rax
jmp    1490 <cg_daxpy+0x390>
shr    $0x2,%r8
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffffe,%r9
lea    (%r9,%r9,4),%rax
add    %rcx,%rax
movapd %xmm0,%xmm8
unpcklpd %xmm0,%xmm8
shl    $0x3,%rcx
mov    %r9,%rdx
nopl   0x0(%rax)
movsd  (%rsi,%rcx,1),%xmm2
movsd  0x8(%rsi,%rcx,1),%xmm4
movsd  0x10(%rsi,%rcx,1),%xmm3
movsd  0x18(%rsi,%rcx,1),%xmm5
movhpd 0x28(%rsi,%rcx,1),%xmm2
movsd  (%rdi,%rcx,1),%xmm6
movsd  0x8(%rdi,%rcx,1),%xmm7
movsd  0x10(%rdi,%rcx,1),%xmm1
movsd  0x18(%rdi,%rcx,1),%xmm9
movhpd 0x28(%rdi,%rcx,1),%xmm6
mulpd  %xmm8,%xmm2
addpd  %xmm6,%xmm2
movhpd 0x30(%rsi,%rcx,1),%xmm4
movhpd 0x30(%rdi,%rcx,1),%xmm7
mulpd  %xmm8,%xmm4
addpd  %xmm7,%xmm4
movhpd 0x38(%rsi,%rcx,1),%xmm3
movhpd 0x38(%rdi,%rcx,1),%xmm1
mulpd  %xmm8,%xmm3
addpd  %xmm1,%xmm3
movhpd 0x40(%rsi,%rcx,1),%xmm5
movhpd 0x40(%rdi,%rcx,1),%xmm9
mulpd  %xmm8,%xmm5
addpd  %xmm9,%xmm5
movsd  0x20(%rsi,%rcx,1),%xmm1
movhpd 0x48(%rsi,%rcx,1),%xmm1
movsd  0x20(%rdi,%rcx,1),%xmm6
movhpd 0x48(%rdi,%rcx,1),%xmm6
mulpd  %xmm8,%xmm1
addpd  %xmm6,%xmm1
movapd %xmm2,%xmm6
unpcklpd %xmm4,%xmm6
movsd  %xmm1,%xmm2
unpckhpd %xmm3,%xmm4
unpcklpd %xmm5,%xmm3
movhlps %xmm5,%xmm1
movups %xmm1,0x40(%rdi,%rcx,1)
movupd %xmm4,0x30(%rdi,%rcx,1)
movupd %xmm2,0x20(%rdi,%rcx,1)
movupd %xmm3,0x10(%rdi,%rcx,1)
movupd %xmm6,(%rdi,%rcx,1)
add    $0x50,%rcx
add    $0xfffffffffffffffe,%rdx
jne    13a0 <cg_daxpy+0x2a0>
cmp    %r9,%r8
je     1504 <cg_daxpy+0x404>
nopl   0x0(%rax)
movsd  (%rsi,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  (%rdi,%rax,8),%xmm1
movsd  %xmm1,(%rdi,%rax,8)
movsd  0x8(%rsi,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x8(%rdi,%rax,8),%xmm1
movsd  %xmm1,0x8(%rdi,%rax,8)
movsd  0x10(%rsi,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x10(%rdi,%rax,8),%xmm1
movsd  %xmm1,0x10(%rdi,%rax,8)
movsd  0x18(%rsi,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x18(%rdi,%rax,8),%xmm1
movsd  %xmm1,0x18(%rdi,%rax,8)
movsd  0x20(%rsi,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x20(%rdi,%rax,8),%xmm1
movsd  %xmm1,0x20(%rdi,%rax,8)
add    $0x5,%rax
cmp    %r10,%rax
jl     1490 <cg_daxpy+0x390>
pop    %rbx
ret

LLVM IR (-O0):
define void @cg_daxpy(double* %0, double* %1, double %2, i64 %3) {
%5 = alloca double*
%6 = alloca double*
%7 = alloca double
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
store double* %0, double** %5
store double* %1, double** %6
store double %2, double* %7
store i64 %3, i64* %8
%11 = load i64, i64* %8
%12 = srem i64 %11, 5
store i64 %12, i64* %10
%13 = load double, double* %7
%14 = fcmp oeq double %13, -1.000000e+00
br i1 %14, label %15, label %96
15: ; preds = %4
store i64 0, i64* %9
br label %16
16: ; preds = %30, %15
%17 = load i64, i64* %9
%18 = load i64, i64* %10
%19 = icmp slt i64 %17, %18
br i1 %19, label %20, label %33
20: ; preds = %16
%21 = load double*, double** %6
%22 = load i64, i64* %9
%23 = getelementptr inbounds double, double* %21, i64 %22
%24 = load double, double* %23
%25 = load double*, double** %5
%26 = load i64, i64* %9
%27 = getelementptr inbounds double, double* %25, i64 %26
%28 = load double, double* %27
%29 = fsub double %28, %24
store double %29, double* %27
br label %30
30: ; preds = %20
%31 = load i64, i64* %9
%32 = add nsw i64 %31, 1
store i64 %32, i64* %9
br label %16
33: ; preds = %16
br label %34
34: ; preds = %92, %33
%35 = load i64, i64* %9
%36 = load i64, i64* %8
%37 = icmp slt i64 %35, %36
br i1 %37, label %38, label %95
38: ; preds = %34
%39 = load double*, double** %6
%40 = load i64, i64* %9
%41 = getelementptr inbounds double, double* %39, i64 %40
%42 = load double, double* %41
%43 = load double*, double** %5
%44 = load i64, i64* %9
%45 = getelementptr inbounds double, double* %43, i64 %44
%46 = load double, double* %45
%47 = fsub double %46, %42
store double %47, double* %45
%48 = load double*, double** %6
%49 = load i64, i64* %9
%50 = add nsw i64 %49, 1
%51 = getelementptr inbounds double, double* %48, i64 %50
%52 = load double, double* %51
%53 = load double*, double** %5
%54 = load i64, i64* %9
%55 = add nsw i64 %54, 1
%56 = getelementptr inbounds double, double* %53, i64 %55
%57 = load double, double* %56
%58 = fsub double %57, %52
store double %58, double* %56
%59 = load double*, double** %6
%60 = load i64, i64* %9
%61 = add nsw i64 %60, 2
%62 = getelementptr inbounds double, double* %59, i64 %61
%63 = load double, double* %62
%64 = load double*, double** %5
%65 = load i64, i64* %9
%66 = add nsw i64 %65, 2
%67 = getelementptr inbounds double, double* %64, i64 %66
%68 = load double, double* %67
%69 = fsub double %68, %63
store double %69, double* %67
%70 = load double*, double** %6
%71 = load i64, i64* %9
%72 = add nsw i64 %71, 3
%73 = getelementptr inbounds double, double* %70, i64 %72
%74 = load double, double* %73
%75 = load double*, double** %5
%76 = load i64, i64* %9
%77 = add nsw i64 %76, 3
%78 = getelementptr inbounds double, double* %75, i64 %77
%79 = load double, double* %78
%80 = fsub double %79, %74
store double %80, double* %78
%81 = load double*, double** %6
%82 = load i64, i64* %9
%83 = add nsw i64 %82, 4
%84 = getelementptr inbounds double, double* %81, i64 %83
%85 = load double, double* %84
%86 = load double*, double** %5
%87 = load i64, i64* %9
%88 = add nsw i64 %87, 4
%89 = getelementptr inbounds double, double* %86, i64 %88
%90 = load double, double* %89
%91 = fsub double %90, %85
store double %91, double* %89
br label %92
92: ; preds = %38
%93 = load i64, i64* %9
%94 = add nsw i64 %93, 5
store i64 %94, i64* %9
br label %34
95: ; preds = %34
br label %183
96: ; preds = %4
store i64 0, i64* %9
br label %97
97: ; preds = %112, %96
%98 = load i64, i64* %9
%99 = load i64, i64* %10
%100 = icmp slt i64 %98, %99
br i1 %100, label %101, label %115
101: ; preds = %97
%102 = load double, double* %7
%103 = load double*, double** %6
%104 = load i64, i64* %9
%105 = getelementptr inbounds double, double* %103, i64 %104
%106 = load double, double* %105
%107 = load double*, double** %5
%108 = load i64, i64* %9
%109 = getelementptr inbounds double, double* %107, i64 %108
%110 = load double, double* %109
%111 = call double @llvm.fmuladd.f64(double %102, double %106, double %110)
store double %111, double* %109
br label %112
112: ; preds = %101
%113 = load i64, i64* %9
%114 = add nsw i64 %113, 1
store i64 %114, i64* %9
br label %97
115: ; preds = %97
br label %116
116: ; preds = %179, %115
%117 = load i64, i64* %9
%118 = load i64, i64* %8
%119 = icmp slt i64 %117, %118
br i1 %119, label %120, label %182
120: ; preds = %116
%121 = load double, double* %7
%122 = load double*, double** %6
%123 = load i64, i64* %9
%124 = getelementptr inbounds double, double* %122, i64 %123
%125 = load double, double* %124
%126 = load double*, double** %5
%127 = load i64, i64* %9
%128 = getelementptr inbounds double, double* %126, i64 %127
%129 = load double, double* %128
%130 = call double @llvm.fmuladd.f64(double %121, double %125, double %129)
store double %130, double* %128
%131 = load double, double* %7
%132 = load double*, double** %6
%133 = load i64, i64* %9
%134 = add nsw i64 %133, 1
%135 = getelementptr inbounds double, double* %132, i64 %134
%136 = load double, double* %135
%137 = load double*, double** %5
%138 = load i64, i64* %9
%139 = add nsw i64 %138, 1
%140 = getelementptr inbounds double, double* %137, i64 %139
%141 = load double, double* %140
%142 = call double @llvm.fmuladd.f64(double %131, double %136, double %141)
store double %142, double* %140
%143 = load double, double* %7
%144 = load double*, double** %6
%145 = load i64, i64* %9
%146 = add nsw i64 %145, 2
%147 = getelementptr inbounds double, double* %144, i64 %146
%148 = load double, double* %147
%149 = load double*, double** %5
%150 = load i64, i64* %9
%151 = add nsw i64 %150, 2
%152 = getelementptr inbounds double, double* %149, i64 %151
%153 = load double, double* %152
%154 = call double @llvm.fmuladd.f64(double %143, double %148, double %153)
store double %154, double* %152
%155 = load double, double* %7
%156 = load double*, double** %6
%157 = load i64, i64* %9
%158 = add nsw i64 %157, 3
%159 = getelementptr inbounds double, double* %156, i64 %158
%160 = load double, double* %159
%161 = load double*, double** %5
%162 = load i64, i64* %9
%163 = add nsw i64 %162, 3
%164 = getelementptr inbounds double, double* %161, i64 %163
%165 = load double, double* %164
%166 = call double @llvm.fmuladd.f64(double %155, double %160, double %165)
store double %166, double* %164
%167 = load double, double* %7
%168 = load double*, double** %6
%169 = load i64, i64* %9
%170 = add nsw i64 %169, 4
%171 = getelementptr inbounds double, double* %168, i64 %170
%172 = load double, double* %171
%173 = load double*, double** %5
%174 = load i64, i64* %9
%175 = add nsw i64 %174, 4
%176 = getelementptr inbounds double, double* %173, i64 %175
%177 = load double, double* %176
%178 = call double @llvm.fmuladd.f64(double %167, double %172, double %177)
store double %178, double* %176
br label %179
179: ; preds = %120
%180 = load i64, i64* %9
%181 = add nsw i64 %180, 5
store i64 %181, i64* %9
br label %116
182: ; preds = %116
br label %183
183: ; preds = %182, %95
ret void
}

LLVM IR (-O2):
define void @cg_daxpy(double* nocapture %0, double* nocapture %1, double %2, i64 %3) {
%5 = srem i64 %3, 5
%6 = fcmp oeq double %2, -1.000000e+00
%7 = icmp sgt i64 %5, 0
br i1 %6, label %9, label %8
8: ; preds = %4
br i1 %7, label %208, label %88
9: ; preds = %4
br i1 %7, label %13, label %10
10: ; preds = %13, %18, %25, %32, %39, %9
%11 = phi i64 [ 0, %9 ], [ %5, %39 ], [ %5, %32 ], [ %5, %25 ], [ %5, %18 ], [ %5, %13 ]
%12 = icmp slt i64 %11, %3
br i1 %12, label %55, label %283
13: ; preds = %9
%14 = load double, double* %1
%15 = load double, double* %0
%16 = fsub double %15, %14
store double %16, double* %0
%17 = icmp eq i64 %5, 1
br i1 %17, label %10, label %18
18: ; preds = %13
%19 = getelementptr inbounds double, double* %1, i64 1
%20 = load double, double* %19
%21 = getelementptr inbounds double, double* %0, i64 1
%22 = load double, double* %21
%23 = fsub double %22, %20
store double %23, double* %21
%24 = icmp eq i64 %5, 2
br i1 %24, label %10, label %25
25: ; preds = %18
%26 = getelementptr inbounds double, double* %1, i64 2
%27 = load double, double* %26
%28 = getelementptr inbounds double, double* %0, i64 2
%29 = load double, double* %28
%30 = fsub double %29, %27
store double %30, double* %28
%31 = icmp eq i64 %5, 3
br i1 %31, label %10, label %32
32: ; preds = %25
%33 = getelementptr inbounds double, double* %1, i64 3
%34 = load double, double* %33
%35 = getelementptr inbounds double, double* %0, i64 3
%36 = load double, double* %35
%37 = fsub double %36, %34
store double %37, double* %35
%38 = icmp eq i64 %5, 4
br i1 %38, label %10, label %39
39: ; preds = %32
%40 = getelementptr inbounds double, double* %1, i64 4
%41 = load double, double* %40
%42 = getelementptr inbounds double, double* %0, i64 4
%43 = load double, double* %42
%44 = fsub double %43, %41
store double %44, double* %42
%45 = getelementptr inbounds double, double* %1, i64 5
%46 = load double, double* %45
%47 = getelementptr inbounds double, double* %0, i64 5
%48 = load double, double* %47
%49 = fsub double %48, %46
store double %49, double* %47
%50 = getelementptr inbounds double, double* %1, i64 6
%51 = load double, double* %50
%52 = getelementptr inbounds double, double* %0, i64 6
%53 = load double, double* %52
%54 = fsub double %53, %51
store double %54, double* %52
br label %10
55: ; preds = %10, %55
%56 = phi i64 [ %86, %55 ], [ %11, %10 ]
%57 = getelementptr inbounds double, double* %1, i64 %56
%58 = load double, double* %57
%59 = getelementptr inbounds double, double* %0, i64 %56
%60 = load double, double* %59
%61 = fsub double %60, %58
store double %61, double* %59
%62 = add nuw nsw i64 %56, 1
%63 = getelementptr inbounds double, double* %1, i64 %62
%64 = load double, double* %63
%65 = getelementptr inbounds double, double* %0, i64 %62
%66 = load double, double* %65
%67 = fsub double %66, %64
store double %67, double* %65
%68 = add nuw nsw i64 %56, 2
%69 = getelementptr inbounds double, double* %1, i64 %68
%70 = load double, double* %69
%71 = getelementptr inbounds double, double* %0, i64 %68
%72 = load double, double* %71
%73 = fsub double %72, %70
store double %73, double* %71
%74 = add nuw nsw i64 %56, 3
%75 = getelementptr inbounds double, double* %1, i64 %74
%76 = load double, double* %75
%77 = getelementptr inbounds double, double* %0, i64 %74
%78 = load double, double* %77
%79 = fsub double %78, %76
store double %79, double* %77
%80 = add nuw nsw i64 %56, 4
%81 = getelementptr inbounds double, double* %1, i64 %80
%82 = load double, double* %81
%83 = getelementptr inbounds double, double* %0, i64 %80
%84 = load double, double* %83
%85 = fsub double %84, %82
store double %85, double* %83
%86 = add nuw nsw i64 %56, 5
%87 = icmp slt i64 %86, %3
br i1 %87, label %55, label %283
88: ; preds = %208, %213, %220, %227, %234, %8
%89 = phi i64 [ 0, %8 ], [ %5, %234 ], [ %5, %227 ], [ %5, %220 ], [ %5, %213 ], [ %5, %208 ]
%90 = icmp slt i64 %89, %3
br i1 %90, label %91, label %283
91: ; preds = %88
%92 = xor i64 %89, -1
%93 = add i64 %92, %3
%94 = udiv i64 %93, 5
%95 = add nuw nsw i64 %94, 1
%96 = icmp ult i64 %93, 5
br i1 %96, label %206, label %97
97: ; preds = %91
%98 = getelementptr double, double* %0, i64 %89
%99 = xor i64 %89, -1
%100 = add i64 %99, %3
%101 = urem i64 %100, 5
%102 = sub i64 %100, %101
%103 = add i64 %89, %102
%104 = add i64 %103, 5
%105 = getelementptr double, double* %0, i64 %104
%106 = getelementptr double, double* %1, i64 %89
%107 = getelementptr double, double* %1, i64 %104
%108 = icmp ult double* %98, %107
%109 = icmp ult double* %106, %105
%110 = and i1 %108, %109
br i1 %110, label %206, label %111
111: ; preds = %97
%112 = and i64 %95, 9223372036854775806
%113 = mul i64 %112, 5
%114 = add i64 %89, %113
%115 = insertelement <2 x double> poison, double %2, i64 0
%116 = shufflevector <2 x double> %115, <2 x double> poison, <2 x i32> zeroinitializer
br label %117
117: ; preds = %117, %111
%118 = phi i64 [ 0, %111 ], [ %202, %117 ]
%119 = mul i64 %118, 5
%120 = add i64 %89, %119
%121 = add i64 %120, 5
%122 = getelementptr inbounds double, double* %1, i64 %120
%123 = getelementptr inbounds double, double* %1, i64 %121
%124 = load double, double* %122
%125 = load double, double* %123
%126 = insertelement <2 x double> poison, double %124, i64 0
%127 = insertelement <2 x double> %126, double %125, i64 1
%128 = getelementptr inbounds double, double* %0, i64 %120
%129 = getelementptr inbounds double, double* %0, i64 %121
%130 = load double, double* %128
%131 = load double, double* %129
%132 = insertelement <2 x double> poison, double %130, i64 0
%133 = insertelement <2 x double> %132, double %131, i64 1
%134 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %116, <2 x double> %127, <2 x double> %133)
%135 = add nuw nsw i64 %120, 1
%136 = add i64 %120, 6
%137 = getelementptr inbounds double, double* %1, i64 %135
%138 = getelementptr inbounds double, double* %1, i64 %136
%139 = load double, double* %137
%140 = load double, double* %138
%141 = insertelement <2 x double> poison, double %139, i64 0
%142 = insertelement <2 x double> %141, double %140, i64 1
%143 = getelementptr inbounds double, double* %0, i64 %135
%144 = getelementptr inbounds double, double* %0, i64 %136
%145 = load double, double* %143
%146 = load double, double* %144
%147 = insertelement <2 x double> poison, double %145, i64 0
%148 = insertelement <2 x double> %147, double %146, i64 1
%149 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %116, <2 x double> %142, <2 x double> %148)
%150 = add nuw nsw i64 %120, 2
%151 = add i64 %120, 7
%152 = getelementptr inbounds double, double* %1, i64 %150
%153 = getelementptr inbounds double, double* %1, i64 %151
%154 = load double, double* %152
%155 = load double, double* %153
%156 = insertelement <2 x double> poison, double %154, i64 0
%157 = insertelement <2 x double> %156, double %155, i64 1
%158 = getelementptr inbounds double, double* %0, i64 %150
%159 = getelementptr inbounds double, double* %0, i64 %151
%160 = load double, double* %158
%161 = load double, double* %159
%162 = insertelement <2 x double> poison, double %160, i64 0
%163 = insertelement <2 x double> %162, double %161, i64 1
%164 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %116, <2 x double> %157, <2 x double> %163)
%165 = add nuw nsw i64 %120, 3
%166 = add i64 %120, 8
%167 = getelementptr inbounds double, double* %1, i64 %165
%168 = getelementptr inbounds double, double* %1, i64 %166
%169 = load double, double* %167
%170 = load double, double* %168
%171 = insertelement <2 x double> poison, double %169, i64 0
%172 = insertelement <2 x double> %171, double %170, i64 1
%173 = getelementptr inbounds double, double* %0, i64 %165
%174 = getelementptr inbounds double, double* %0, i64 %166
%175 = load double, double* %173
%176 = load double, double* %174
%177 = insertelement <2 x double> poison, double %175, i64 0
%178 = insertelement <2 x double> %177, double %176, i64 1
%179 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %116, <2 x double> %172, <2 x double> %178)
%180 = add nuw nsw i64 %120, 4
%181 = add i64 %120, 9
%182 = getelementptr inbounds double, double* %1, i64 %180
%183 = getelementptr inbounds double, double* %1, i64 %181
%184 = load double, double* %182
%185 = load double, double* %183
%186 = insertelement <2 x double> poison, double %184, i64 0
%187 = insertelement <2 x double> %186, double %185, i64 1
%188 = getelementptr inbounds double, double* %0, i64 %180
%189 = getelementptr inbounds double, double* %0, i64 %181
%190 = load double, double* %188
%191 = load double, double* %189
%192 = insertelement <2 x double> poison, double %190, i64 0
%193 = insertelement <2 x double> %192, double %191, i64 1
%194 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %116, <2 x double> %187, <2 x double> %193)
%195 = getelementptr inbounds double, double* %0, i64 %120
%196 = bitcast double* %195 to <10 x double>*
%197 = shufflevector <2 x double> %134, <2 x double> %149, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%198 = shufflevector <2 x double> %164, <2 x double> %179, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%199 = shufflevector <4 x double> %197, <4 x double> %198, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
%200 = shufflevector <2 x double> %194, <2 x double> poison, <8 x i32> <i32 0, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
%201 = shufflevector <8 x double> %199, <8 x double> %200, <10 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 1, i32 3, i32 5, i32 7, i32 9>
store <10 x double> %201, <10 x double>* %196
%202 = add nuw i64 %118, 2
%203 = icmp eq i64 %202, %112
br i1 %203, label %204, label %117
204: ; preds = %117
%205 = icmp eq i64 %95, %112
br i1 %205, label %283, label %206
206: ; preds = %97, %91, %204
%207 = phi i64 [ %89, %97 ], [ %89, %91 ], [ %114, %204 ]
br label %250
208: ; preds = %8
%209 = load double, double* %1
%210 = load double, double* %0
%211 = tail call double @llvm.fmuladd.f64(double %2, double %209, double %210)
store double %211, double* %0
%212 = icmp eq i64 %5, 1
br i1 %212, label %88, label %213
213: ; preds = %208
%214 = getelementptr inbounds double, double* %1, i64 1
%215 = load double, double* %214
%216 = getelementptr inbounds double, double* %0, i64 1
%217 = load double, double* %216
%218 = tail call double @llvm.fmuladd.f64(double %2, double %215, double %217)
store double %218, double* %216
%219 = icmp eq i64 %5, 2
br i1 %219, label %88, label %220
220: ; preds = %213
%221 = getelementptr inbounds double, double* %1, i64 2
%222 = load double, double* %221
%223 = getelementptr inbounds double, double* %0, i64 2
%224 = load double, double* %223
%225 = tail call double @llvm.fmuladd.f64(double %2, double %222, double %224)
store double %225, double* %223
%226 = icmp eq i64 %5, 3
br i1 %226, label %88, label %227
227: ; preds = %220
%228 = getelementptr inbounds double, double* %1, i64 3
%229 = load double, double* %228
%230 = getelementptr inbounds double, double* %0, i64 3
%231 = load double, double* %230
%232 = tail call double @llvm.fmuladd.f64(double %2, double %229, double %231)
store double %232, double* %230
%233 = icmp eq i64 %5, 4
br i1 %233, label %88, label %234
234: ; preds = %227
%235 = getelementptr inbounds double, double* %1, i64 4
%236 = load double, double* %235
%237 = getelementptr inbounds double, double* %0, i64 4
%238 = load double, double* %237
%239 = tail call double @llvm.fmuladd.f64(double %2, double %236, double %238)
store double %239, double* %237
%240 = getelementptr inbounds double, double* %1, i64 5
%241 = load double, double* %240
%242 = getelementptr inbounds double, double* %0, i64 5
%243 = load double, double* %242
%244 = tail call double @llvm.fmuladd.f64(double %2, double %241, double %243)
store double %244, double* %242
%245 = getelementptr inbounds double, double* %1, i64 6
%246 = load double, double* %245
%247 = getelementptr inbounds double, double* %0, i64 6
%248 = load double, double* %247
%249 = tail call double @llvm.fmuladd.f64(double %2, double %246, double %248)
store double %249, double* %247
br label %88
250: ; preds = %206, %250
%251 = phi i64 [ %281, %250 ], [ %207, %206 ]
%252 = getelementptr inbounds double, double* %1, i64 %251
%253 = load double, double* %252
%254 = getelementptr inbounds double, double* %0, i64 %251
%255 = load double, double* %254
%256 = tail call double @llvm.fmuladd.f64(double %2, double %253, double %255)
store double %256, double* %254
%257 = add nuw nsw i64 %251, 1
%258 = getelementptr inbounds double, double* %1, i64 %257
%259 = load double, double* %258
%260 = getelementptr inbounds double, double* %0, i64 %257
%261 = load double, double* %260
%262 = tail call double @llvm.fmuladd.f64(double %2, double %259, double %261)
store double %262, double* %260
%263 = add nuw nsw i64 %251, 2
%264 = getelementptr inbounds double, double* %1, i64 %263
%265 = load double, double* %264
%266 = getelementptr inbounds double, double* %0, i64 %263
%267 = load double, double* %266
%268 = tail call double @llvm.fmuladd.f64(double %2, double %265, double %267)
store double %268, double* %266
%269 = add nuw nsw i64 %251, 3
%270 = getelementptr inbounds double, double* %1, i64 %269
%271 = load double, double* %270
%272 = getelementptr inbounds double, double* %0, i64 %269
%273 = load double, double* %272
%274 = tail call double @llvm.fmuladd.f64(double %2, double %271, double %273)
store double %274, double* %272
%275 = add nuw nsw i64 %251, 4
%276 = getelementptr inbounds double, double* %1, i64 %275
%277 = load double, double* %276
%278 = getelementptr inbounds double, double* %0, i64 %275
%279 = load double, double* %278
%280 = tail call double @llvm.fmuladd.f64(double %2, double %277, double %279)
store double %280, double* %278
%281 = add nuw nsw i64 %251, 5
%282 = icmp slt i64 %281, %3
br i1 %282, label %250, label %283
283: ; preds = %250, %55, %204, %88, %10
ret void
}