#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 */
scalar_t__ fabs(double);
void sd_to_llr(double llr[], double sd[], int n) {
  double sum, mean, sign, sumsq, estvar, estEsN0, x;
  int i;
  sum = 0.0;
  for (i = 0; i < n; i++)
    sum += fabs(sd[i]);
  mean = sum / n;
  for (i = 0; i < n; i++) {
    sd[i] /= mean;
  }
  sum = sumsq = 0.0;
  for (i = 0; i < n; i++) {
    sign = (sd[i] > 0.0) - (sd[i] < 0.0);
    x = (sd[i] - sign);
    sum += x;
    sumsq += x * x;
  }
  mean = sum / n;
  estvar = sumsq / n - mean * mean;
  estEsN0 = 1.0 / (2.0 * estvar + 1E-3);
  for (i = 0; i < n; i++)
    llr[i] = 4.0 * estEsN0 * sd[i];
}


x86 assembly (clang, -O0):
<sd_to_llr>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    116d <sd_to_llr+0x5d>
mov    -0x10(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
call   1030 <fabs@plt>
cvtsi2sd %rax,%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    1132 <sd_to_llr+0x22>
movsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11bc <sd_to_llr+0xac>
movsd  -0x28(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    1187 <sd_to_llr+0x77>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    126f <sd_to_llr+0x15f>
mov    -0x10(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x10(%rbp),%rcx
movslq -0x54(%rbp),%rdx
xorps  %xmm0,%xmm0
ucomisd (%rcx,%rdx,8),%xmm0
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
sub    %ecx,%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x38(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    11d3 <sd_to_llr+0xc3>
movsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x38(%rbp),%xmm1
cvtsi2sdl -0x14(%rbp),%xmm0
divsd  %xmm0,%xmm1
movsd  -0x28(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
addsd  %xmm1,%xmm1
movsd  0xd39(%rip),%xmm0
addsd  %xmm0,%xmm1
movsd  0xd25(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    132c <sd_to_llr+0x21c>
movsd  0xd11(%rip),%xmm0
mulsd  -0x48(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x54(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    12eb <sd_to_llr+0x1db>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sd_to_llr>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
test   %edx,%edx
jle    159e <sd_to_llr+0x48e>
mov    %rsi,%r14
mov    %edx,%eax
lea    -0x1(%rax),%rcx
mov    %eax,%r15d
and    $0x3,%r15d
cmp    $0x3,%rcx
mov    %rdi,0x30(%rsp)
mov    %rax,0x28(%rsp)
mov    %edx,0x1c(%rsp)
mov    %rcx,0x20(%rsp)
jae    115b <sd_to_llr+0x4b>
xorpd  %xmm4,%xmm4
xor    %r12d,%r12d
jmp    11f0 <sd_to_llr+0xe0>
mov    %rax,%r13
and    $0xfffffffc,%r13d
xorpd  %xmm4,%xmm4
xor    %r12d,%r12d
nopl   0x0(%rax)
movapd %xmm4,(%rsp)
movsd  (%r14,%r12,8),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  (%rsp),%xmm0
movsd  %xmm0,(%rsp)
movsd  0x8(%r14,%r12,8),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  (%rsp),%xmm0
movsd  %xmm0,(%rsp)
movsd  0x10(%r14,%r12,8),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  (%rsp),%xmm0
movsd  %xmm0,(%rsp)
movsd  0x18(%r14,%r12,8),%xmm0
call   1030 <fabs@plt>
xorps  %xmm4,%xmm4
cvtsi2sd %rax,%xmm4
addsd  (%rsp),%xmm4
add    $0x4,%r12
cmp    %r12,%r13
jne    1170 <sd_to_llr+0x60>
test   %r15,%r15
je     122a <sd_to_llr+0x11a>
lea    (%r14,%r12,8),%rbp
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
movapd %xmm4,(%rsp)
movsd  0x0(%rbp,%rbx,8),%xmm0
call   1030 <fabs@plt>
movapd (%rsp),%xmm4
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  %xmm0,%xmm4
add    $0x1,%rbx
cmp    %rbx,%r15
jne    1200 <sd_to_llr+0xf0>
mov    0x1c(%rsp),%ebx
test   %ebx,%ebx
mov    0x30(%rsp),%rdi
mov    0x28(%rsp),%rbp
jle    159e <sd_to_llr+0x48e>
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
divsd  %xmm0,%xmm4
cmp    $0x1,%ebx
jne    1257 <sd_to_llr+0x147>
xor    %eax,%eax
jmp    12e0 <sd_to_llr+0x1d0>
mov    %ebp,%eax
and    $0xfffffffe,%eax
movapd %xmm4,%xmm1
unpcklpd %xmm4,%xmm1
lea    -0x2(%rax),%rdx
mov    %rdx,%rcx
shr    %rcx
add    $0x1,%rcx
test   %rdx,%rdx
je     14d9 <sd_to_llr+0x3c9>
mov    %rcx,%rsi
and    $0xfffffffffffffffe,%rsi
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movupd (%r14,%rdx,8),%xmm2
movupd 0x10(%r14,%rdx,8),%xmm3
divpd  %xmm1,%xmm2
movupd %xmm2,(%r14,%rdx,8)
divpd  %xmm1,%xmm3
movupd %xmm3,0x10(%r14,%rdx,8)
add    $0x4,%rdx
add    $0xfffffffffffffffe,%rsi
jne    1290 <sd_to_llr+0x180>
test   $0x1,%cl
je     12d1 <sd_to_llr+0x1c1>
movupd (%r14,%rdx,8),%xmm2
divpd  %xmm1,%xmm2
movupd %xmm2,(%r14,%rdx,8)
cmp    %rbp,%rax
je     12f9 <sd_to_llr+0x1e9>
cs nopw 0x0(%rax,%rax,1)
movsd  (%r14,%rax,8),%xmm1
divsd  %xmm4,%xmm1
movsd  %xmm1,(%r14,%rax,8)
add    $0x1,%rax
cmp    %rax,%rbp
jne    12e0 <sd_to_llr+0x1d0>
test   %ebx,%ebx
jle    159e <sd_to_llr+0x48e>
cmpq   $0x0,0x20(%rsp)
je     14c0 <sd_to_llr+0x3b0>
mov    %ebp,%ecx
and    $0xfffffffe,%ecx
xorpd  %xmm3,%xmm3
xor    %eax,%eax
xorpd  %xmm1,%xmm1
xorpd  %xmm4,%xmm4
movsd  (%r14,%rax,8),%xmm5
xor    %edx,%edx
ucomisd %xmm3,%xmm5
seta   %dl
xor    %esi,%esi
ucomisd %xmm5,%xmm3
seta   %sil
sub    %esi,%edx
xorps  %xmm6,%xmm6
cvtsi2sd %edx,%xmm6
movsd  0x8(%r14,%rax,8),%xmm2
subsd  %xmm6,%xmm5
addsd  %xmm5,%xmm1
xor    %edx,%edx
ucomisd %xmm3,%xmm2
seta   %dl
mulsd  %xmm5,%xmm5
xor    %esi,%esi
ucomisd %xmm2,%xmm3
addsd  %xmm4,%xmm5
seta   %sil
sub    %esi,%edx
xorps  %xmm4,%xmm4
cvtsi2sd %edx,%xmm4
subsd  %xmm4,%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm2
addsd  %xmm5,%xmm2
add    $0x2,%rax
movapd %xmm2,%xmm4
cmp    %rax,%rcx
jne    1320 <sd_to_llr+0x210>
test   $0x1,%bpl
je     13cd <sd_to_llr+0x2bd>
movsd  (%r14,%rax,8),%xmm3
xorpd  %xmm4,%xmm4
xor    %eax,%eax
ucomisd %xmm4,%xmm3
seta   %al
xor    %ecx,%ecx
ucomisd %xmm3,%xmm4
seta   %cl
sub    %ecx,%eax
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
subsd  %xmm4,%xmm3
addsd  %xmm3,%xmm1
mulsd  %xmm3,%xmm3
addsd  %xmm3,%xmm2
test   %ebx,%ebx
jle    159e <sd_to_llr+0x48e>
divsd  %xmm0,%xmm1
divsd  %xmm0,%xmm2
mulsd  %xmm1,%xmm1
subsd  %xmm1,%xmm2
addsd  %xmm2,%xmm2
addsd  0xc0f(%rip),%xmm2
movsd  0xc0f(%rip),%xmm0
divsd  %xmm2,%xmm0
mulsd  0xc0b(%rip),%xmm0
cmp    $0x4,%ebx
jb     1424 <sd_to_llr+0x314>
lea    (%r14,%rbp,8),%rax
cmp    %rdi,%rax
jbe    14e9 <sd_to_llr+0x3d9>
lea    (%rdi,%rbp,8),%rax
cmp    %r14,%rax
jbe    14e9 <sd_to_llr+0x3d9>
xor    %eax,%eax
mov    %rax,%rcx
not    %rcx
add    %rbp,%rcx
mov    %rbp,%rdx
and    $0x3,%rdx
je     1459 <sd_to_llr+0x349>
nopl   0x0(%rax,%rax,1)
movsd  (%r14,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rdi,%rax,8)
add    $0x1,%rax
add    $0xffffffffffffffff,%rdx
jne    1440 <sd_to_llr+0x330>
cmp    $0x3,%rcx
jb     159e <sd_to_llr+0x48e>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%r14,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rdi,%rax,8)
movsd  0x8(%r14,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rdi,%rax,8)
movsd  0x10(%r14,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x10(%rdi,%rax,8)
movsd  0x18(%r14,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x18(%rdi,%rax,8)
add    $0x4,%rax
cmp    %rax,%rbp
jne    1470 <sd_to_llr+0x360>
jmp    159e <sd_to_llr+0x48e>
xorpd  %xmm1,%xmm1
xor    %eax,%eax
xorpd  %xmm2,%xmm2
test   $0x1,%bpl
jne    1398 <sd_to_llr+0x288>
jmp    13cd <sd_to_llr+0x2bd>
xor    %edx,%edx
test   $0x1,%cl
jne    12c1 <sd_to_llr+0x1b1>
jmp    12d1 <sd_to_llr+0x1c1>
mov    %ebp,%eax
and    $0xfffffffc,%eax
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    -0x4(%rax),%rcx
mov    %rcx,%rdx
shr    $0x2,%rdx
add    $0x1,%rdx
test   %rcx,%rcx
je     156e <sd_to_llr+0x45e>
mov    %rdx,%rsi
and    $0xfffffffffffffffe,%rsi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movupd (%r14,%rcx,8),%xmm2
movupd 0x10(%r14,%rcx,8),%xmm3
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm3
movupd %xmm2,(%rdi,%rcx,8)
movupd %xmm3,0x10(%rdi,%rcx,8)
movupd 0x20(%r14,%rcx,8),%xmm2
movupd 0x30(%r14,%rcx,8),%xmm3
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm3
movupd %xmm2,0x20(%rdi,%rcx,8)
movupd %xmm3,0x30(%rdi,%rcx,8)
add    $0x8,%rcx
add    $0xfffffffffffffffe,%rsi
jne    1520 <sd_to_llr+0x410>
jmp    1570 <sd_to_llr+0x460>
xor    %ecx,%ecx
test   $0x1,%dl
je     1595 <sd_to_llr+0x485>
movupd (%r14,%rcx,8),%xmm2
movupd 0x10(%r14,%rcx,8),%xmm3
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm3
movupd %xmm2,(%rdi,%rcx,8)
movupd %xmm3,0x10(%rdi,%rcx,8)
cmp    %rbp,%rax
jne    1426 <sd_to_llr+0x316>
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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