#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 */
int /*<<< orphan*/ abort();
int /*<<< orphan*/ fbar1(float *);
int /*<<< orphan*/ fbar2(float *);
int /*<<< orphan*/ fbar_add(float *);
int /*<<< orphan*/ fbar_mul(float *);
int /*<<< orphan*/ ibar_add(int *);
int main1() {
  int i, j;
  float a[16];
  float e[16];
  float b[16] = {0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45};
  float c[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
  float d[16] = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30};
  int ic[16] = {0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45};
  int ib[16] = {0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45};
  int ia[16];
  char cb[16] = {0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45};
  char ca[16];
  short sa[16];
  for (i = 0; i < 16; i++) {
    ca[i] = cb[i];
  }
  for (i = 0; i < 16; i++) {
    if (ca[i] != cb[i])
      abort();
  }
  for (i = 0; i < 16; i++) {
    a[i] = b[i] * c[i];
  }
  fbar_mul(a);
  for (i = 0; i < 16; i++) {
    a[i] = b[i] + c[i] + d[i];
    e[i] = b[i] + c[i] + d[i];
    ia[i] = ib[i] + ic[i];
  }
  ibar_add(ia);
  fbar_add(a);
  fbar_add(e);
  for (i = 0; i < 16 / 2; i++) {
    a[i] = b[i + 16 / 2] * c[i + 16 / 2] - b[i] * c[i];
    e[i + 16 / 2] = b[i] * c[i + 16 / 2] + b[i + 16 / 2] * c[i];
  }
  fbar1(a);
  fbar2(e);
  for (i = 1; i <= 16 - 4; i++) {
    a[i + 3] = b[i - 1];
  }
  for (i = 1; i <= 16 - 4; i++) {
    if (a[i + 3] != b[i - 1])
      abort();
  }
  i = 0;
  j = 0;
  while (i < 5 * 16) {
    a[j] = c[j];
    i += 5;
    j++;
  }
  for (i = 0; i < 16; i++) {
    if (a[i] != c[i])
      abort();
  }
  for (i = 16; i > 0; i--) {
    a[16 - i] = d[16 - i];
  }
  for (i = 0; i < 16; i++) {
    if (a[i] != d[i])
      abort();
  }
  for (i = 0; i < 16; i++) {
    a[i] = 5.0;
  }
  for (i = 0; i < 16; i++) {
    if (a[i] != 5.0)
      abort();
  }
  for (i = 0; i < 16; i++) {
    sa[i] = 5;
  }
  for (i = 0; i < 16; i++) {
    if (sa[i] != 5)
      abort();
  }
  for (i = 0; i < 16; i++) {
    ia[i] = ib[i] + 5;
  }
  for (i = 0; i < 16; i++) {
    if (ia[i] != ib[i] + 5)
      abort();
  }
  return 0;
}


x86 assembly (clang, -O0):
<main1>:
push   %rbp
mov    %rsp,%rbp
sub    $0x250,%rsp
lea    -0xd0(%rbp),%rdi
lea    0xe87(%rip),%rsi
mov    $0x40,%edx
call   1070 <memcpy@plt>
lea    -0x110(%rbp),%rdi
lea    0xeaf(%rip),%rsi
mov    $0x40,%edx
call   1070 <memcpy@plt>
lea    -0x150(%rbp),%rdi
lea    0xed7(%rip),%rsi
mov    $0x40,%edx
call   1070 <memcpy@plt>
lea    -0x190(%rbp),%rdi
lea    0xeff(%rip),%rsi
mov    $0x40,%edx
call   1070 <memcpy@plt>
lea    -0x1d0(%rbp),%rdi
lea    0xf27(%rip),%rsi
mov    $0x40,%edx
call   1070 <memcpy@plt>
mov    0xf56(%rip),%rax
mov    %rax,-0x220(%rbp)
mov    0xf50(%rip),%rax
mov    %rax,-0x218(%rbp)
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    1244 <main1+0xd4>
movslq -0x4(%rbp),%rax
mov    -0x220(%rbp,%rax,1),%cl
movslq -0x4(%rbp),%rax
mov    %cl,-0x230(%rbp,%rax,1)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1216 <main1+0xa6>
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    128f <main1+0x11f>
movslq -0x4(%rbp),%rax
movsbl -0x230(%rbp,%rax,1),%eax
ff
movslq -0x4(%rbp),%rcx
movsbl -0x220(%rbp,%rcx,1),%ecx
ff
cmp    %ecx,%eax
je     127c <main1+0x10c>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    1281 <main1+0x111>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    124b <main1+0xdb>
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    12d2 <main1+0x162>
movslq -0x4(%rbp),%rax
movss  -0xd0(%rbp,%rax,4),%xmm0
ff ff
movslq -0x4(%rbp),%rax
mulss  -0x110(%rbp,%rax,4),%xmm0
ff ff
movslq -0x4(%rbp),%rax
movss  %xmm0,-0x50(%rbp,%rax,4)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1296 <main1+0x126>
lea    -0x50(%rbp),%rdi
call   1090 <fbar_mul@plt>
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    1380 <main1+0x210>
movslq -0x4(%rbp),%rax
movss  -0xd0(%rbp,%rax,4),%xmm0
ff ff
movslq -0x4(%rbp),%rax
addss  -0x110(%rbp,%rax,4),%xmm0
ff ff
movslq -0x4(%rbp),%rax
addss  -0x150(%rbp,%rax,4),%xmm0
ff ff
movslq -0x4(%rbp),%rax
movss  %xmm0,-0x50(%rbp,%rax,4)
movslq -0x4(%rbp),%rax
movss  -0xd0(%rbp,%rax,4),%xmm0
ff ff
movslq -0x4(%rbp),%rax
addss  -0x110(%rbp,%rax,4),%xmm0
ff ff
movslq -0x4(%rbp),%rax
addss  -0x150(%rbp,%rax,4),%xmm0
ff ff
movslq -0x4(%rbp),%rax
movss  %xmm0,-0x90(%rbp,%rax,4)
ff ff
movslq -0x4(%rbp),%rax
mov    -0x1d0(%rbp,%rax,4),%ecx
movslq -0x4(%rbp),%rax
add    -0x190(%rbp,%rax,4),%ecx
movslq -0x4(%rbp),%rax
mov    %ecx,-0x210(%rbp,%rax,4)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    12e2 <main1+0x172>
lea    -0x210(%rbp),%rdi
call   1040 <ibar_add@plt>
lea    -0x50(%rbp),%rdi
call   1050 <fbar_add@plt>
lea    -0x90(%rbp),%rdi
call   1050 <fbar_add@plt>
movl   $0x0,-0x4(%rbp)
cmpl   $0x8,-0x4(%rbp)
jge    1470 <main1+0x300>
mov    -0x4(%rbp),%eax
add    $0x8,%eax
cltq
movss  -0xd0(%rbp,%rax,4),%xmm0
ff ff
mov    -0x4(%rbp),%eax
add    $0x8,%eax
cltq
movss  -0x110(%rbp,%rax,4),%xmm2
ff ff
movslq -0x4(%rbp),%rax
movss  -0xd0(%rbp,%rax,4),%xmm1
ff ff
movslq -0x4(%rbp),%rax
mulss  -0x110(%rbp,%rax,4),%xmm1
ff ff
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movslq -0x4(%rbp),%rax
movss  %xmm0,-0x50(%rbp,%rax,4)
movslq -0x4(%rbp),%rax
movss  -0xd0(%rbp,%rax,4),%xmm0
ff ff
mov    -0x4(%rbp),%eax
add    $0x8,%eax
cltq
movss  -0x110(%rbp,%rax,4),%xmm2
ff ff
mov    -0x4(%rbp),%eax
add    $0x8,%eax
cltq
movss  -0xd0(%rbp,%rax,4),%xmm1
ff ff
movslq -0x4(%rbp),%rax
mulss  -0x110(%rbp,%rax,4),%xmm1
ff ff
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x4(%rbp),%eax
add    $0x8,%eax
cltq
movss  %xmm0,-0x90(%rbp,%rax,4)
ff ff
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    13a8 <main1+0x238>
lea    -0x50(%rbp),%rdi
call   1080 <fbar1@plt>
lea    -0x90(%rbp),%rdi
call   1060 <fbar2@plt>
movl   $0x1,-0x4(%rbp)
cmpl   $0xc,-0x4(%rbp)
jg     14c3 <main1+0x353>
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
cltq
movss  -0xd0(%rbp,%rax,4),%xmm0
ff ff
mov    -0x4(%rbp),%eax
add    $0x3,%eax
cltq
movss  %xmm0,-0x50(%rbp,%rax,4)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    148c <main1+0x31c>
movl   $0x1,-0x4(%rbp)
cmpl   $0xc,-0x4(%rbp)
jg     151d <main1+0x3ad>
mov    -0x4(%rbp),%eax
add    $0x3,%eax
cltq
movss  -0x50(%rbp,%rax,4),%xmm0
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
cltq
ucomiss -0xd0(%rbp,%rax,4),%xmm0
ff
jne    1503 <main1+0x393>
jp     1503 <main1+0x393>
jmp    150a <main1+0x39a>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    150f <main1+0x39f>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    14ca <main1+0x35a>
movl   $0x0,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0x50,-0x4(%rbp)
jge    1563 <main1+0x3f3>
movslq -0x8(%rbp),%rax
movss  -0x110(%rbp,%rax,4),%xmm0
ff ff
movslq -0x8(%rbp),%rax
movss  %xmm0,-0x50(%rbp,%rax,4)
mov    -0x4(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    152b <main1+0x3bb>
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    15b5 <main1+0x445>
movslq -0x4(%rbp),%rax
movss  -0x50(%rbp,%rax,4),%xmm0
movslq -0x4(%rbp),%rax
ucomiss -0x110(%rbp,%rax,4),%xmm0
ff
jne    159b <main1+0x42b>
jp     159b <main1+0x42b>
jmp    15a2 <main1+0x432>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    15a7 <main1+0x437>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    156a <main1+0x3fa>
movl   $0x10,-0x4(%rbp)
cmpl   $0x0,-0x4(%rbp)
jle    15f7 <main1+0x487>
mov    $0x10,%eax
sub    -0x4(%rbp),%eax
cltq
movss  -0x150(%rbp,%rax,4),%xmm0
ff ff
mov    $0x10,%eax
sub    -0x4(%rbp),%eax
cltq
movss  %xmm0,-0x50(%rbp,%rax,4)
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
jmp    15bc <main1+0x44c>
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    1649 <main1+0x4d9>
movslq -0x4(%rbp),%rax
movss  -0x50(%rbp,%rax,4),%xmm0
movslq -0x4(%rbp),%rax
ucomiss -0x150(%rbp,%rax,4),%xmm0
ff
jne    162f <main1+0x4bf>
jp     162f <main1+0x4bf>
jmp    1636 <main1+0x4c6>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    163b <main1+0x4cb>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    15fe <main1+0x48e>
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    167a <main1+0x50a>
movslq -0x4(%rbp),%rax
movss  0x9a2(%rip),%xmm0
movss  %xmm0,-0x50(%rbp,%rax,4)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1650 <main1+0x4e0>
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    16d0 <main1+0x560>
movslq -0x4(%rbp),%rax
movss  -0x50(%rbp,%rax,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0x95f(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    16b6 <main1+0x546>
jp     16b6 <main1+0x546>
jmp    16bd <main1+0x54d>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    16c2 <main1+0x552>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1681 <main1+0x511>
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    16fd <main1+0x58d>
movslq -0x4(%rbp),%rax
movw   $0x5,-0x250(%rbp,%rax,2)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    16d7 <main1+0x567>
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    173d <main1+0x5cd>
movslq -0x4(%rbp),%rax
movswl -0x250(%rbp,%rax,2),%eax
ff
cmp    $0x5,%eax
je     172a <main1+0x5ba>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    172f <main1+0x5bf>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1704 <main1+0x594>
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    1775 <main1+0x605>
movslq -0x4(%rbp),%rax
mov    -0x1d0(%rbp,%rax,4),%ecx
add    $0x5,%ecx
movslq -0x4(%rbp),%rax
mov    %ecx,-0x210(%rbp,%rax,4)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1744 <main1+0x5d4>
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    17c1 <main1+0x651>
movslq -0x4(%rbp),%rax
mov    -0x210(%rbp,%rax,4),%eax
movslq -0x4(%rbp),%rcx
mov    -0x1d0(%rbp,%rcx,4),%ecx
add    $0x5,%ecx
cmp    %ecx,%eax
je     17ae <main1+0x63e>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    17b3 <main1+0x643>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    177c <main1+0x60c>
xor    %eax,%eax
add    $0x250,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main1>:
push   %r14
push   %rbx
sub    $0xc8,%rsp
movaps 0xe9f(%rip),%xmm0
movaps %xmm0,(%rsp)
movaps 0xea4(%rip),%xmm0
movaps %xmm0,0x10(%rsp)
movaps 0xea8(%rip),%xmm0
movaps %xmm0,0x20(%rsp)
movaps 0xeac(%rip),%xmm0
movaps %xmm0,0x30(%rsp)
mov    %rsp,%r14
mov    %r14,%rdi
call   1070 <fbar_mul@plt>
movaps 0xea5(%rip),%xmm0
movaps %xmm0,(%rsp)
movaps %xmm0,0x40(%rsp)
movaps 0xea5(%rip),%xmm0
movaps %xmm0,0x80(%rsp)
movaps 0xea6(%rip),%xmm0
movaps %xmm0,0x10(%rsp)
movaps %xmm0,0x50(%rsp)
movaps 0xea5(%rip),%xmm0
movaps %xmm0,0x90(%rsp)
movaps 0xea6(%rip),%xmm0
movaps %xmm0,0x20(%rsp)
movaps %xmm0,0x60(%rsp)
movaps 0xea5(%rip),%xmm0
movaps %xmm0,0xa0(%rsp)
movaps 0xea6(%rip),%xmm0
movaps %xmm0,0x30(%rsp)
movaps %xmm0,0x70(%rsp)
movaps 0xea5(%rip),%xmm0
movaps %xmm0,0xb0(%rsp)
lea    0x80(%rsp),%rdi
call   1030 <ibar_add@plt>
mov    %r14,%rdi
call   1040 <fbar_add@plt>
lea    0x40(%rsp),%rbx
mov    %rbx,%rdi
call   1040 <fbar_add@plt>
movaps 0xe84(%rip),%xmm0
movaps %xmm0,(%rsp)
movaps 0xe89(%rip),%xmm0
movaps %xmm0,0x60(%rsp)
movaps 0xe8d(%rip),%xmm0
movaps %xmm0,0x10(%rsp)
movaps 0xe91(%rip),%xmm0
movaps %xmm0,0x70(%rsp)
mov    %r14,%rdi
call   1060 <fbar1@plt>
mov    %rbx,%rdi
call   1050 <fbar2@plt>
xor    %eax,%eax
add    $0xc8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
@__const.main1.b = [16 x float] [float 0.000000e+00, float 3.000000e+00, float 6.000000e+00, float 9.000000e+00, float 1.200000e+01, float 1.500000e+01, float 1.800000e+01, float 2.100000e+01, float 2.400000e+01, float 2.700000e+01, float 3.000000e+01, float 3.300000e+01, float 3.600000e+01, float 3.900000e+01, float 4.200000e+01, float 4.500000e+01]
@__const.main1.c = [16 x float] [float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00, float 8.000000e+00, float 9.000000e+00, float 1.000000e+01, float 1.100000e+01, float 1.200000e+01, float 1.300000e+01, float 1.400000e+01, float 1.500000e+01]
@__const.main1.d = [16 x float] [float 0.000000e+00, float 2.000000e+00, float 4.000000e+00, float 6.000000e+00, float 8.000000e+00, float 1.000000e+01, float 1.200000e+01, float 1.400000e+01, float 1.600000e+01, float 1.800000e+01, float 2.000000e+01, float 2.200000e+01, float 2.400000e+01, float 2.600000e+01, float 2.800000e+01, float 3.000000e+01]
@__const.main1.ic = [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45]
@__const.main1.ib = [16 x i32] [i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21, i32 24, i32 27, i32 30, i32 33, i32 36, i32 39, i32 42, i32 45]
@__const.main1.cb = [16 x i8] c"\00\03\06\09\0C\0F\12\15\18\1B\1E!$'*-"
define i32 @main1() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca [16 x float]
%4 = alloca [16 x float]
%5 = alloca [16 x float]
%6 = alloca [16 x float]
%7 = alloca [16 x float]
%8 = alloca [16 x i32]
%9 = alloca [16 x i32]
%10 = alloca [16 x i32]
%11 = alloca [16 x i8]
%12 = alloca [16 x i8]
%13 = alloca [16 x i16]
%14 = bitcast [16 x float]* %5 to i8*
%15 = bitcast [16 x float]* %6 to i8*
%16 = bitcast [16 x float]* %7 to i8*
%17 = bitcast [16 x i32]* %8 to i8*
%18 = bitcast [16 x i32]* %9 to i8*
%19 = bitcast [16 x i8]* %11 to i8*
store i32 0, i32* %1
br label %20
20: ; preds = %31, %0
%21 = load i32, i32* %1
%22 = icmp slt i32 %21, 16
br i1 %22, label %23, label %34
23: ; preds = %20
%24 = load i32, i32* %1
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds [16 x i8], [16 x i8]* %11, i64 0, i64 %25
%27 = load i8, i8* %26
%28 = load i32, i32* %1
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds [16 x i8], [16 x i8]* %12, i64 0, i64 %29
store i8 %27, i8* %30
br label %31
31: ; preds = %23
%32 = load i32, i32* %1
%33 = add nsw i32 %32, 1
store i32 %33, i32* %1
br label %20
34: ; preds = %20
store i32 0, i32* %1
br label %35
35: ; preds = %53, %34
%36 = load i32, i32* %1
%37 = icmp slt i32 %36, 16
br i1 %37, label %38, label %56
38: ; preds = %35
%39 = load i32, i32* %1
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds [16 x i8], [16 x i8]* %12, i64 0, i64 %40
%42 = load i8, i8* %41
%43 = sext i8 %42 to i32
%44 = load i32, i32* %1
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds [16 x i8], [16 x i8]* %11, i64 0, i64 %45
%47 = load i8, i8* %46
%48 = sext i8 %47 to i32
%49 = icmp ne i32 %43, %48
br i1 %49, label %50, label %52
50: ; preds = %38
%51 = call i32 (...) @abort()
unreachable
52: ; preds = %38
br label %53
53: ; preds = %52
%54 = load i32, i32* %1
%55 = add nsw i32 %54, 1
store i32 %55, i32* %1
br label %35
56: ; preds = %35
store i32 0, i32* %1
br label %57
57: ; preds = %73, %56
%58 = load i32, i32* %1
%59 = icmp slt i32 %58, 16
br i1 %59, label %60, label %76
60: ; preds = %57
%61 = load i32, i32* %1
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds [16 x float], [16 x float]* %5, i64 0, i64 %62
%64 = load float, float* %63
%65 = load i32, i32* %1
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds [16 x float], [16 x float]* %6, i64 0, i64 %66
%68 = load float, float* %67
%69 = fmul float %64, %68
%70 = load i32, i32* %1
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 %71
store float %69, float* %72
br label %73
73: ; preds = %60
%74 = load i32, i32* %1
%75 = add nsw i32 %74, 1
store i32 %75, i32* %1
br label %57
76: ; preds = %57
%77 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 0
%78 = call i32 @fbar_mul(float* %77)
store i32 0, i32* %1
br label %79
79: ; preds = %129, %76
%80 = load i32, i32* %1
%81 = icmp slt i32 %80, 16
br i1 %81, label %82, label %132
82: ; preds = %79
%83 = load i32, i32* %1
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds [16 x float], [16 x float]* %5, i64 0, i64 %84
%86 = load float, float* %85
%87 = load i32, i32* %1
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds [16 x float], [16 x float]* %6, i64 0, i64 %88
%90 = load float, float* %89
%91 = fadd float %86, %90
%92 = load i32, i32* %1
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds [16 x float], [16 x float]* %7, i64 0, i64 %93
%95 = load float, float* %94
%96 = fadd float %91, %95
%97 = load i32, i32* %1
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 %98
store float %96, float* %99
%100 = load i32, i32* %1
%101 = sext i32 %100 to i64
%102 = getelementptr inbounds [16 x float], [16 x float]* %5, i64 0, i64 %101
%103 = load float, float* %102
%104 = load i32, i32* %1
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds [16 x float], [16 x float]* %6, i64 0, i64 %105
%107 = load float, float* %106
%108 = fadd float %103, %107
%109 = load i32, i32* %1
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds [16 x float], [16 x float]* %7, i64 0, i64 %110
%112 = load float, float* %111
%113 = fadd float %108, %112
%114 = load i32, i32* %1
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds [16 x float], [16 x float]* %4, i64 0, i64 %115
store float %113, float* %116
%117 = load i32, i32* %1
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds [16 x i32], [16 x i32]* %9, i64 0, i64 %118
%120 = load i32, i32* %119
%121 = load i32, i32* %1
%122 = sext i32 %121 to i64
%123 = getelementptr inbounds [16 x i32], [16 x i32]* %8, i64 0, i64 %122
%124 = load i32, i32* %123
%125 = add nsw i32 %120, %124
%126 = load i32, i32* %1
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 %127
store i32 %125, i32* %128
br label %129
129: ; preds = %82
%130 = load i32, i32* %1
%131 = add nsw i32 %130, 1
store i32 %131, i32* %1
br label %79
132: ; preds = %79
%133 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 0
%134 = call i32 @ibar_add(i32* %133)
%135 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 0
%136 = call i32 @fbar_add(float* %135)
%137 = getelementptr inbounds [16 x float], [16 x float]* %4, i64 0, i64 0
%138 = call i32 @fbar_add(float* %137)
store i32 0, i32* %1
br label %139
139: ; preds = %191, %132
%140 = load i32, i32* %1
%141 = icmp slt i32 %140, 8
br i1 %141, label %142, label %194
142: ; preds = %139
%143 = load i32, i32* %1
%144 = add nsw i32 %143, 8
%145 = sext i32 %144 to i64
%146 = getelementptr inbounds [16 x float], [16 x float]* %5, i64 0, i64 %145
%147 = load float, float* %146
%148 = load i32, i32* %1
%149 = add nsw i32 %148, 8
%150 = sext i32 %149 to i64
%151 = getelementptr inbounds [16 x float], [16 x float]* %6, i64 0, i64 %150
%152 = load float, float* %151
%153 = load i32, i32* %1
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds [16 x float], [16 x float]* %5, i64 0, i64 %154
%156 = load float, float* %155
%157 = load i32, i32* %1
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds [16 x float], [16 x float]* %6, i64 0, i64 %158
%160 = load float, float* %159
%161 = fmul float %156, %160
%162 = fneg float %161
%163 = call float @llvm.fmuladd.f32(float %147, float %152, float %162)
%164 = load i32, i32* %1
%165 = sext i32 %164 to i64
%166 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 %165
store float %163, float* %166
%167 = load i32, i32* %1
%168 = sext i32 %167 to i64
%169 = getelementptr inbounds [16 x float], [16 x float]* %5, i64 0, i64 %168
%170 = load float, float* %169
%171 = load i32, i32* %1
%172 = add nsw i32 %171, 8
%173 = sext i32 %172 to i64
%174 = getelementptr inbounds [16 x float], [16 x float]* %6, i64 0, i64 %173
%175 = load float, float* %174
%176 = load i32, i32* %1
%177 = add nsw i32 %176, 8
%178 = sext i32 %177 to i64
%179 = getelementptr inbounds [16 x float], [16 x float]* %5, i64 0, i64 %178
%180 = load float, float* %179
%181 = load i32, i32* %1
%182 = sext i32 %181 to i64
%183 = getelementptr inbounds [16 x float], [16 x float]* %6, i64 0, i64 %182
%184 = load float, float* %183
%185 = fmul float %180, %184
%186 = call float @llvm.fmuladd.f32(float %170, float %175, float %185)
%187 = load i32, i32* %1
%188 = add nsw i32 %187, 8
%189 = sext i32 %188 to i64
%190 = getelementptr inbounds [16 x float], [16 x float]* %4, i64 0, i64 %189
store float %186, float* %190
br label %191
191: ; preds = %142
%192 = load i32, i32* %1
%193 = add nsw i32 %192, 1
store i32 %193, i32* %1
br label %139
194: ; preds = %139
%195 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 0
%196 = call i32 @fbar1(float* %195)
%197 = getelementptr inbounds [16 x float], [16 x float]* %4, i64 0, i64 0
%198 = call i32 @fbar2(float* %197)
store i32 1, i32* %1
br label %199
199: ; preds = %212, %194
%200 = load i32, i32* %1
%201 = icmp sle i32 %200, 12
br i1 %201, label %202, label %215
202: ; preds = %199
%203 = load i32, i32* %1
%204 = sub nsw i32 %203, 1
%205 = sext i32 %204 to i64
%206 = getelementptr inbounds [16 x float], [16 x float]* %5, i64 0, i64 %205
%207 = load float, float* %206
%208 = load i32, i32* %1
%209 = add nsw i32 %208, 3
%210 = sext i32 %209 to i64
%211 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 %210
store float %207, float* %211
br label %212
212: ; preds = %202
%213 = load i32, i32* %1
%214 = add nsw i32 %213, 1
store i32 %214, i32* %1
br label %199
215: ; preds = %199
store i32 1, i32* %1
br label %216
216: ; preds = %234, %215
%217 = load i32, i32* %1
%218 = icmp sle i32 %217, 12
br i1 %218, label %219, label %237
219: ; preds = %216
%220 = load i32, i32* %1
%221 = add nsw i32 %220, 3
%222 = sext i32 %221 to i64
%223 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 %222
%224 = load float, float* %223
%225 = load i32, i32* %1
%226 = sub nsw i32 %225, 1
%227 = sext i32 %226 to i64
%228 = getelementptr inbounds [16 x float], [16 x float]* %5, i64 0, i64 %227
%229 = load float, float* %228
%230 = fcmp une float %224, %229
br i1 %230, label %231, label %233
231: ; preds = %219
%232 = call i32 (...) @abort()
unreachable
233: ; preds = %219
br label %234
234: ; preds = %233
%235 = load i32, i32* %1
%236 = add nsw i32 %235, 1
store i32 %236, i32* %1
br label %216
237: ; preds = %216
store i32 0, i32* %1
store i32 0, i32* %2
br label %238
238: ; preds = %241, %237
%239 = load i32, i32* %1
%240 = icmp slt i32 %239, 80
br i1 %240, label %241, label %253
241: ; preds = %238
%242 = load i32, i32* %2
%243 = sext i32 %242 to i64
%244 = getelementptr inbounds [16 x float], [16 x float]* %6, i64 0, i64 %243
%245 = load float, float* %244
%246 = load i32, i32* %2
%247 = sext i32 %246 to i64
%248 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 %247
store float %245, float* %248
%249 = load i32, i32* %1
%250 = add nsw i32 %249, 5
store i32 %250, i32* %1
%251 = load i32, i32* %2
%252 = add nsw i32 %251, 1
store i32 %252, i32* %2
br label %238
253: ; preds = %238
store i32 0, i32* %1
br label %254
254: ; preds = %270, %253
%255 = load i32, i32* %1
%256 = icmp slt i32 %255, 16
br i1 %256, label %257, label %273
257: ; preds = %254
%258 = load i32, i32* %1
%259 = sext i32 %258 to i64
%260 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 %259
%261 = load float, float* %260
%262 = load i32, i32* %1
%263 = sext i32 %262 to i64
%264 = getelementptr inbounds [16 x float], [16 x float]* %6, i64 0, i64 %263
%265 = load float, float* %264
%266 = fcmp une float %261, %265
br i1 %266, label %267, label %269
267: ; preds = %257
%268 = call i32 (...) @abort()
unreachable
269: ; preds = %257
br label %270
270: ; preds = %269
%271 = load i32, i32* %1
%272 = add nsw i32 %271, 1
store i32 %272, i32* %1
br label %254
273: ; preds = %254
store i32 16, i32* %1
br label %274
274: ; preds = %287, %273
%275 = load i32, i32* %1
%276 = icmp sgt i32 %275, 0
br i1 %276, label %277, label %290
277: ; preds = %274
%278 = load i32, i32* %1
%279 = sub nsw i32 16, %278
%280 = sext i32 %279 to i64
%281 = getelementptr inbounds [16 x float], [16 x float]* %7, i64 0, i64 %280
%282 = load float, float* %281
%283 = load i32, i32* %1
%284 = sub nsw i32 16, %283
%285 = sext i32 %284 to i64
%286 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 %285
store float %282, float* %286
br label %287
287: ; preds = %277
%288 = load i32, i32* %1
%289 = add nsw i32 %288, -1
store i32 %289, i32* %1
br label %274
290: ; preds = %274
store i32 0, i32* %1
br label %291
291: ; preds = %307, %290
%292 = load i32, i32* %1
%293 = icmp slt i32 %292, 16
br i1 %293, label %294, label %310
294: ; preds = %291
%295 = load i32, i32* %1
%296 = sext i32 %295 to i64
%297 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 %296
%298 = load float, float* %297
%299 = load i32, i32* %1
%300 = sext i32 %299 to i64
%301 = getelementptr inbounds [16 x float], [16 x float]* %7, i64 0, i64 %300
%302 = load float, float* %301
%303 = fcmp une float %298, %302
br i1 %303, label %304, label %306
304: ; preds = %294
%305 = call i32 (...) @abort()
unreachable
306: ; preds = %294
br label %307
307: ; preds = %306
%308 = load i32, i32* %1
%309 = add nsw i32 %308, 1
store i32 %309, i32* %1
br label %291
310: ; preds = %291
store i32 0, i32* %1
br label %311
311: ; preds = %318, %310
%312 = load i32, i32* %1
%313 = icmp slt i32 %312, 16
br i1 %313, label %314, label %321
314: ; preds = %311
%315 = load i32, i32* %1
%316 = sext i32 %315 to i64
%317 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 %316
store float 5.000000e+00, float* %317
br label %318
318: ; preds = %314
%319 = load i32, i32* %1
%320 = add nsw i32 %319, 1
store i32 %320, i32* %1
br label %311
321: ; preds = %311
store i32 0, i32* %1
br label %322
322: ; preds = %335, %321
%323 = load i32, i32* %1
%324 = icmp slt i32 %323, 16
br i1 %324, label %325, label %338
325: ; preds = %322
%326 = load i32, i32* %1
%327 = sext i32 %326 to i64
%328 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 %327
%329 = load float, float* %328
%330 = fpext float %329 to double
%331 = fcmp une double %330, 5.000000e+00
br i1 %331, label %332, label %334
332: ; preds = %325
%333 = call i32 (...) @abort()
unreachable
334: ; preds = %325
br label %335
335: ; preds = %334
%336 = load i32, i32* %1
%337 = add nsw i32 %336, 1
store i32 %337, i32* %1
br label %322
338: ; preds = %322
store i32 0, i32* %1
br label %339
339: ; preds = %346, %338
%340 = load i32, i32* %1
%341 = icmp slt i32 %340, 16
br i1 %341, label %342, label %349
342: ; preds = %339
%343 = load i32, i32* %1
%344 = sext i32 %343 to i64
%345 = getelementptr inbounds [16 x i16], [16 x i16]* %13, i64 0, i64 %344
store i16 5, i16* %345
br label %346
346: ; preds = %342
%347 = load i32, i32* %1
%348 = add nsw i32 %347, 1
store i32 %348, i32* %1
br label %339
349: ; preds = %339
store i32 0, i32* %1
br label %350
350: ; preds = %363, %349
%351 = load i32, i32* %1
%352 = icmp slt i32 %351, 16
br i1 %352, label %353, label %366
353: ; preds = %350
%354 = load i32, i32* %1
%355 = sext i32 %354 to i64
%356 = getelementptr inbounds [16 x i16], [16 x i16]* %13, i64 0, i64 %355
%357 = load i16, i16* %356
%358 = sext i16 %357 to i32
%359 = icmp ne i32 %358, 5
br i1 %359, label %360, label %362
360: ; preds = %353
%361 = call i32 (...) @abort()
unreachable
362: ; preds = %353
br label %363
363: ; preds = %362
%364 = load i32, i32* %1
%365 = add nsw i32 %364, 1
store i32 %365, i32* %1
br label %350
366: ; preds = %350
store i32 0, i32* %1
br label %367
367: ; preds = %379, %366
%368 = load i32, i32* %1
%369 = icmp slt i32 %368, 16
br i1 %369, label %370, label %382
370: ; preds = %367
%371 = load i32, i32* %1
%372 = sext i32 %371 to i64
%373 = getelementptr inbounds [16 x i32], [16 x i32]* %9, i64 0, i64 %372
%374 = load i32, i32* %373
%375 = add nsw i32 %374, 5
%376 = load i32, i32* %1
%377 = sext i32 %376 to i64
%378 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 %377
store i32 %375, i32* %378
br label %379
379: ; preds = %370
%380 = load i32, i32* %1
%381 = add nsw i32 %380, 1
store i32 %381, i32* %1
br label %367
382: ; preds = %367
store i32 0, i32* %1
br label %383
383: ; preds = %400, %382
%384 = load i32, i32* %1
%385 = icmp slt i32 %384, 16
br i1 %385, label %386, label %403
386: ; preds = %383
%387 = load i32, i32* %1
%388 = sext i32 %387 to i64
%389 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 %388
%390 = load i32, i32* %389
%391 = load i32, i32* %1
%392 = sext i32 %391 to i64
%393 = getelementptr inbounds [16 x i32], [16 x i32]* %9, i64 0, i64 %392
%394 = load i32, i32* %393
%395 = add nsw i32 %394, 5
%396 = icmp ne i32 %390, %395
br i1 %396, label %397, label %399
397: ; preds = %386
%398 = call i32 (...) @abort()
unreachable
399: ; preds = %386
br label %400
400: ; preds = %399
%401 = load i32, i32* %1
%402 = add nsw i32 %401, 1
store i32 %402, i32* %1
br label %383
403: ; preds = %383
ret i32 0
}

LLVM IR (-O2):
define i32 @main1() {
%1 = alloca [16 x float]
%2 = bitcast [16 x float]* %1 to i8*
%3 = alloca [16 x float]
%4 = alloca [16 x i32]
%5 = bitcast [16 x float]* %3 to i8*
%6 = bitcast [16 x i32]* %4 to i8*
%7 = getelementptr inbounds [16 x float], [16 x float]* %1, i64 0, i64 0
%8 = bitcast [16 x float]* %1 to <4 x float>*
store <4 x float> <float 0.000000e+00, float 3.000000e+00, float 1.200000e+01, float 2.700000e+01>, <4 x float>* %8
%9 = getelementptr inbounds [16 x float], [16 x float]* %1, i64 0, i64 4
%10 = bitcast float* %9 to <4 x float>*
store <4 x float> <float 4.800000e+01, float 7.500000e+01, float 1.080000e+02, float 1.470000e+02>, <4 x float>* %10
%11 = getelementptr inbounds [16 x float], [16 x float]* %1, i64 0, i64 8
%12 = bitcast float* %11 to <4 x float>*
store <4 x float> <float 1.920000e+02, float 2.430000e+02, float 3.000000e+02, float 3.630000e+02>, <4 x float>* %12
%13 = getelementptr inbounds [16 x float], [16 x float]* %1, i64 0, i64 12
%14 = bitcast float* %13 to <4 x float>*
store <4 x float> <float 4.320000e+02, float 5.070000e+02, float 5.880000e+02, float 6.750000e+02>, <4 x float>* %14
%15 = call i32 @fbar_mul(float* %7)
%16 = bitcast [16 x float]* %1 to <4 x float>*
store <4 x float> <float 0.000000e+00, float 6.000000e+00, float 1.200000e+01, float 1.800000e+01>, <4 x float>* %16
%17 = bitcast [16 x float]* %3 to <4 x float>*
store <4 x float> <float 0.000000e+00, float 6.000000e+00, float 1.200000e+01, float 1.800000e+01>, <4 x float>* %17
%18 = bitcast [16 x i32]* %4 to <4 x i32>*
store <4 x i32> <i32 0, i32 6, i32 12, i32 18>, <4 x i32>* %18
%19 = getelementptr inbounds [16 x float], [16 x float]* %1, i64 0, i64 4
%20 = bitcast float* %19 to <4 x float>*
store <4 x float> <float 2.400000e+01, float 3.000000e+01, float 3.600000e+01, float 4.200000e+01>, <4 x float>* %20
%21 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 4
%22 = bitcast float* %21 to <4 x float>*
store <4 x float> <float 2.400000e+01, float 3.000000e+01, float 3.600000e+01, float 4.200000e+01>, <4 x float>* %22
%23 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 4
%24 = bitcast i32* %23 to <4 x i32>*
store <4 x i32> <i32 24, i32 30, i32 36, i32 42>, <4 x i32>* %24
%25 = getelementptr inbounds [16 x float], [16 x float]* %1, i64 0, i64 8
%26 = bitcast float* %25 to <4 x float>*
store <4 x float> <float 4.800000e+01, float 5.400000e+01, float 6.000000e+01, float 6.600000e+01>, <4 x float>* %26
%27 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 8
%28 = bitcast float* %27 to <4 x float>*
store <4 x float> <float 4.800000e+01, float 5.400000e+01, float 6.000000e+01, float 6.600000e+01>, <4 x float>* %28
%29 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 8
%30 = bitcast i32* %29 to <4 x i32>*
store <4 x i32> <i32 48, i32 54, i32 60, i32 66>, <4 x i32>* %30
%31 = getelementptr inbounds [16 x float], [16 x float]* %1, i64 0, i64 12
%32 = bitcast float* %31 to <4 x float>*
store <4 x float> <float 7.200000e+01, float 7.800000e+01, float 8.400000e+01, float 9.000000e+01>, <4 x float>* %32
%33 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 12
%34 = bitcast float* %33 to <4 x float>*
store <4 x float> <float 7.200000e+01, float 7.800000e+01, float 8.400000e+01, float 9.000000e+01>, <4 x float>* %34
%35 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 12
%36 = bitcast i32* %35 to <4 x i32>*
store <4 x i32> <i32 72, i32 78, i32 84, i32 90>, <4 x i32>* %36
%37 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 0
%38 = call i32 @ibar_add(i32* %37)
%39 = call i32 @fbar_add(float* %7)
%40 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 0
%41 = call i32 @fbar_add(float* %40)
%42 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 8
%43 = bitcast [16 x float]* %1 to <4 x float>*
store <4 x float> <float 1.920000e+02, float 2.400000e+02, float 2.880000e+02, float 3.360000e+02>, <4 x float>* %43
%44 = bitcast float* %42 to <4 x float>*
store <4 x float> <float 0.000000e+00, float 5.400000e+01, float 1.200000e+02, float 1.980000e+02>, <4 x float>* %44
%45 = getelementptr inbounds [16 x float], [16 x float]* %3, i64 0, i64 12
%46 = bitcast float* %9 to <4 x float>*
store <4 x float> <float 3.840000e+02, float 4.320000e+02, float 4.800000e+02, float 5.280000e+02>, <4 x float>* %46
%47 = bitcast float* %45 to <4 x float>*
store <4 x float> <float 2.880000e+02, float 3.900000e+02, float 5.040000e+02, float 6.300000e+02>, <4 x float>* %47
%48 = call i32 @fbar1(float* %7)
%49 = call i32 @fbar2(float* %40)
ret i32 0
}