#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ Autocorrelation(int, int, double *, double *);
double LevinsonDurbin(int fOrder, int dataSize, double *data, double *kArray) {
  int order, i;
  double signal;
  double error, kTemp;
  double aArray1[20 + 1];
  double aArray2[20 + 1];
  double rArray[20 + 1];
  double *aPtr = aArray1;
  double *aLastPtr = aArray2;
  double *aTemp;
  Autocorrelation(fOrder, dataSize, data, rArray);
  signal = rArray[0];
  aPtr = aArray1;
  aLastPtr = aArray2;
  if (!signal) {
    kArray[0] = 1.0;
    for (order = 1; order <= fOrder; order++) {
      kArray[order] = 0.0;
    }
    return 0;
  } else {
    kArray[0] = 1.0;
    aPtr[0] = 1.0;
    aLastPtr[0] = 1.0;
    error = rArray[0];
    for (order = 1; order <= fOrder; order++) {
      kTemp = aLastPtr[0] * rArray[order - 0];
      for (i = 1; i < order; i++) {
        kTemp += aLastPtr[i] * rArray[order - i];
      }
      kTemp = -kTemp / error;
      kArray[order] = kTemp;
      aPtr[order] = kTemp;
      for (i = 1; i < order; i++) {
        aPtr[i] = aLastPtr[i] + kTemp * aLastPtr[order - i];
      }
      error = error * (1 - kTemp * kTemp);
      aTemp = aLastPtr;
      aLastPtr = aPtr;
      aPtr = aTemp;
    }
    return signal / error;
  }
}


x86 assembly (clang, -O0):
<LevinsonDurbin>:
push   %rbp
mov    %rsp,%rbp
sub    $0x270,%rsp
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
lea    -0xf0(%rbp),%rax
mov    %rax,-0x258(%rbp)
lea    -0x1a0(%rbp),%rax
mov    %rax,-0x260(%rbp)
mov    -0xc(%rbp),%edi
mov    -0x10(%rbp),%esi
mov    -0x18(%rbp),%rdx
lea    -0x250(%rbp),%rcx
call   1030 <Autocorrelation@plt>
movsd  -0x250(%rbp),%xmm0
ff
movsd  %xmm0,-0x30(%rbp)
lea    -0xf0(%rbp),%rax
mov    %rax,-0x258(%rbp)
lea    -0x1a0(%rbp),%rax
mov    %rax,-0x260(%rbp)
movsd  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11ea <LevinsonDurbin+0xda>
jp     11ea <LevinsonDurbin+0xda>
mov    -0x20(%rbp),%rax
movsd  0xe58(%rip),%xmm0
movsd  %xmm0,(%rax)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     11dd <LevinsonDurbin+0xcd>
mov    -0x20(%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    11b3 <LevinsonDurbin+0xa3>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13eb <LevinsonDurbin+0x2db>
mov    -0x20(%rbp),%rax
movsd  0xe0a(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x258(%rbp),%rax
movsd  0xdf7(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x260(%rbp),%rax
movsd  0xde4(%rip),%xmm0
movsd  %xmm0,(%rax)
movsd  -0x250(%rbp),%xmm0
ff
movsd  %xmm0,-0x38(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     13dc <LevinsonDurbin+0x2cc>
mov    -0x260(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x24(%rbp),%eax
sub    $0x0,%eax
cltq
mulsd  -0x250(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x40(%rbp)
movl   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    12b5 <LevinsonDurbin+0x1a5>
mov    -0x260(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x24(%rbp),%eax
sub    -0x28(%rbp),%eax
cltq
movsd  -0x250(%rbp,%rax,8),%xmm2
ff ff
movsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1268 <LevinsonDurbin+0x158>
movsd  -0x40(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
divsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x40(%rbp),%xmm0
mov    -0x258(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1365 <LevinsonDurbin+0x255>
mov    -0x260(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x40(%rbp),%xmm0
mov    -0x260(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    -0x28(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x258(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1309 <LevinsonDurbin+0x1f9>
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm2
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
movsd  0xc69(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x260(%rbp),%rax
mov    %rax,-0x268(%rbp)
mov    -0x258(%rbp),%rax
mov    %rax,-0x260(%rbp)
mov    -0x268(%rbp),%rax
mov    %rax,-0x258(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1234 <LevinsonDurbin+0x124>
movsd  -0x30(%rbp),%xmm0
divsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x270,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<LevinsonDurbin>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x210,%rsp
mov    %rcx,%r14
mov    %edi,%r15d
mov    %rsp,%rbx
mov    %rbx,%rcx
call   1030 <Autocorrelation@plt>
movsd  (%rsp),%xmm8
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm8
movabs $0x3ff0000000000000,%rax
mov    %rax,(%r14)
jne    1165 <LevinsonDurbin+0x45>
jnp    13ea <LevinsonDurbin+0x2ca>
mov    %rax,0x160(%rsp)
mov    %rax,0xb0(%rsp)
movapd %xmm8,%xmm2
test   %r15d,%r15d
jle    13de <LevinsonDurbin+0x2be>
lea    0xb0(%rsp),%rcx
lea    0x160(%rsp),%r11
add    $0x1,%r15d
lea    0x8(%rsp),%r9
mov    $0x1,%r12d
movsd  0xe56(%rip),%xmm1
mov    $0xffffffffffffffff,%r8
xor    %r10d,%r10d
movapd 0xe53(%rip),%xmm9
movapd %xmm1,%xmm4
movapd %xmm8,%xmm2
cs nopw 0x0(%rax,%rax,1)
mov    %rcx,%r13
mulsd  (%rsp,%r12,8),%xmm4
cmp    $0x2,%r12
jb     1390 <LevinsonDurbin+0x270>
mov    %r10,%rdi
and    $0xfffffffffffffffc,%rdi
lea    -0x1(%r10),%rax
mov    $0x1,%ecx
cmp    $0x3,%rax
jb     1263 <LevinsonDurbin+0x143>
lea    0x20(%r13),%rsi
mov    $0xffffffffffffffff,%rcx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  -0x18(%rsi),%xmm5
movsd  -0x10(%rsi),%xmm6
mulsd  0x8(%rbx,%rcx,8),%xmm5
addsd  %xmm4,%xmm5
mulsd  (%rbx,%rcx,8),%xmm6
addsd  %xmm5,%xmm6
movsd  -0x8(%rsi),%xmm5
mulsd  -0x8(%rbx,%rcx,8),%xmm5
addsd  %xmm6,%xmm5
movsd  (%rsi),%xmm4
mulsd  -0x10(%rbx,%rcx,8),%xmm4
addsd  %xmm5,%xmm4
add    $0x20,%rsi
lea    (%rdi,%rcx,1),%rax
add    $0xfffffffffffffffc,%rax
add    $0xfffffffffffffffc,%rcx
cmp    $0xffffffffffffffff,%rax
jne    1210 <LevinsonDurbin+0xf0>
neg    %rcx
test   $0x3,%r10b
je     12aa <LevinsonDurbin+0x18a>
mov    %r10d,%esi
and    $0x3,%esi
lea    0x0(,%rcx,8),%rax
mov    %r9,%rdx
sub    %rax,%rdx
lea    0x0(,%rcx,8),%rcx
add    %r13,%rcx
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movsd  (%rcx,%rax,8),%xmm5
mulsd  (%rdx),%xmm5
addsd  %xmm5,%xmm4
add    $0x1,%rax
add    $0xfffffffffffffff8,%rdx
cmp    %rax,%rsi
jne    1290 <LevinsonDurbin+0x170>
xorpd  %xmm9,%xmm4
divsd  %xmm2,%xmm4
movsd  %xmm4,(%r14,%r12,8)
movsd  %xmm4,(%r11,%r12,8)
cmp    $0x2,%r12
jb     13a5 <LevinsonDurbin+0x285>
mov    $0x1,%ecx
cmp    $0x4,%r10
jb     1341 <LevinsonDurbin+0x221>
lea    0x1(%rdi),%rcx
movapd %xmm4,%xmm5
unpcklpd %xmm4,%xmm5
lea    0x0(,%r8,8),%rsi
add    %r13,%rsi
xor    %edx,%edx
nopl   (%rax)
movupd 0x8(%r13,%rdx,8),%xmm6
movupd 0x18(%r13,%rdx,8),%xmm7
movupd -0x10(%rsi),%xmm0
movupd (%rsi),%xmm3
shufpd $0x1,%xmm3,%xmm3
shufpd $0x1,%xmm0,%xmm0
mulpd  %xmm5,%xmm3
addpd  %xmm6,%xmm3
mulpd  %xmm5,%xmm0
addpd  %xmm7,%xmm0
movupd %xmm3,0x8(%r11,%rdx,8)
movupd %xmm0,0x18(%r11,%rdx,8)
add    $0x4,%rdx
add    $0xffffffffffffffe0,%rsi
cmp    %rdx,%rdi
jne    12f0 <LevinsonDurbin+0x1d0>
cmp    %rdi,%r10
je     13a5 <LevinsonDurbin+0x285>
mov    %r12,%rax
sub    %rcx,%rax
lea    0x0(,%rax,8),%rax
add    %r13,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  (%rax),%xmm0
mulsd  %xmm4,%xmm0
addsd  0x0(%r13,%rcx,8),%xmm0
movsd  %xmm0,(%r11,%rcx,8)
add    $0x1,%rcx
add    $0xfffffffffffffff8,%rax
cmp    %rcx,%r12
jne    1360 <LevinsonDurbin+0x240>
jmp    13a5 <LevinsonDurbin+0x285>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
xorpd  %xmm9,%xmm4
divsd  %xmm2,%xmm4
movsd  %xmm4,(%r14,%r12,8)
movsd  %xmm4,(%r11,%r12,8)
mulsd  %xmm4,%xmm4
movapd %xmm1,%xmm0
subsd  %xmm4,%xmm0
mulsd  %xmm0,%xmm2
add    $0x1,%r12
cmp    %r15,%r12
je     13de <LevinsonDurbin+0x2be>
movsd  (%r11),%xmm4
add    $0x1,%r10
add    $0x8,%rbx
add    $0x8,%r9
add    $0x1,%r8
mov    %r11,%rcx
mov    %r13,%r11
jmp    11d0 <LevinsonDurbin+0xb0>
divsd  %xmm2,%xmm8
movapd %xmm8,%xmm0
jmp    1408 <LevinsonDurbin+0x2e8>
test   %r15d,%r15d
jle    1408 <LevinsonDurbin+0x2e8>
add    $0x8,%r14
mov    %r15d,%edx
shl    $0x3,%rdx
mov    %r14,%rdi
xor    %esi,%esi
call   1040 <memset@plt>
xorpd  %xmm0,%xmm0
add    $0x210,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define double @LevinsonDurbin(i32 %0, i32 %1, double* %2, double* %3) {
%5 = alloca double
%6 = alloca i32
%7 = alloca i32
%8 = alloca double*
%9 = alloca double*
%10 = alloca i32
%11 = alloca i32
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca [21 x double]
%16 = alloca [21 x double]
%17 = alloca [21 x double]
%18 = alloca double*
%19 = alloca double*
%20 = alloca double*
store i32 %0, i32* %6
store i32 %1, i32* %7
store double* %2, double** %8
store double* %3, double** %9
%21 = getelementptr inbounds [21 x double], [21 x double]* %15, i64 0, i64 0
store double* %21, double** %18
%22 = getelementptr inbounds [21 x double], [21 x double]* %16, i64 0, i64 0
store double* %22, double** %19
%23 = load i32, i32* %6
%24 = load i32, i32* %7
%25 = load double*, double** %8
%26 = getelementptr inbounds [21 x double], [21 x double]* %17, i64 0, i64 0
%27 = call i32 @Autocorrelation(i32 %23, i32 %24, double* %25, double* %26)
%28 = getelementptr inbounds [21 x double], [21 x double]* %17, i64 0, i64 0
%29 = load double, double* %28
store double %29, double* %12
%30 = getelementptr inbounds [21 x double], [21 x double]* %15, i64 0, i64 0
store double* %30, double** %18
%31 = getelementptr inbounds [21 x double], [21 x double]* %16, i64 0, i64 0
store double* %31, double** %19
%32 = load double, double* %12
%33 = fcmp une double %32, 0.000000e+00
br i1 %33, label %50, label %34
34: ; preds = %4
%35 = load double*, double** %9
%36 = getelementptr inbounds double, double* %35, i64 0
store double 1.000000e+00, double* %36
store i32 1, i32* %10
br label %37
37: ; preds = %46, %34
%38 = load i32, i32* %10
%39 = load i32, i32* %6
%40 = icmp sle i32 %38, %39
br i1 %40, label %41, label %49
41: ; preds = %37
%42 = load double*, double** %9
%43 = load i32, i32* %10
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds double, double* %42, i64 %44
store double 0.000000e+00, double* %45
br label %46
46: ; preds = %41
%47 = load i32, i32* %10
%48 = add nsw i32 %47, 1
store i32 %48, i32* %10
br label %37
49: ; preds = %37
store double 0.000000e+00, double* %5
br label %152
50: ; preds = %4
%51 = load double*, double** %9
%52 = getelementptr inbounds double, double* %51, i64 0
store double 1.000000e+00, double* %52
%53 = load double*, double** %18
%54 = getelementptr inbounds double, double* %53, i64 0
store double 1.000000e+00, double* %54
%55 = load double*, double** %19
%56 = getelementptr inbounds double, double* %55, i64 0
store double 1.000000e+00, double* %56
%57 = getelementptr inbounds [21 x double], [21 x double]* %17, i64 0, i64 0
%58 = load double, double* %57
store double %58, double* %13
store i32 1, i32* %10
br label %59
59: ; preds = %145, %50
%60 = load i32, i32* %10
%61 = load i32, i32* %6
%62 = icmp sle i32 %60, %61
br i1 %62, label %63, label %148
63: ; preds = %59
%64 = load double*, double** %19
%65 = getelementptr inbounds double, double* %64, i64 0
%66 = load double, double* %65
%67 = load i32, i32* %10
%68 = sub nsw i32 %67, 0
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds [21 x double], [21 x double]* %17, i64 0, i64 %69
%71 = load double, double* %70
%72 = fmul double %66, %71
store double %72, double* %14
store i32 1, i32* %11
br label %73
73: ; preds = %91, %63
%74 = load i32, i32* %11
%75 = load i32, i32* %10
%76 = icmp slt i32 %74, %75
br i1 %76, label %77, label %94
77: ; preds = %73
%78 = load double*, double** %19
%79 = load i32, i32* %11
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds double, double* %78, i64 %80
%82 = load double, double* %81
%83 = load i32, i32* %10
%84 = load i32, i32* %11
%85 = sub nsw i32 %83, %84
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds [21 x double], [21 x double]* %17, i64 0, i64 %86
%88 = load double, double* %87
%89 = load double, double* %14
%90 = call double @llvm.fmuladd.f64(double %82, double %88, double %89)
store double %90, double* %14
br label %91
91: ; preds = %77
%92 = load i32, i32* %11
%93 = add nsw i32 %92, 1
store i32 %93, i32* %11
br label %73
94: ; preds = %73
%95 = load double, double* %14
%96 = fneg double %95
%97 = load double, double* %13
%98 = fdiv double %96, %97
store double %98, double* %14
%99 = load double, double* %14
%100 = load double*, double** %9
%101 = load i32, i32* %10
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds double, double* %100, i64 %102
store double %99, double* %103
%104 = load double, double* %14
%105 = load double*, double** %18
%106 = load i32, i32* %10
%107 = sext i32 %106 to i64
%108 = getelementptr inbounds double, double* %105, i64 %107
store double %104, double* %108
store i32 1, i32* %11
br label %109
109: ; preds = %132, %94
%110 = load i32, i32* %11
%111 = load i32, i32* %10
%112 = icmp slt i32 %110, %111
br i1 %112, label %113, label %135
113: ; preds = %109
%114 = load double*, double** %19
%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 = load double, double* %14
%120 = load double*, double** %19
%121 = load i32, i32* %10
%122 = load i32, i32* %11
%123 = sub nsw i32 %121, %122
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds double, double* %120, i64 %124
%126 = load double, double* %125
%127 = call double @llvm.fmuladd.f64(double %119, double %126, double %118)
%128 = load double*, double** %18
%129 = load i32, i32* %11
%130 = sext i32 %129 to i64
%131 = getelementptr inbounds double, double* %128, i64 %130
store double %127, double* %131
br label %132
132: ; preds = %113
%133 = load i32, i32* %11
%134 = add nsw i32 %133, 1
store i32 %134, i32* %11
br label %109
135: ; preds = %109
%136 = load double, double* %13
%137 = load double, double* %14
%138 = load double, double* %14
%139 = fneg double %137
%140 = call double @llvm.fmuladd.f64(double %139, double %138, double 1.000000e+00)
%141 = fmul double %136, %140
store double %141, double* %13
%142 = load double*, double** %19
store double* %142, double** %20
%143 = load double*, double** %18
store double* %143, double** %19
%144 = load double*, double** %20
store double* %144, double** %18
br label %145
145: ; preds = %135
%146 = load i32, i32* %10
%147 = add nsw i32 %146, 1
store i32 %147, i32* %10
br label %59
148: ; preds = %59
%149 = load double, double* %12
%150 = load double, double* %13
%151 = fdiv double %149, %150
store double %151, double* %5
br label %152
152: ; preds = %148, %49
%153 = load double, double* %5
ret double %153
}

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