int acor_fn(double *mean, double *fn, double X[], int L, int maxt) {
  int t, n;
  *mean = 0.;
  for (n = 0; n < L; n++)
    *mean += X[n];
  *mean = *mean / L;
  for (n = 0; n < L; n++)
    X[n] -= *mean;
  for (t = 0; t < maxt; t++)
    fn[t] = 0.;
  for (t = 0; t < maxt; t++)
    for (n = 0; n < L - t; n++)
      fn[t] += X[n] * X[n + t];
  for (t = 0; t < maxt; t++)
    fn[t] /= L - t;
  return 0;
}


x86 assembly (clang, -O0):
<acor_fn>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    -0x8(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    115c <acor_fn+0x5c>
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1129 <acor_fn+0x29>
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
cvtsi2sdl -0x1c(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11b4 <acor_fn+0xb4>
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    117c <acor_fn+0x7c>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    11e5 <acor_fn+0xe5>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11bb <acor_fn+0xbb>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    126a <acor_fn+0x16a>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    -0x24(%rbp),%ecx
cmp    %ecx,%eax
jge    1257 <acor_fn+0x157>
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    11ff <acor_fn+0xff>
jmp    125c <acor_fn+0x15c>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11ec <acor_fn+0xec>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    12ab <acor_fn+0x1ab>
mov    -0x1c(%rbp),%eax
sub    -0x24(%rbp),%eax
cvtsi2sd %eax,%xmm1
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1271 <acor_fn+0x171>
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<acor_fn>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %ecx,%r15d
mov    %rdx,%r13
mov    %rsi,%r14
movq   $0x0,(%rdi)
test   %ecx,%ecx
jle    1149 <acor_fn+0x39>
mov    %r15d,%ecx
lea    -0x1(%rcx),%r9
mov    %ecx,%edx
and    $0x3,%edx
cmp    $0x3,%r9
jae    115f <acor_fn+0x4f>
xorpd  %xmm0,%xmm0
xor    %esi,%esi
jmp    11a5 <acor_fn+0x95>
cvtsi2sd %r15d,%xmm0
xorpd  %xmm1,%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%rdi)
jmp    1391 <acor_fn+0x281>
mov    %ecx,%eax
and    $0xfffffffc,%eax
xorpd  %xmm0,%xmm0
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
addsd  0x0(%r13,%rsi,8),%xmm0
movsd  %xmm0,(%rdi)
addsd  0x8(%r13,%rsi,8),%xmm0
movsd  %xmm0,(%rdi)
addsd  0x10(%r13,%rsi,8),%xmm0
movsd  %xmm0,(%rdi)
addsd  0x18(%r13,%rsi,8),%xmm0
movsd  %xmm0,(%rdi)
add    $0x4,%rsi
cmp    %rsi,%rax
jne    1170 <acor_fn+0x60>
test   %rdx,%rdx
je     11d2 <acor_fn+0xc2>
lea    0x0(,%rsi,8),%rax
add    %r13,%rax
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
addsd  (%rax,%rsi,8),%xmm0
movsd  %xmm0,(%rdi)
add    $0x1,%rsi
cmp    %rsi,%rdx
jne    11c0 <acor_fn+0xb0>
cvtsi2sd %r15d,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rdi)
test   %r15d,%r15d
jle    1391 <acor_fn+0x281>
movsd  0x0(%r13),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,0x0(%r13)
cmp    $0x1,%r15d
je     1391 <acor_fn+0x281>
mov    $0x1,%edx
cmp    $0x4,%r9
jb     12f0 <acor_fn+0x1e0>
cmp    %rdi,%r13
jae    122a <acor_fn+0x11a>
lea    0x0(,%rcx,8),%rax
add    %r13,%rax
cmp    %rdi,%rax
ja     12f0 <acor_fn+0x1e0>
mov    %r9,%rdx
and    $0xfffffffffffffffc,%rdx
lea    -0x4(%rdx),%rax
mov    %rax,%rbx
shr    $0x2,%rbx
add    $0x1,%rbx
test   %rax,%rax
je     1587 <acor_fn+0x477>
mov    %rbx,%rbp
and    $0xfffffffffffffffe,%rbp
movsd  (%rdi),%xmm0
unpcklpd %xmm0,%xmm0
mov    $0x1,%esi
nopl   (%rax)
movupd 0x0(%r13,%rsi,8),%xmm1
movupd 0x10(%r13,%rsi,8),%xmm2
movupd 0x20(%r13,%rsi,8),%xmm3
movupd 0x30(%r13,%rsi,8),%xmm4
subpd  %xmm0,%xmm1
subpd  %xmm0,%xmm2
movupd %xmm1,0x0(%r13,%rsi,8)
movupd %xmm2,0x10(%r13,%rsi,8)
subpd  %xmm0,%xmm3
subpd  %xmm0,%xmm4
movupd %xmm3,0x20(%r13,%rsi,8)
movupd %xmm4,0x30(%r13,%rsi,8)
add    $0x8,%rsi
add    $0xfffffffffffffffe,%rbp
jne    1260 <acor_fn+0x150>
test   $0x1,%bl
je     12e3 <acor_fn+0x1d3>
movsd  (%rdi),%xmm0
unpcklpd %xmm0,%xmm0
movupd 0x0(%r13,%rsi,8),%xmm1
movupd 0x10(%r13,%rsi,8),%xmm2
subpd  %xmm0,%xmm1
subpd  %xmm0,%xmm2
movupd %xmm1,0x0(%r13,%rsi,8)
movupd %xmm2,0x10(%r13,%rsi,8)
cmp    %rdx,%r9
je     1391 <acor_fn+0x281>
or     $0x1,%rdx
mov    %ecx,%esi
sub    %edx,%esi
mov    %rdx,%rax
not    %rax
add    %rcx,%rax
and    $0x3,%rsi
je     132c <acor_fn+0x21c>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  0x0(%r13,%rdx,8),%xmm0
subsd  (%rdi),%xmm0
movsd  %xmm0,0x0(%r13,%rdx,8)
add    $0x1,%rdx
add    $0xffffffffffffffff,%rsi
jne    1310 <acor_fn+0x200>
cmp    $0x3,%rax
jb     1391 <acor_fn+0x281>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  0x0(%r13,%rdx,8),%xmm0
subsd  (%rdi),%xmm0
movsd  0x8(%r13,%rdx,8),%xmm1
movsd  %xmm0,0x0(%r13,%rdx,8)
subsd  (%rdi),%xmm1
movsd  %xmm1,0x8(%r13,%rdx,8)
movsd  0x10(%r13,%rdx,8),%xmm0
subsd  (%rdi),%xmm0
movsd  %xmm0,0x10(%r13,%rdx,8)
movsd  0x18(%r13,%rdx,8),%xmm0
subsd  (%rdi),%xmm0
movsd  %xmm0,0x18(%r13,%rdx,8)
add    $0x4,%rdx
cmp    %rdx,%rcx
jne    1340 <acor_fn+0x230>
test   %r8d,%r8d
jle    1565 <acor_fn+0x455>
mov    %r8d,0x4(%rsp)
mov    %r8d,%r12d
lea    0x0(,%r12,8),%rdx
xor    %ebp,%ebp
mov    %r14,%rdi
xor    %esi,%esi
call   1030 <memset@plt>
lea    0x8(%r13),%rax
xor    %ecx,%ecx
mov    %r15d,%edx
jmp    13e4 <acor_fn+0x2d4>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%rcx
add    $0xffffffff,%edx
add    $0x8,%rbp
cmp    %r12,%rcx
je     1468 <acor_fn+0x358>
mov    %edx,%edx
cmp    %r15d,%ecx
jge    13d0 <acor_fn+0x2c0>
movsd  (%r14,%rcx,8),%xmm0
cmp    $0x1,%edx
jne    1400 <acor_fn+0x2f0>
xor    %esi,%esi
jmp    1443 <acor_fn+0x333>
nopw   0x0(%rax,%rax,1)
mov    %edx,%edi
and    $0xfffffffe,%edi
lea    (%rax,%rbp,1),%rbx
xor    %esi,%esi
nopl   0x0(%rax,%rax,1)
movsd  -0x8(%rax,%rsi,8),%xmm1
mulsd  -0x8(%rbx,%rsi,8),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%r14,%rcx,8)
movsd  (%rax,%rsi,8),%xmm0
mulsd  (%rbx,%rsi,8),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%r14,%rcx,8)
add    $0x2,%rsi
cmp    %rsi,%rdi
jne    1410 <acor_fn+0x300>
test   $0x1,%dl
je     13d0 <acor_fn+0x2c0>
movsd  0x0(%r13,%rsi,8),%xmm1
add    %rcx,%rsi
mulsd  0x0(%r13,%rsi,8),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%r14,%rcx,8)
jmp    13d0 <acor_fn+0x2c0>
mov    0x4(%rsp),%eax
test   %eax,%eax
jle    1565 <acor_fn+0x455>
cmp    $0x1,%eax
jne    1480 <acor_fn+0x370>
xor    %eax,%eax
jmp    1536 <acor_fn+0x426>
mov    %r12d,%eax
and    $0xfffffffe,%eax
movd   %r15d,%xmm0
pshufd $0x50,%xmm0,%xmm0
lea    -0x2(%rax),%rdx
mov    %rdx,%rcx
shr    %rcx
add    $0x1,%rcx
test   %rdx,%rdx
je     1576 <acor_fn+0x466>
mov    %rcx,%rsi
and    $0xfffffffffffffffe,%rsi
movdqa 0xb4a(%rip),%xmm1
xor    %edx,%edx
movdqa 0xb50(%rip),%xmm2
movdqa 0xb58(%rip),%xmm3
nopl   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm4
psubd  %xmm1,%xmm4
cvtdq2pd %xmm4,%xmm5
movupd (%r14,%rdx,8),%xmm6
divpd  %xmm5,%xmm6
movupd 0x10(%r14,%rdx,8),%xmm5
movupd %xmm6,(%r14,%rdx,8)
psubd  %xmm2,%xmm4
cvtdq2pd %xmm4,%xmm4
divpd  %xmm4,%xmm5
movupd %xmm5,0x10(%r14,%rdx,8)
add    $0x4,%rdx
paddd  %xmm3,%xmm1
add    $0xfffffffffffffffe,%rsi
jne    14d0 <acor_fn+0x3c0>
test   $0x1,%cl
je     1531 <acor_fn+0x421>
psubd  %xmm1,%xmm0
cvtdq2pd %xmm0,%xmm0
movupd (%r14,%rdx,8),%xmm1
divpd  %xmm0,%xmm1
movupd %xmm1,(%r14,%rdx,8)
cmp    %r12,%rax
je     1565 <acor_fn+0x455>
sub    %eax,%r15d
nopl   0x0(%rax)
xorps  %xmm0,%xmm0
cvtsi2sd %r15d,%xmm0
movsd  (%r14,%rax,8),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%r14,%rax,8)
add    $0x1,%rax
add    $0xffffffff,%r15d
cmp    %rax,%r12
jne    1540 <acor_fn+0x430>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
movdqa 0xa82(%rip),%xmm1
xor    %edx,%edx
test   $0x1,%cl
jne    1519 <acor_fn+0x409>
jmp    1531 <acor_fn+0x421>
mov    $0x1,%esi
test   $0x1,%bl
jne    12b7 <acor_fn+0x1a7>
jmp    12e3 <acor_fn+0x1d3>

LLVM IR (-O0):
define i32 @acor_fn(double* %0, double* %1, double* %2, i32 %3, i32 %4) {
%6 = alloca double*
%7 = alloca double*
%8 = alloca double*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store double* %0, double** %6
store double* %1, double** %7
store double* %2, double** %8
store i32 %3, i32* %9
store i32 %4, i32* %10
%13 = load double*, double** %6
store double 0.000000e+00, double* %13
store i32 0, i32* %12
br label %14
14: ; preds = %27, %5
%15 = load i32, i32* %12
%16 = load i32, i32* %9
%17 = icmp slt i32 %15, %16
br i1 %17, label %18, label %30
18: ; preds = %14
%19 = load double*, double** %8
%20 = load i32, i32* %12
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds double, double* %19, i64 %21
%23 = load double, double* %22
%24 = load double*, double** %6
%25 = load double, double* %24
%26 = fadd double %25, %23
store double %26, double* %24
br label %27
27: ; preds = %18
%28 = load i32, i32* %12
%29 = add nsw i32 %28, 1
store i32 %29, i32* %12
br label %14
30: ; preds = %14
%31 = load double*, double** %6
%32 = load double, double* %31
%33 = load i32, i32* %9
%34 = sitofp i32 %33 to double
%35 = fdiv double %32, %34
%36 = load double*, double** %6
store double %35, double* %36
store i32 0, i32* %12
br label %37
37: ; preds = %50, %30
%38 = load i32, i32* %12
%39 = load i32, i32* %9
%40 = icmp slt i32 %38, %39
br i1 %40, label %41, label %53
41: ; preds = %37
%42 = load double*, double** %6
%43 = load double, double* %42
%44 = load double*, double** %8
%45 = load i32, i32* %12
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds double, double* %44, i64 %46
%48 = load double, double* %47
%49 = fsub double %48, %43
store double %49, double* %47
br label %50
50: ; preds = %41
%51 = load i32, i32* %12
%52 = add nsw i32 %51, 1
store i32 %52, i32* %12
br label %37
53: ; preds = %37
store i32 0, i32* %11
br label %54
54: ; preds = %63, %53
%55 = load i32, i32* %11
%56 = load i32, i32* %10
%57 = icmp slt i32 %55, %56
br i1 %57, label %58, label %66
58: ; preds = %54
%59 = load double*, double** %7
%60 = load i32, i32* %11
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds double, double* %59, i64 %61
store double 0.000000e+00, double* %62
br label %63
63: ; preds = %58
%64 = load i32, i32* %11
%65 = add nsw i32 %64, 1
store i32 %65, i32* %11
br label %54
66: ; preds = %54
store i32 0, i32* %11
br label %67
67: ; preds = %101, %66
%68 = load i32, i32* %11
%69 = load i32, i32* %10
%70 = icmp slt i32 %68, %69
br i1 %70, label %71, label %104
71: ; preds = %67
store i32 0, i32* %12
br label %72
72: ; preds = %97, %71
%73 = load i32, i32* %12
%74 = load i32, i32* %9
%75 = load i32, i32* %11
%76 = sub nsw i32 %74, %75
%77 = icmp slt i32 %73, %76
br i1 %77, label %78, label %100
78: ; preds = %72
%79 = load double*, double** %8
%80 = load i32, i32* %12
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds double, double* %79, i64 %81
%83 = load double, double* %82
%84 = load double*, double** %8
%85 = load i32, i32* %12
%86 = load i32, i32* %11
%87 = add nsw i32 %85, %86
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds double, double* %84, i64 %88
%90 = load double, double* %89
%91 = load double*, double** %7
%92 = load i32, i32* %11
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds double, double* %91, i64 %93
%95 = load double, double* %94
%96 = call double @llvm.fmuladd.f64(double %83, double %90, double %95)
store double %96, double* %94
br label %97
97: ; preds = %78
%98 = load i32, i32* %12
%99 = add nsw i32 %98, 1
store i32 %99, i32* %12
br label %72
100: ; preds = %72
br label %101
101: ; preds = %100
%102 = load i32, i32* %11
%103 = add nsw i32 %102, 1
store i32 %103, i32* %11
br label %67
104: ; preds = %67
store i32 0, i32* %11
br label %105
105: ; preds = %120, %104
%106 = load i32, i32* %11
%107 = load i32, i32* %10
%108 = icmp slt i32 %106, %107
br i1 %108, label %109, label %123
109: ; preds = %105
%110 = load i32, i32* %9
%111 = load i32, i32* %11
%112 = sub nsw i32 %110, %111
%113 = sitofp i32 %112 to double
%114 = load double*, double** %7
%115 = load i32, i32* %11
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds double, double* %114, i64 %116
%118 = load double, double* %117
%119 = fdiv double %118, %113
store double %119, double* %117
br label %120
120: ; preds = %109
%121 = load i32, i32* %11
%122 = add nsw i32 %121, 1
store i32 %122, i32* %11
br label %105
123: ; preds = %105
ret i32 0
}

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