void detrend_lsq(double *source, int n, double *dest, double *slope,
                 double *intercept) {
  int i;
  double x = 0.0, y = 0.0, xmean = 0.0, ymean = 0.0, xvar = 0.0, xy = 0.0;
  xmean = (double)(n - 1) / 2.0;
  for (i = 0; i < n; i++)
    ymean += source[i];
  ymean /= (double)n;
  for (i = 0; i < n; i++) {
    x = (double)i - xmean;
    y = source[i] - ymean;
    xvar += x * x;
    xy += x * y;
  }
  *slope = xy / xvar;
  *intercept = ymean - *slope * xmean;
  for (i = 0; i < n; i++) {
    y = *slope * (double)i + *intercept;
    dest[i] = source[i] - y;
  }
}


x86 assembly (clang, -O0):
<detrend_lsq>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm0
movsd  0xea7(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    119a <detrend_lsq+0x9a>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1169 <detrend_lsq+0x69>
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    122c <detrend_lsq+0x12c>
cvtsi2sdl -0x2c(%rbp),%xmm0
subsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11b4 <detrend_lsq+0xb4>
movsd  -0x60(%rbp),%xmm0
divsd  -0x58(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x50(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    12d9 <detrend_lsq+0x1d9>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
cvtsi2sdl -0x2c(%rbp),%xmm2
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x40(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    127e <detrend_lsq+0x17e>
pop    %rbp
ret

x86 assembly (clang, -O2):
<detrend_lsq>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %esi,%esi
jle    141c <detrend_lsq+0x31c>
mov    %esi,%r10d
lea    -0x1(%r10),%r9
mov    %r10d,%r11d
and    $0x7,%r11d
cmp    $0x7,%r9
jae    112e <detrend_lsq+0x2e>
xorpd  %xmm0,%xmm0
xor    %eax,%eax
jmp    1178 <detrend_lsq+0x78>
mov    %r10d,%ebx
and    $0xfffffff8,%ebx
xorpd  %xmm0,%xmm0
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
addsd  (%rdi,%rax,8),%xmm0
addsd  0x8(%rdi,%rax,8),%xmm0
addsd  0x10(%rdi,%rax,8),%xmm0
addsd  0x18(%rdi,%rax,8),%xmm0
addsd  0x20(%rdi,%rax,8),%xmm0
addsd  0x28(%rdi,%rax,8),%xmm0
addsd  0x30(%rdi,%rax,8),%xmm0
addsd  0x38(%rdi,%rax,8),%xmm0
add    $0x8,%rax
cmp    %rax,%rbx
jne    1140 <detrend_lsq+0x40>
test   %r11,%r11
je     119e <detrend_lsq+0x9e>
lea    (%rdi,%rax,8),%rax
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
addsd  (%rax,%rbx,8),%xmm0
add    $0x1,%rbx
cmp    %rbx,%r11
jne    1190 <detrend_lsq+0x90>
test   %esi,%esi
jle    141c <detrend_lsq+0x31c>
lea    -0x1(%rsi),%eax
cvtsi2sd %eax,%xmm1
mulsd  0xe4b(%rip),%xmm1
cvtsi2sd %esi,%xmm2
divsd  %xmm2,%xmm0
movapd %xmm0,%xmm3
unpcklpd %xmm1,%xmm3
test   %r9,%r9
je     1441 <detrend_lsq+0x341>
mov    %r10d,%r11d
and    $0xfffffffe,%r11d
xorpd  %xmm2,%xmm2
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
movsd  (%rdi,%rax,8),%xmm5
unpcklpd %xmm4,%xmm5
movsd  0x8(%rdi,%rax,8),%xmm4
subpd  %xmm3,%xmm5
movapd %xmm5,%xmm6
unpckhpd %xmm5,%xmm6
mulpd  %xmm5,%xmm6
lea    0x1(%rax),%ebx
xorps  %xmm5,%xmm5
cvtsi2sd %ebx,%xmm5
addpd  %xmm2,%xmm6
unpcklpd %xmm5,%xmm4
subpd  %xmm3,%xmm4
movapd %xmm4,%xmm2
unpckhpd %xmm4,%xmm2
mulpd  %xmm4,%xmm2
addpd  %xmm6,%xmm2
add    $0x2,%rax
cmp    %r11,%rax
jne    11e0 <detrend_lsq+0xe0>
test   $0x1,%r10b
je     125f <detrend_lsq+0x15f>
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
movsd  (%rdi,%rax,8),%xmm5
unpcklpd %xmm4,%xmm5
subpd  %xmm3,%xmm5
movapd %xmm5,%xmm3
unpckhpd %xmm5,%xmm3
mulpd  %xmm5,%xmm3
addpd  %xmm3,%xmm2
movapd %xmm2,%xmm3
unpckhpd %xmm2,%xmm3
divsd  %xmm3,%xmm2
movsd  %xmm2,(%rcx)
mulsd  %xmm1,%xmm2
subsd  %xmm2,%xmm0
movsd  %xmm0,(%r8)
test   %esi,%esi
jle    1436 <detrend_lsq+0x336>
xorpd  %xmm1,%xmm1
mulsd  (%rcx),%xmm1
addsd  %xmm0,%xmm1
movsd  (%rdi),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rdx)
cmp    $0x1,%esi
je     1436 <detrend_lsq+0x336>
mov    $0x1,%esi
cmp    $0x4,%r9
jb     1396 <detrend_lsq+0x296>
lea    0x8(%rdx),%r15
lea    (%rdx,%r10,8),%rbp
lea    0x8(%rdi),%r14
lea    (%rdi,%r10,8),%rbx
cmp    %r8,%rdx
setb   %r12b
cmp    %r8,%rbp
seta   %r13b
cmp    %rcx,%rdx
setb   %al
cmp    %rcx,%rbp
seta   %r11b
cmp    %rbx,%r15
setb   %bl
cmp    %rbp,%r14
setb   %bpl
test   %r13b,%r12b
jne    1396 <detrend_lsq+0x296>
and    %r11b,%al
jne    1396 <detrend_lsq+0x296>
and    %bpl,%bl
jne    1396 <detrend_lsq+0x296>
mov    %r9,%r11
and    $0xfffffffffffffffc,%r11
lea    0x1(%r11),%rsi
movsd  (%r8),%xmm0
unpcklpd %xmm0,%xmm0
movsd  (%rcx),%xmm1
unpcklpd %xmm1,%xmm1
movdqa 0xce5(%rip),%xmm2
xor    %eax,%eax
movdqa 0xceb(%rip),%xmm3
movdqa 0xcf3(%rip),%xmm4
nopl   (%rax)
movdqa %xmm2,%xmm5
cvtdq2pd %xmm2,%xmm6
paddd  %xmm3,%xmm5
cvtdq2pd %xmm5,%xmm5
mulpd  %xmm1,%xmm6
addpd  %xmm0,%xmm6
mulpd  %xmm1,%xmm5
addpd  %xmm0,%xmm5
movupd 0x8(%rdi,%rax,8),%xmm7
subpd  %xmm6,%xmm7
movupd 0x18(%rdi,%rax,8),%xmm6
subpd  %xmm5,%xmm6
movupd %xmm7,0x8(%rdx,%rax,8)
movupd %xmm6,0x18(%rdx,%rax,8)
add    $0x4,%rax
paddd  %xmm4,%xmm2
cmp    %rax,%r11
jne    1340 <detrend_lsq+0x240>
cmp    %r11,%r9
je     1436 <detrend_lsq+0x336>
mov    %rsi,%rax
not    %rax
test   $0x1,%r10b
jne    13c4 <detrend_lsq+0x2c4>
xorps  %xmm0,%xmm0
cvtsi2sd %esi,%xmm0
mulsd  (%rcx),%xmm0
addsd  (%r8),%xmm0
movsd  (%rdi,%rsi,8),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,(%rdx,%rsi,8)
add    $0x1,%rsi
add    %r10,%rax
je     1436 <detrend_lsq+0x336>
nopl   0x0(%rax)
xorps  %xmm0,%xmm0
cvtsi2sd %esi,%xmm0
mulsd  (%rcx),%xmm0
addsd  (%r8),%xmm0
movsd  (%rdi,%rsi,8),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,(%rdx,%rsi,8)
lea    0x1(%rsi),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  (%rcx),%xmm0
addsd  (%r8),%xmm0
movsd  0x8(%rdi,%rsi,8),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rdx,%rsi,8)
add    $0x2,%rsi
cmp    %r10,%rsi
jne    13d0 <detrend_lsq+0x2d0>
jmp    1436 <detrend_lsq+0x336>
movabs $0x7ff8000000000000,%rax
mov    %rax,(%rcx)
movabs $0xfff8000000000000,%rax
mov    %rax,(%r8)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xorpd  %xmm2,%xmm2
xor    %eax,%eax
test   $0x1,%r10b
jne    123b <detrend_lsq+0x13b>
jmp    125f <detrend_lsq+0x15f>

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

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