bpconv(double *x_out, int lx, double *g0, double *g1, int lh, double *x_inl,
       double *x_inh) {
  int i, j;
  double x0;
  for (i = lh - 2; i > -1; i--) {
    x_inl[i] = x_inl[lx + i];
    x_inh[i] = x_inh[lx + i];
  }
  for (i = 0; i < lx; i++) {
    x0 = 0;
    for (j = 0; j < lh; j++)
      x0 = x0 + x_inl[j + i] * g0[lh - 1 - j] + x_inh[j + i] * g1[lh - 1 - j];
    x_out[i] = x0;
  }
}


x86 assembly (clang, -O0):
<bpconv>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8d,-0x2c(%rbp)
mov    %r9,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0xffffffff,-0x3c(%rbp)
jle    117e <bpconv+0x7e>
mov    -0x38(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x38(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x3c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x3c(%rbp)
jmp    1128 <bpconv+0x28>
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1242 <bpconv+0x142>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1222 <bpconv+0x122>
movsd  -0x48(%rbp),%xmm0
mov    -0x38(%rbp),%rax
mov    -0x40(%rbp),%ecx
add    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x40(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    0x10(%rbp),%rax
mov    -0x40(%rbp),%ecx
add    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x40(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    11a0 <bpconv+0xa0>
movsd  -0x48(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1185 <bpconv+0x85>
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<bpconv>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %r9,-0x30(%rsp)
mov    0x38(%rsp),%r11
cmp    $0x2,%r8d
jl     13c9 <bpconv+0x2c9>
mov    %r8d,%r13d
movslq %esi,%r9
add    $0xfffffffe,%r13d
je     1335 <bpconv+0x235>
mov    -0x30(%rsp),%rbp
lea    0x0(,%r13,8),%rax
add    %rbp,%rax
cmp    %rbp,%rax
jb     1335 <bpconv+0x235>
lea    (%r11,%r13,8),%rax
cmp    %r11,%rax
jb     1335 <bpconv+0x235>
lea    (%r9,%r13,1),%rax
mov    -0x30(%rsp),%rbp
lea    0x0(,%rax,8),%rbx
add    %rbp,%rbx
lea    0x0(%rbp,%r9,8),%rbp
cmp    %rbx,%rbp
ja     1335 <bpconv+0x235>
lea    (%r11,%rax,8),%rbx
lea    (%r11,%r9,8),%r10
cmp    %rbx,%r10
ja     1335 <bpconv+0x235>
mov    %r9,-0x10(%rsp)
mov    %esi,-0x24(%rsp)
lea    (%r11,%r13,8),%r9
add    $0x8,%r9
mov    -0x30(%rsp),%rsi
cmp    %rsi,%r9
seta   -0x18(%rsp)
lea    (%rsi,%r13,8),%r15
add    $0x8,%r15
cmp    %r11,%r15
seta   -0x20(%rsp)
lea    (%rsi,%rax,8),%r14
add    $0x8,%r14
cmp    %rsi,%r14
seta   -0x31(%rsp)
mov    0x38(%rsp),%rbx
mov    %rax,-0x8(%rsp)
lea    (%rbx,%rax,8),%r12
add    $0x8,%r12
cmp    %r15,%rbp
setb   -0x32(%rsp)
cmp    %rsi,%r12
seta   %bl
cmp    %r15,%r10
setb   %r15b
cmp    0x38(%rsp),%r14
seta   %r14b
cmp    %r9,%rbp
setb   %sil
cmp    0x38(%rsp),%r12
mov    0x38(%rsp),%r11
seta   %bpl
cmp    %r9,%r10
setb   %r10b
mov    -0x20(%rsp),%al
test   %al,-0x18(%rsp)
jne    14ed <bpconv+0x3ed>
mov    %esi,%r12d
mov    -0x32(%rsp),%al
and    %al,-0x31(%rsp)
mov    -0x24(%rsp),%esi
mov    -0x10(%rsp),%r9
jne    1335 <bpconv+0x235>
and    %r15b,%bl
jne    1335 <bpconv+0x235>
and    %r12b,%r14b
jne    1335 <bpconv+0x235>
and    %r10b,%bpl
jne    1335 <bpconv+0x235>
lea    0x1(%r13),%rbp
mov    %rbp,%r10
and    $0xfffffffffffffffe,%r10
lea    -0x2(%r10),%rbx
mov    %rbx,%rax
shr    %rax
add    $0x1,%rax
test   %rbx,%rbx
je     14de <bpconv+0x3de>
mov    %rbp,-0x18(%rsp)
mov    %rax,-0x20(%rsp)
mov    %rax,%rbp
and    $0xfffffffffffffffe,%rbp
lea    (%r11,%r13,8),%rax
add    $0xfffffffffffffff8,%rax
mov    -0x30(%rsp),%r9
lea    -0x8(%r9,%r13,8),%r14
mov    -0x8(%rsp),%rbx
lea    (%r11,%rbx,8),%r15
add    $0xfffffffffffffff8,%r15
lea    (%r9,%rbx,8),%r12
add    $0xfffffffffffffff8,%r12
xor    %ebx,%ebx
movups (%r12,%rbx,8),%xmm0
movups %xmm0,(%r14,%rbx,8)
movups (%r15,%rbx,8),%xmm0
movups %xmm0,(%rax,%rbx,8)
movups -0x10(%r12,%rbx,8),%xmm0
movups %xmm0,-0x10(%r14,%rbx,8)
movupd -0x10(%r15,%rbx,8),%xmm0
movupd %xmm0,-0x10(%rax,%rbx,8)
add    $0xfffffffffffffffc,%rbx
add    $0xfffffffffffffffe,%rbp
jne    12b0 <bpconv+0x1b0>
neg    %rbx
mov    0x38(%rsp),%r11
mov    -0x10(%rsp),%r9
mov    -0x18(%rsp),%rbp
mov    -0x20(%rsp),%rax
test   $0x1,%al
je     1329 <bpconv+0x229>
mov    %r13,%rax
sub    %rbx,%rax
lea    (%rax,%r9,1),%r14
mov    -0x30(%rsp),%rbx
movups -0x8(%rbx,%r14,8),%xmm0
movups %xmm0,-0x8(%rbx,%rax,8)
movupd -0x8(%r11,%r14,8),%xmm0
movupd %xmm0,-0x8(%r11,%rax,8)
cmp    %r10,%rbp
je     13c9 <bpconv+0x2c9>
sub    %r10,%r13
mov    %r13,%r14
test   $0x1,%r13b
jne    1364 <bpconv+0x264>
lea    (%r9,%r13,1),%rax
mov    -0x30(%rsp),%rbp
movsd  0x0(%rbp,%rax,8),%xmm0
movsd  %xmm0,0x0(%rbp,%r13,8)
movsd  (%r11,%rax,8),%xmm0
movsd  %xmm0,(%r11,%r13,8)
lea    -0x1(%r13),%r14
test   %r13,%r13
je     13c9 <bpconv+0x2c9>
add    %r14,%r9
mov    -0x30(%rsp),%rax
lea    (%rax,%r9,8),%r15
lea    (%r11,%r9,8),%r10
lea    (%r11,%r14,8),%rbx
lea    (%rax,%r14,8),%rax
not    %r14
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
movsd  (%r15,%rbp,8),%xmm0
movsd  %xmm0,(%rax,%rbp,8)
movsd  (%r10,%rbp,8),%xmm0
movsd  %xmm0,(%rbx,%rbp,8)
movsd  -0x8(%r15,%rbp,8),%xmm0
movsd  %xmm0,-0x8(%rax,%rbp,8)
movsd  -0x8(%r10,%rbp,8),%xmm0
movsd  %xmm0,-0x8(%rbx,%rbp,8)
add    $0xfffffffffffffffe,%rbp
cmp    %rbp,%r14
jne    1390 <bpconv+0x290>
test   %esi,%esi
jle    14d3 <bpconv+0x3d3>
mov    %esi,%r14d
mov    %r8d,%r10d
mov    %r10d,%r13d
and    $0xfffffffe,%r13d
mov    0x38(%rsp),%rax
lea    0x8(%rax),%r15
mov    -0x30(%rsp),%rax
add    $0x8,%rax
lea    -0x2(%r8),%r9d
xor    %r12d,%r12d
jmp    141b <bpconv+0x31b>
nopl   0x0(%rax)
movsd  %xmm0,(%rdi,%r12,8)
add    $0x1,%r12
add    $0x8,%r15
add    $0x8,%rax
cmp    %r14,%r12
je     14d3 <bpconv+0x3d3>
xorpd  %xmm0,%xmm0
test   %r8d,%r8d
jle    1400 <bpconv+0x300>
cmp    $0x1,%r8d
jne    1430 <bpconv+0x330>
xor    %ebp,%ebp
jmp    1492 <bpconv+0x392>
xchg   %ax,%ax
mov    %r9d,%esi
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nop
lea    0x1(%rsi),%r11d
movslq %r11d,%rbx
movsd  -0x8(%rax,%rbp,8),%xmm1
movsd  (%rax,%rbp,8),%xmm2
mulsd  (%rdx,%rbx,8),%xmm1
addsd  %xmm0,%xmm1
movsd  -0x8(%r15,%rbp,8),%xmm3
mulsd  (%rcx,%rbx,8),%xmm3
movsd  (%r15,%rbp,8),%xmm0
movslq %esi,%rsi
mulsd  (%rdx,%rsi,8),%xmm2
addsd  %xmm1,%xmm3
addsd  %xmm3,%xmm2
mulsd  (%rcx,%rsi,8),%xmm0
addsd  %xmm2,%xmm0
add    $0x2,%rbp
add    $0xfffffffe,%esi
cmp    %rbp,%r13
jne    1440 <bpconv+0x340>
test   $0x1,%r10b
je     1400 <bpconv+0x300>
lea    (%r12,%rbp,1),%rsi
mov    -0x30(%rsp),%rbx
movsd  (%rbx,%rsi,8),%xmm1
not    %ebp
add    %r8d,%ebp
movslq %ebp,%rbp
mulsd  (%rdx,%rbp,8),%xmm1
addsd  %xmm0,%xmm1
mov    0x38(%rsp),%rbx
movsd  (%rbx,%rsi,8),%xmm0
mulsd  (%rcx,%rbp,8),%xmm0
addsd  %xmm1,%xmm0
jmp    1400 <bpconv+0x300>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ebx,%ebx
test   $0x1,%al
jne    1301 <bpconv+0x201>
jmp    1329 <bpconv+0x229>
mov    -0x24(%rsp),%esi
mov    -0x10(%rsp),%r9
jmp    1335 <bpconv+0x235>

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

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