int main() {
  static float coefficients[3 * 3];
  static float array[(5 + 2) * (5 + 2)] = {0};
  static float output[5 * 5] = {0};
  static float check_output[5 * 5] = {4, 6, 6, 6, 4, 6, 9, 9, 9, 6, 6, 9, 9,
                                      9, 6, 6, 9, 9, 9, 6, 4, 6, 6, 6, 4};
  register float *parray = &array[0], *parray2, *parray3;
  register float *pcoeff = &coefficients[0];
  register float *poutput = &output[0];
  int k, f, i, n;
  parray += (5 + 2);
  parray += 1;
  for (i = 0; i < 5; i++) {
    for (f = 0; f < 5; f++)
      *parray++ = 1;
    parray += 2;
  }
  for (i = 0; i < 3 * 3; i++)
    *pcoeff++ = 1;
  parray = &array[0];
  pcoeff = &coefficients[0];
  poutput = &output[0];
  initialise_board();
  start_trigger();
  for (n = 0; n < 4096 >> 5; ++n) {
    parray = &array[0];
    pcoeff = &coefficients[0];
    poutput = &output[0];
    for (k = 0; k < 5; k++) {
      for (f = 0; f < 5; f++) {
        pcoeff = &coefficients[0];
        parray = &array[k * (5 + 2) + f];
        parray2 = parray + (5 + 2);
        parray3 = parray + (5 + 2) + (5 + 2);
        *poutput = 0;
        for (i = 0; i < 3; i++)
          *poutput += *pcoeff++ * *parray++;
        for (i = 0; i < 3; i++)
          *poutput += *pcoeff++ * *parray2++;
        for (i = 0; i < 3; i++)
          *poutput += *pcoeff++ * *parray3++;
        poutput++;
      }
    }
  }
  stop_trigger();
  int to_return = 0;
  for (i = 0; i < 5 * 5; i++) {
    if (output[i] != check_output[i]) {
      to_return = -1;
      break;
    }
  }
  return to_return;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movl   $0x0,-0x4(%rbp)
lea    0x2faa(%rip),%rax
mov    %rax,-0x10(%rbp)
lea    0x2f6f(%rip),%rax
mov    %rax,-0x28(%rbp)
lea    0x3064(%rip),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1c,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
movl   $0x0,-0x3c(%rbp)
cmpl   $0x5,-0x3c(%rbp)
jge    11dd <main+0xad>
movl   $0x0,-0x38(%rbp)
cmpl   $0x5,-0x38(%rbp)
jge    11c3 <main+0x93>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  0xe4f(%rip),%xmm0
movss  %xmm0,(%rax)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1190 <main+0x60>
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    117f <main+0x4f>
movl   $0x0,-0x3c(%rbp)
cmpl   $0x9,-0x3c(%rbp)
jge    1217 <main+0xe7>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x28(%rbp)
movss  0xdfb(%rip),%xmm0
movss  %xmm0,(%rax)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    11e4 <main+0xb4>
lea    0x2ed2(%rip),%rax
mov    %rax,-0x10(%rbp)
lea    0x2e97(%rip),%rax
mov    %rax,-0x28(%rbp)
lea    0x2f8c(%rip),%rax
mov    %rax,-0x30(%rbp)
mov    $0x0,%al
call   1050 <initialise_board@plt>
mov    $0x0,%al
call   1030 <start_trigger@plt>
movl   $0x0,-0x40(%rbp)
cmpl   $0x80,-0x40(%rbp)
jge    1436 <main+0x306>
lea    0x2e8f(%rip),%rax
mov    %rax,-0x10(%rbp)
lea    0x2e54(%rip),%rax
mov    %rax,-0x28(%rbp)
lea    0x2f49(%rip),%rax
mov    %rax,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
cmpl   $0x5,-0x34(%rbp)
jge    1423 <main+0x2f3>
movl   $0x0,-0x38(%rbp)
cmpl   $0x5,-0x38(%rbp)
jge    1410 <main+0x2e0>
lea    0x2e1c(%rip),%rax
mov    %rax,-0x28(%rbp)
imul   $0x7,-0x34(%rbp),%eax
add    -0x38(%rbp),%eax
movslq %eax,%rcx
lea    0x2e37(%rip),%rax
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1c,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1c,%rax
add    $0x1c,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
movl   $0x0,-0x3c(%rbp)
cmpl   $0x3,-0x3c(%rbp)
jge    1344 <main+0x214>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x28(%rbp)
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  (%rax),%xmm2
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    12f2 <main+0x1c2>
movl   $0x0,-0x3c(%rbp)
cmpl   $0x3,-0x3c(%rbp)
jge    139d <main+0x26d>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x28(%rbp)
movss  (%rax),%xmm0
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x18(%rbp)
movss  (%rax),%xmm2
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    134b <main+0x21b>
movl   $0x0,-0x3c(%rbp)
cmpl   $0x3,-0x3c(%rbp)
jge    13f6 <main+0x2c6>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x28(%rbp)
movss  (%rax),%xmm0
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
movss  (%rax),%xmm2
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    13a4 <main+0x274>
mov    -0x30(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1293 <main+0x163>
jmp    1415 <main+0x2e5>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1282 <main+0x152>
jmp    1428 <main+0x2f8>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    124d <main+0x11d>
mov    $0x0,%al
call   1040 <stop_trigger@plt>
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x3c(%rbp)
cmpl   $0x19,-0x3c(%rbp)
jge    14a4 <main+0x374>
movslq -0x3c(%rbp),%rcx
lea    0x2d60(%rip),%rax
movss  (%rax,%rcx,4),%xmm0
movslq -0x3c(%rbp),%rcx
lea    0x2bd0(%rip),%rax
ucomiss (%rax,%rcx,4),%xmm0
jne    1485 <main+0x355>
jp     1485 <main+0x355>
jmp    1491 <main+0x361>
movl   $0xffffffff,-0x44(%rbp)
jmp    14a4 <main+0x374>
jmp    1496 <main+0x366>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    144b <main+0x31b>
mov    -0x44(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbx
movaps 0xec8(%rip),%xmm0
movaps %xmm0,0x2fa1(%rip)
movl   $0x3f800000,0x2fa7(%rip)
movups %xmm0,0x2fac(%rip)
movl   $0x3f800000,0x2fb2(%rip)
movups %xmm0,0x2fb7(%rip)
movl   $0x3f800000,0x2fbd(%rip)
movups %xmm0,0x2fc2(%rip)
movl   $0x3f800000,0x2fc8(%rip)
movaps %xmm0,0x2fcd(%rip)
movl   $0x3f800000,0x2fd3(%rip)
movl   $0x3f800000,0x2eb9(%rip)
movl   $0x3f800000,0x2ebf(%rip)
movl   $0x3f800000,0x2ebd(%rip)
movl   $0x3f800000,0x2ebb(%rip)
movl   $0x3f800000,0x2ec1(%rip)
movl   $0x3f800000,0x2ec7(%rip)
movl   $0x3f800000,0x2ec5(%rip)
movl   $0x3f800000,0x2ec3(%rip)
movl   $0x3f800000,0x2ec9(%rip)
xor    %ebx,%ebx
xor    %eax,%eax
call   1050 <initialise_board@plt>
xor    %eax,%eax
call   1030 <start_trigger@plt>
lea    0x2f92(%rip),%r8
lea    0x2efb(%rip),%rcx
xorps  %xmm0,%xmm0
nopl   0x0(%rax,%rax,1)
mov    %rcx,%rdx
xor    %esi,%esi
mov    %r8,%rdi
nopl   0x0(%rax,%rax,1)
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movl   $0x0,(%rdi,%rax,1)
movss  0x2e11(%rip),%xmm1
mulss  -0x40(%rdx,%rax,1),%xmm1
addss  %xmm0,%xmm1
movss  0x2e0f(%rip),%xmm2
mulss  -0x3c(%rdx,%rax,1),%xmm2
movss  %xmm1,(%rdi,%rax,1)
addss  %xmm1,%xmm2
movss  %xmm2,(%rdi,%rax,1)
movss  0x2dfb(%rip),%xmm1
mulss  -0x38(%rdx,%rax,1),%xmm1
addss  %xmm2,%xmm1
movss  %xmm1,(%rdi,%rax,1)
movss  0x2dec(%rip),%xmm2
mulss  -0x24(%rdx,%rax,1),%xmm2
addss  %xmm1,%xmm2
movss  %xmm2,(%rdi,%rax,1)
movss  0x2de5(%rip),%xmm1
mulss  -0x20(%rdx,%rax,1),%xmm1
addss  %xmm2,%xmm1
movss  0x2de3(%rip),%xmm2
mulss  -0x1c(%rdx,%rax,1),%xmm2
movss  %xmm1,(%rdi,%rax,1)
addss  %xmm1,%xmm2
movss  %xmm2,(%rdi,%rax,1)
movss  0x2dcf(%rip),%xmm1
mulss  -0x8(%rdx,%rax,1),%xmm1
addss  %xmm2,%xmm1
movss  %xmm1,(%rdi,%rax,1)
movss  0x2dc0(%rip),%xmm2
mulss  -0x4(%rdx,%rax,1),%xmm2
addss  %xmm1,%xmm2
movss  %xmm2,(%rdi,%rax,1)
movss  0x2db9(%rip),%xmm1
mulss  (%rdx,%rax,1),%xmm1
addss  %xmm2,%xmm1
movss  %xmm1,(%rdi,%rax,1)
add    $0x4,%rax
cmp    $0x14,%rax
jne    1230 <main+0x100>
add    $0x1,%rsi
add    $0x1c,%rdx
add    %rax,%rdi
cmp    $0x5,%rsi
jne    1220 <main+0xf0>
add    $0x1,%ebx
cmp    $0x80,%ebx
jne    1210 <main+0xe0>
xor    %eax,%eax
call   1040 <stop_trigger@plt>
mov    $0x1,%ecx
lea    0x2e46(%rip),%rdx
lea    0xcbf(%rip),%rsi
mov    $0xffffffff,%eax
cs nopw 0x0(%rax,%rax,1)
movss  -0x4(%rdx,%rcx,4),%xmm0
ucomiss -0x4(%rsi,%rcx,4),%xmm0
jne    1388 <main+0x258>
jp     1388 <main+0x258>
cmp    $0x19,%rcx
je     138a <main+0x25a>
movss  (%rdx,%rcx,4),%xmm0
ucomiss (%rsi,%rcx,4),%xmm0
jne    1388 <main+0x258>
jp     1388 <main+0x258>
add    $0x2,%rcx
jmp    1360 <main+0x230>
pop    %rbx
ret
xor    %eax,%eax
pop    %rbx
ret

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

LLVM IR (-O2):
@main.coefficients.0 = internal unnamed_addr global float 0.000000e+00
@main.coefficients.1 = internal unnamed_addr global float 0.000000e+00
@main.coefficients.2 = internal unnamed_addr global float 0.000000e+00
@main.coefficients.3 = internal unnamed_addr global float 0.000000e+00
@main.coefficients.4 = internal unnamed_addr global float 0.000000e+00
@main.coefficients.5 = internal unnamed_addr global float 0.000000e+00
@main.coefficients.6 = internal unnamed_addr global float 0.000000e+00
@main.coefficients.7 = internal unnamed_addr global float 0.000000e+00
@main.coefficients.8 = internal unnamed_addr global float 0.000000e+00
@main.array = internal unnamed_addr global [49 x float] zeroinitializer
@main.output = internal unnamed_addr global [25 x float] zeroinitializer
@main.check_output = internal unnamed_addr constant [25 x float] [float 4.000000e+00, float 6.000000e+00, float 6.000000e+00, float 6.000000e+00, float 4.000000e+00, float 6.000000e+00, float 9.000000e+00, float 9.000000e+00, float 9.000000e+00, float 6.000000e+00, float 6.000000e+00, float 9.000000e+00, float 9.000000e+00, float 9.000000e+00, float 6.000000e+00, float 6.000000e+00, float 9.000000e+00, float 9.000000e+00, float 9.000000e+00, float 6.000000e+00, float 4.000000e+00, float 6.000000e+00, float 6.000000e+00, float 6.000000e+00, float 4.000000e+00]
define i32 @main() {
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* bitcast (float* getelementptr inbounds ([49 x float], [49 x float]* @main.array, i64 0, i64 8) to <4 x float>*)
store float 1.000000e+00, float* getelementptr inbounds ([49 x float], [49 x float]* @main.array, i64 0, i64 12)
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* bitcast (float* getelementptr inbounds ([49 x float], [49 x float]* @main.array, i64 0, i64 15) to <4 x float>*)
store float 1.000000e+00, float* getelementptr inbounds ([49 x float], [49 x float]* @main.array, i64 0, i64 19)
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* bitcast (float* getelementptr inbounds ([49 x float], [49 x float]* @main.array, i64 0, i64 22) to <4 x float>*)
store float 1.000000e+00, float* getelementptr inbounds ([49 x float], [49 x float]* @main.array, i64 0, i64 26)
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* bitcast (float* getelementptr inbounds ([49 x float], [49 x float]* @main.array, i64 0, i64 29) to <4 x float>*)
store float 1.000000e+00, float* getelementptr inbounds ([49 x float], [49 x float]* @main.array, i64 0, i64 33)
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* bitcast (float* getelementptr inbounds ([49 x float], [49 x float]* @main.array, i64 0, i64 36) to <4 x float>*)
store float 1.000000e+00, float* getelementptr inbounds ([49 x float], [49 x float]* @main.array, i64 0, i64 40)
store float 1.000000e+00, float* @main.coefficients.0
store float 1.000000e+00, float* @main.coefficients.1
store float 1.000000e+00, float* @main.coefficients.2
store float 1.000000e+00, float* @main.coefficients.3
store float 1.000000e+00, float* @main.coefficients.4
store float 1.000000e+00, float* @main.coefficients.5
store float 1.000000e+00, float* @main.coefficients.6
store float 1.000000e+00, float* @main.coefficients.7
store float 1.000000e+00, float* @main.coefficients.8
%1 = tail call i32 (...) @initialise_board()
%2 = tail call i32 (...) @start_trigger()
br label %3
3: ; preds = %0, %55
%4 = phi i32 [ 0, %0 ], [ %56, %55 ]
br label %5
5: ; preds = %3, %52
%6 = phi i64 [ 0, %3 ], [ %53, %52 ]
%7 = phi float* [ getelementptr inbounds ([25 x float], [25 x float]* @main.output, i64 0, i64 0), %3 ], [ %49, %52 ]
%8 = mul nuw nsw i64 %6, 7
br label %9
9: ; preds = %5, %9
%10 = phi i64 [ 0, %5 ], [ %50, %9 ]
%11 = phi float* [ %7, %5 ], [ %49, %9 ]
%12 = add nuw nsw i64 %10, %8
%13 = getelementptr inbounds [49 x float], [49 x float]* @main.array, i64 0, i64 %12
%14 = getelementptr inbounds float, float* %13, i64 7
store float 0.000000e+00, float* %11
%15 = load float, float* @main.coefficients.0
%16 = getelementptr inbounds float, float* %13, i64 1
%17 = load float, float* %13
%18 = tail call float @llvm.fmuladd.f32(float %15, float %17, float 0.000000e+00)
store float %18, float* %11
%19 = load float, float* @main.coefficients.1
%20 = getelementptr inbounds float, float* %13, i64 2
%21 = load float, float* %16
%22 = tail call float @llvm.fmuladd.f32(float %19, float %21, float %18)
store float %22, float* %11
%23 = load float, float* @main.coefficients.2
%24 = load float, float* %20
%25 = tail call float @llvm.fmuladd.f32(float %23, float %24, float %22)
store float %25, float* %11
%26 = load float, float* @main.coefficients.3
%27 = getelementptr inbounds float, float* %13, i64 8
%28 = load float, float* %14
%29 = tail call float @llvm.fmuladd.f32(float %26, float %28, float %25)
store float %29, float* %11
%30 = load float, float* @main.coefficients.4
%31 = getelementptr inbounds float, float* %13, i64 9
%32 = load float, float* %27
%33 = tail call float @llvm.fmuladd.f32(float %30, float %32, float %29)
store float %33, float* %11
%34 = load float, float* @main.coefficients.5
%35 = load float, float* %31
%36 = tail call float @llvm.fmuladd.f32(float %34, float %35, float %33)
store float %36, float* %11
%37 = getelementptr inbounds float, float* %13, i64 14
%38 = load float, float* @main.coefficients.6
%39 = getelementptr inbounds float, float* %13, i64 15
%40 = load float, float* %37
%41 = tail call float @llvm.fmuladd.f32(float %38, float %40, float %36)
store float %41, float* %11
%42 = load float, float* @main.coefficients.7
%43 = getelementptr inbounds float, float* %13, i64 16
%44 = load float, float* %39
%45 = tail call float @llvm.fmuladd.f32(float %42, float %44, float %41)
store float %45, float* %11
%46 = load float, float* @main.coefficients.8
%47 = load float, float* %43
%48 = tail call float @llvm.fmuladd.f32(float %46, float %47, float %45)
store float %48, float* %11
%49 = getelementptr inbounds float, float* %11, i64 1
%50 = add nuw nsw i64 %10, 1
%51 = icmp eq i64 %50, 5
br i1 %51, label %52, label %9
52: ; preds = %9
%53 = add nuw nsw i64 %6, 1
%54 = icmp eq i64 %53, 5
br i1 %54, label %55, label %5
55: ; preds = %52
%56 = add nuw nsw i32 %4, 1
%57 = icmp eq i32 %56, 128
br i1 %57, label %58, label %3
58: ; preds = %55
%59 = tail call i32 (...) @stop_trigger()
br label %71
60: ; preds = %71
%61 = or i64 %72, 1
%62 = icmp eq i64 %61, 25
br i1 %62, label %78, label %63
63: ; preds = %60
%64 = getelementptr inbounds [25 x float], [25 x float]* @main.output, i64 0, i64 %61
%65 = load float, float* %64
%66 = getelementptr inbounds [25 x float], [25 x float]* @main.check_output, i64 0, i64 %61
%67 = load float, float* %66
%68 = fcmp une float %65, %67
br i1 %68, label %78, label %69
69: ; preds = %63
%70 = add nuw nsw i64 %72, 2
br label %71
71: ; preds = %69, %58
%72 = phi i64 [ 0, %58 ], [ %70, %69 ]
%73 = getelementptr inbounds [25 x float], [25 x float]* @main.output, i64 0, i64 %72
%74 = load float, float* %73
%75 = getelementptr inbounds [25 x float], [25 x float]* @main.check_output, i64 0, i64 %72
%76 = load float, float* %75
%77 = fcmp une float %74, %76
br i1 %77, label %78, label %60
78: ; preds = %63, %71, %60
%79 = phi i32 [ 0, %60 ], [ -1, %71 ], [ -1, %63 ]
ret i32 %79
}