long direct_form_iir_down_kernel(lenx, x, y, k0, idown, zerono, poleno, gain, a,
                                 b, T)
long lenx;
float *x, *y;
long *k0, idown, zerono, poleno;
double gain;
float *a, *b, (*T)[2];
{
  long kx, ky, n;
  double yj;
  ky = 0;
  for (kx = 0; kx < lenx; kx++) {
    T[0][0] = x[kx];
    for (yj = 0, n = 0; n < zerono; n++)
      yj += a[n] * T[n][0];
    for (n = 1; n < poleno; n++)
      yj -= b[n] * T[n - 1][1];
    for (n = zerono - 1; n > 0; n--)
      T[n][0] = T[n - 1][0];
    for (n = poleno - 1; n > 0; n--)
      T[n][1] = T[n - 1][1];
    T[0][1] = yj;
    if (*k0 % idown == 0) {
      y[ky] = yj * gain;
      ky++;
    }
    (*k0)++;
  }
  *k0 %= idown;
  return ky;
}


x86 assembly (clang, -O0):
<direct_form_iir_down_kernel>:
push   %rbp
mov    %rsp,%rbp
mov    0x28(%rbp),%rax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movsd  %xmm0,-0x38(%rbp)
movq   $0x0,-0x48(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x8(%rbp),%rax
jge    1310 <direct_form_iir_down_kernel+0x210>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    0x28(%rbp),%rax
movss  %xmm0,(%rax)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
movq   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%rax
cmp    -0x30(%rbp),%rax
jge    11bb <direct_form_iir_down_kernel+0xbb>
mov    0x18(%rbp),%rax
mov    -0x50(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    0x28(%rbp),%rax
mov    -0x50(%rbp),%rcx
mulss  (%rax,%rcx,8),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x50(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
jmp    1174 <direct_form_iir_down_kernel+0x74>
movq   $0x1,-0x50(%rbp)
mov    -0x50(%rbp),%rax
cmp    0x10(%rbp),%rax
jge    1213 <direct_form_iir_down_kernel+0x113>
mov    0x20(%rbp),%rax
mov    -0x50(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    0x28(%rbp),%rax
mov    -0x50(%rbp),%rcx
sub    $0x1,%rcx
mulss  0x4(%rax,%rcx,8),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  -0x58(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x50(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
jmp    11c3 <direct_form_iir_down_kernel+0xc3>
mov    -0x30(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x50(%rbp)
cmpq   $0x0,-0x50(%rbp)
jle    1259 <direct_form_iir_down_kernel+0x159>
mov    0x28(%rbp),%rax
mov    -0x50(%rbp),%rcx
sub    $0x1,%rcx
movss  (%rax,%rcx,8),%xmm0
mov    0x28(%rbp),%rax
mov    -0x50(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,8)
mov    -0x50(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x50(%rbp)
jmp    121f <direct_form_iir_down_kernel+0x11f>
mov    0x10(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x50(%rbp)
cmpq   $0x0,-0x50(%rbp)
jle    12a1 <direct_form_iir_down_kernel+0x1a1>
mov    0x28(%rbp),%rax
mov    -0x50(%rbp),%rcx
sub    $0x1,%rcx
movss  0x4(%rax,%rcx,8),%xmm0
mov    0x28(%rbp),%rax
mov    -0x50(%rbp),%rcx
movss  %xmm0,0x4(%rax,%rcx,8)
mov    -0x50(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x50(%rbp)
jmp    1265 <direct_form_iir_down_kernel+0x165>
movsd  -0x58(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    0x28(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
cqto
idivq  -0x28(%rbp)
cmp    $0x0,%rdx
jne    12f1 <direct_form_iir_down_kernel+0x1f1>
movsd  -0x58(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    %rcx,(%rax)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1141 <direct_form_iir_down_kernel+0x41>
mov    -0x28(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    (%rax),%rax
cqto
idiv   %rcx
mov    -0x60(%rbp),%rax
mov    %rdx,(%rax)
mov    -0x48(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<direct_form_iir_down_kernel>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdx,-0x28(%rsp)
mov    %rsi,-0x8(%rsp)
mov    %rdi,-0x48(%rsp)
test   %rdi,%rdi
jle    13dd <direct_form_iir_down_kernel+0x2dd>
mov    0x50(%rsp),%rbx
mov    0x48(%rsp),%r12
mov    0x40(%rsp),%r13
mov    0x38(%rsp),%r14
mov    %rcx,-0x38(%rsp)
mov    (%rcx),%r15
lea    -0x1(%r9),%r11
lea    -0x2(%r9),%rax
mov    %rax,-0x30(%rsp)
lea    -0x1(%r14),%rcx
mov    %r11d,%r10d
and    $0x3,%r10d
and    $0xfffffffffffffffc,%r11
mov    %rcx,%rax
mov    %rcx,-0x20(%rsp)
and    $0xfffffffffffffffe,%rcx
neg    %rcx
lea    0x1(%r9),%rax
mov    %rax,-0x10(%rsp)
lea    0x1(%r14),%rax
mov    %rax,-0x18(%rsp)
xor    %edi,%edi
xorpd  %xmm1,%xmm1
mov    %r15,-0x40(%rsp)
xor    %ebp,%ebp
jmp    11a3 <direct_form_iir_down_kernel+0xa3>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r15
add    $0x1,%rbp
cmp    -0x48(%rsp),%rbp
je     13cc <direct_form_iir_down_kernel+0x2cc>
mov    -0x8(%rsp),%rax
movss  (%rax,%rbp,4),%xmm3
movss  %xmm3,(%rbx)
xorpd  %xmm2,%xmm2
test   %r9,%r9
jle    1290 <direct_form_iir_down_kernel+0x190>
mulss  0x0(%r13),%xmm3
xorps  %xmm2,%xmm2
cvtss2sd %xmm3,%xmm2
addsd  %xmm1,%xmm2
cmp    $0x1,%r9
je     1290 <direct_form_iir_down_kernel+0x190>
mov    $0x1,%eax
cmpq   $0x3,-0x30(%rsp)
jb     1254 <direct_form_iir_down_kernel+0x154>
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
movss  0x4(%r13,%rax,4),%xmm3
movss  0x8(%r13,%rax,4),%xmm4
mulss  0x8(%rbx,%rax,8),%xmm3
cvtss2sd %xmm3,%xmm3
addsd  %xmm2,%xmm3
mulss  0x10(%rbx,%rax,8),%xmm4
xorps  %xmm2,%xmm2
cvtss2sd %xmm4,%xmm2
addsd  %xmm3,%xmm2
movss  0xc(%r13,%rax,4),%xmm3
mulss  0x18(%rbx,%rax,8),%xmm3
cvtss2sd %xmm3,%xmm3
addsd  %xmm2,%xmm3
movss  0x10(%r13,%rax,4),%xmm2
mulss  0x20(%rbx,%rax,8),%xmm2
cvtss2sd %xmm2,%xmm2
addsd  %xmm3,%xmm2
add    $0x4,%rax
cmp    %rax,%r11
jne    11f0 <direct_form_iir_down_kernel+0xf0>
add    $0x1,%rax
test   %r10,%r10
je     1290 <direct_form_iir_down_kernel+0x190>
lea    0x0(,%rax,4),%rdx
add    %r13,%rdx
lea    (%rbx,%rax,8),%rax
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
movss  (%rdx,%rsi,4),%xmm3
mulss  (%rax,%rsi,8),%xmm3
cvtss2sd %xmm3,%xmm3
addsd  %xmm3,%xmm2
add    $0x1,%rsi
cmp    %rsi,%r10
jne    1270 <direct_form_iir_down_kernel+0x170>
nopl   0x0(%rax,%rax,1)
cmp    $0x2,%r14
jl     1309 <direct_form_iir_down_kernel+0x209>
mov    $0x1,%eax
je     12ee <direct_form_iir_down_kernel+0x1ee>
mov    $0x1,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movss  (%r12,%rax,4),%xmm3
movss  0x4(%r12,%rax,4),%xmm4
mulss  -0x4(%rbx,%rax,8),%xmm3
cvtss2sd %xmm3,%xmm3
subsd  %xmm3,%xmm2
mulss  0x4(%rbx,%rax,8),%xmm4
xorps  %xmm3,%xmm3
cvtss2sd %xmm4,%xmm3
subsd  %xmm3,%xmm2
lea    (%rcx,%rax,1),%rdx
add    $0x2,%rdx
add    $0x2,%rax
cmp    $0x1,%rdx
jne    12b0 <direct_form_iir_down_kernel+0x1b0>
testb  $0x1,-0x20(%rsp)
je     1309 <direct_form_iir_down_kernel+0x209>
movss  (%r12,%rax,4),%xmm3
mulss  -0x4(%rbx,%rax,8),%xmm3
cvtss2sd %xmm3,%xmm3
subsd  %xmm3,%xmm2
mov    -0x10(%rsp),%rax
cmp    $0x2,%r9
jl     1336 <direct_form_iir_down_kernel+0x236>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movss  -0x18(%rbx,%rax,8),%xmm3
movss  %xmm3,-0x10(%rbx,%rax,8)
add    $0xffffffffffffffff,%rax
cmp    $0x2,%rax
ja     1320 <direct_form_iir_down_kernel+0x220>
mov    -0x18(%rsp),%rax
cmp    $0x2,%r14
jl     1366 <direct_form_iir_down_kernel+0x266>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movss  -0x14(%rbx,%rax,8),%xmm3
movss  %xmm3,-0xc(%rbx,%rax,8)
add    $0xffffffffffffffff,%rax
cmp    $0x2,%rax
ja     1350 <direct_form_iir_down_kernel+0x250>
xorps  %xmm3,%xmm3
cvtsd2ss %xmm2,%xmm3
movss  %xmm3,0x4(%rbx)
mov    %r15,%rax
or     %r8,%rax
shr    $0x20,%rax
je     13a0 <direct_form_iir_down_kernel+0x2a0>
mov    %r15,%rax
cqto
idiv   %r8
test   %rdx,%rdx
jne    1190 <direct_form_iir_down_kernel+0x90>
jmp    13b1 <direct_form_iir_down_kernel+0x2b1>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %r15d,%eax
xor    %edx,%edx
div    %r8d
test   %rdx,%rdx
jne    1190 <direct_form_iir_down_kernel+0x90>
mulsd  %xmm0,%xmm2
cvtsd2ss %xmm2,%xmm2
mov    -0x28(%rsp),%rax
movss  %xmm2,(%rax,%rdi,4)
add    $0x1,%rdi
jmp    1190 <direct_form_iir_down_kernel+0x90>
mov    -0x40(%rsp),%rax
add    -0x48(%rsp),%rax
mov    -0x38(%rsp),%rcx
jmp    13e2 <direct_form_iir_down_kernel+0x2e2>
mov    (%rcx),%rax
xor    %edi,%edi
mov    %rax,%rdx
or     %r8,%rdx
shr    $0x20,%rdx
je     13f5 <direct_form_iir_down_kernel+0x2f5>
cqto
idiv   %r8
jmp    13fa <direct_form_iir_down_kernel+0x2fa>
xor    %edx,%edx
div    %r8d
mov    %rdx,(%rcx)
mov    %rdi,%rax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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