void best_floating_line(short *values, int num_values, double *initial_y,
                        double *final_y, short *max_error) {
  double left_sum = 0.0, right_sum = 0.0, center_x = (num_values - 1) / 2.0,
         center_y, m;
  int i;
  for (i = 0; i < num_values >> 1; ++i) {
    right_sum += values[num_values - i - 1];
    left_sum += values[i];
  }
  if (num_values & 1) {
    right_sum += values[num_values >> 1] * 0.5;
    left_sum += values[num_values >> 1] * 0.5;
  }
  center_y = (right_sum + left_sum) / num_values;
  m = (right_sum - left_sum) / ((double)num_values * num_values) * 4.0;
  if (initial_y)
    *initial_y = center_y - m * center_x;
  if (final_y)
    *final_y = center_y + m * center_x;
  if (max_error) {
    double max = 0.0;
    for (i = 0; i < num_values; ++i)
      if (fabs(values[i] - (center_y + (i - center_x) * m)) > max)
        max = fabs(values[i] - (center_y + (i - center_x) * m));
    *max_error = (short)floor(max + 0.5);
  }
}


x86 assembly (clang, -O0):
<best_floating_line>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
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,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm0
movsd  0xeb3(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
mov    -0xc(%rbp),%ecx
sar    $0x1,%ecx
cmp    %ecx,%eax
jge    11b8 <best_floating_line+0xa8>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    -0x54(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x54(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    115d <best_floating_line+0x4d>
mov    -0xc(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1225 <best_floating_line+0x115>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
sar    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  0xe1f(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
sar    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  -0x30(%rbp),%xmm1
movsd  0xdf0(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x38(%rbp),%xmm0
subsd  -0x30(%rbp),%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
cvtsi2sdl -0xc(%rbp),%xmm2
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  0xdaf(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     12ab <best_floating_line+0x19b>
movsd  -0x48(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
cmpq   $0x0,-0x20(%rbp)
je     12d5 <best_floating_line+0x1c5>
movsd  -0x48(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
cmpq   $0x0,-0x28(%rbp)
je     13b8 <best_floating_line+0x2a8>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1394 <best_floating_line+0x284>
mov    -0x8(%rbp),%rax
movslq -0x54(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  -0x48(%rbp),%xmm2
cvtsi2sdl -0x54(%rbp),%xmm1
subsd  -0x40(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movaps 0xcee(%rip),%xmm1
pand   %xmm1,%xmm0
ucomisd -0x60(%rbp),%xmm0
jbe    1381 <best_floating_line+0x271>
mov    -0x8(%rbp),%rax
movslq -0x54(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  -0x48(%rbp),%xmm2
cvtsi2sdl -0x54(%rbp),%xmm1
subsd  -0x40(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movaps 0xca8(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    1386 <best_floating_line+0x276>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    12ef <best_floating_line+0x1df>
movsd  -0x60(%rbp),%xmm0
movsd  0xc67(%rip),%xmm1
addsd  %xmm1,%xmm0
call   1030 <floor@plt>
cvttsd2si %xmm0,%eax
mov    %ax,%cx
mov    -0x28(%rbp),%rax
mov    %cx,(%rax)
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<best_floating_line>:
push   %rbp
push   %r14
push   %rbx
mov    %r8,%r14
lea    -0x1(%rsi),%r8d
mov    %esi,%r10d
sar    %r10d
xorpd  %xmm1,%xmm1
cmp    $0x2,%esi
jl     11da <best_floating_line+0xca>
cmp    $0x2,%r10d
mov    $0x1,%r9d
cmovge %r10d,%r9d
cmp    $0x4,%esi
jge    1149 <best_floating_line+0x39>
xorpd  %xmm1,%xmm1
xor    %ebx,%ebx
jmp    11af <best_floating_line+0x9f>
mov    %r9d,%r11d
and    $0x7ffffffe,%r11d
lea    -0x2(%rsi),%eax
xorpd  %xmm1,%xmm1
xor    %ebx,%ebx
nopl   0x0(%rax)
lea    0x1(%rax),%ebp
movslq %ebp,%rbp
pxor   %xmm0,%xmm0
pinsrw $0x1,(%rdi,%rbp,2),%xmm0
pinsrw $0x3,(%rdi,%rbx,2),%xmm0
psrad  $0x10,%xmm0
cvtdq2pd %xmm0,%xmm0
cltq
pxor   %xmm2,%xmm2
pinsrw $0x1,(%rdi,%rax,2),%xmm2
pinsrw $0x3,0x2(%rdi,%rbx,2),%xmm2
addpd  %xmm1,%xmm0
psrad  $0x10,%xmm2
cvtdq2pd %xmm2,%xmm1
addpd  %xmm0,%xmm1
add    $0x2,%rbx
add    $0xfffffffe,%eax
cmp    %rbx,%r11
jne    1160 <best_floating_line+0x50>
test   $0x1,%r9b
je     11da <best_floating_line+0xca>
mov    %ebx,%eax
not    %eax
add    %esi,%eax
cltq
xorpd  %xmm0,%xmm0
pinsrw $0x1,(%rdi,%rax,2),%xmm0
pinsrw $0x3,(%rdi,%rbx,2),%xmm0
psrad  $0x10,%xmm0
cvtdq2pd %xmm0,%xmm0
addpd  %xmm0,%xmm1
xorps  %xmm2,%xmm2
cvtsi2sd %r8d,%xmm2
test   $0x1,%sil
je     1206 <best_floating_line+0xf6>
movslq %r10d,%rax
movswl (%rdi,%rax,2),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xe02(%rip),%xmm0
unpcklpd %xmm0,%xmm0
addpd  %xmm0,%xmm1
mulsd  0xdf2(%rip),%xmm2
movapd %xmm1,%xmm0
unpckhpd %xmm1,%xmm0
movapd %xmm1,%xmm3
cvtsi2sd %esi,%xmm4
addsd  %xmm0,%xmm3
divsd  %xmm4,%xmm3
subsd  %xmm0,%xmm1
mulsd  %xmm4,%xmm4
divsd  %xmm4,%xmm1
mulsd  0xdce(%rip),%xmm1
test   %rdx,%rdx
je     1253 <best_floating_line+0x143>
movapd %xmm1,%xmm0
mulsd  %xmm2,%xmm0
movapd %xmm3,%xmm4
subsd  %xmm0,%xmm4
movsd  %xmm4,(%rdx)
test   %rcx,%rcx
je     1268 <best_floating_line+0x158>
movapd %xmm1,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm3,%xmm0
movsd  %xmm0,(%rcx)
test   %r14,%r14
je     135c <best_floating_line+0x24c>
test   %esi,%esi
jle    1287 <best_floating_line+0x177>
mov    %esi,%eax
cmp    $0x1,%esi
jne    1294 <best_floating_line+0x184>
xorpd  %xmm0,%xmm0
xor    %ecx,%ecx
jmp    1311 <best_floating_line+0x201>
movsd  0xd71(%rip),%xmm0
jmp    134f <best_floating_line+0x23f>
mov    %eax,%edx
and    $0xfffffffe,%edx
xorpd  %xmm0,%xmm0
xor    %ecx,%ecx
movapd 0xd69(%rip),%xmm4
nopw   0x0(%rax,%rax,1)
movswl (%rdi,%rcx,2),%esi
xorps  %xmm5,%xmm5
cvtsi2sd %esi,%xmm5
xorps  %xmm6,%xmm6
cvtsi2sd %ecx,%xmm6
subsd  %xmm2,%xmm6
mulsd  %xmm1,%xmm6
addsd  %xmm3,%xmm6
subsd  %xmm6,%xmm5
andpd  %xmm4,%xmm5
maxsd  %xmm0,%xmm5
movswl 0x2(%rdi,%rcx,2),%esi
xorps  %xmm0,%xmm0
cvtsi2sd %esi,%xmm0
lea    0x1(%rcx),%esi
xorps  %xmm6,%xmm6
cvtsi2sd %esi,%xmm6
subsd  %xmm2,%xmm6
mulsd  %xmm1,%xmm6
addsd  %xmm3,%xmm6
subsd  %xmm6,%xmm0
andpd  %xmm4,%xmm0
maxsd  %xmm5,%xmm0
add    $0x2,%rcx
cmp    %rdx,%rcx
jne    12b0 <best_floating_line+0x1a0>
test   $0x1,%al
je     1347 <best_floating_line+0x237>
movswl (%rdi,%rcx,2),%eax
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
xorps  %xmm5,%xmm5
cvtsi2sd %ecx,%xmm5
subsd  %xmm2,%xmm5
mulsd  %xmm1,%xmm5
addsd  %xmm3,%xmm5
subsd  %xmm5,%xmm4
andpd  0xcd1(%rip),%xmm4
maxsd  %xmm0,%xmm4
movapd %xmm4,%xmm0
addsd  0xcb1(%rip),%xmm0
call   1030 <floor@plt>
cvttsd2si %xmm0,%eax
mov    %ax,(%r14)
pop    %rbx
pop    %r14
pop    %rbp
ret

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

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