int main(int argc, const char *argv[]) {
  unsigned int input[16], output[16], i;
  unsigned int check_results[16] = {1872,   746,   28304,  4815, 8392,   2894,
                                    139524, 18411, 14912,  5042, 250744, 32007,
                                    21432,  7190,  361964, 45603};
  check_vect();
  for (i = 0; i < 16; i++) {
    input[i] = i % 256;
    output[i] = 0;
    __asm__ volatile("");
  }
  foo(input, output);
  for (i = 0; i < 16; i++) {
    if (output[i] != check_results[i])
      abort();
    __asm__ volatile("");
  }
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0xe0,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
lea    -0xe0(%rbp),%rdi
lea    0xe99(%rip),%rsi
mov    $0x40,%edx
call   1050 <memcpy@plt>
mov    $0x0,%al
call   1040 <check_vect@plt>
movl   $0x0,-0x94(%rbp)
cmpl   $0x10,-0x94(%rbp)
jae    11ca <main+0x8a>
mov    -0x94(%rbp),%ecx
and    $0xff,%ecx
mov    -0x94(%rbp),%eax
mov    %ecx,-0x50(%rbp,%rax,4)
mov    -0x94(%rbp),%eax
movl   $0x0,-0x90(%rbp,%rax,4)
mov    -0x94(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x94(%rbp)
jmp    1182 <main+0x42>
lea    -0x50(%rbp),%rdi
lea    -0x90(%rbp),%rsi
mov    $0x0,%al
call   1060 <foo@plt>
movl   $0x0,-0x94(%rbp)
cmpl   $0x10,-0x94(%rbp)
jae    122c <main+0xec>
mov    -0x94(%rbp),%eax
mov    -0x90(%rbp,%rax,4),%eax
mov    -0x94(%rbp),%ecx
cmp    -0xe0(%rbp,%rcx,4),%eax
je     1218 <main+0xd8>
call   1030 <abort@plt>
mov    -0x94(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x94(%rbp)
jmp    11e6 <main+0xa6>
xor    %eax,%eax
add    $0xe0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
sub    $0x88,%rsp
xor    %eax,%eax
call   1040 <check_vect@plt>
movaps 0xebb(%rip),%xmm0
movaps %xmm0,0x40(%rsp)
xorps  %xmm0,%xmm0
movaps %xmm0,(%rsp)
movaps 0xeb8(%rip),%xmm1
movaps %xmm1,0x50(%rsp)
movaps %xmm0,0x10(%rsp)
movaps 0xeb7(%rip),%xmm1
movaps %xmm1,0x60(%rsp)
movaps %xmm0,0x20(%rsp)
movaps 0xeb6(%rip),%xmm1
movaps %xmm1,0x70(%rsp)
movaps %xmm0,0x30(%rsp)
lea    0x40(%rsp),%rdi
mov    %rsp,%rsi
xor    %eax,%eax
call   1050 <foo@plt>
cmpl   $0x750,(%rsp)
jne    124c <main+0x11c>
cmpl   $0x2ea,0x4(%rsp)
jne    124c <main+0x11c>
cmpl   $0x6e90,0x8(%rsp)
jne    124c <main+0x11c>
cmpl   $0x12cf,0xc(%rsp)
jne    124c <main+0x11c>
cmpl   $0x20c8,0x10(%rsp)
jne    124c <main+0x11c>
cmpl   $0xb4e,0x14(%rsp)
jne    124c <main+0x11c>
cmpl   $0x22104,0x18(%rsp)
jne    124c <main+0x11c>
cmpl   $0x47eb,0x1c(%rsp)
jne    124c <main+0x11c>
cmpl   $0x3a40,0x20(%rsp)
jne    124c <main+0x11c>
cmpl   $0x13b2,0x24(%rsp)
jne    124c <main+0x11c>
cmpl   $0x3d378,0x28(%rsp)
jne    124c <main+0x11c>
cmpl   $0x7d07,0x2c(%rsp)
jne    124c <main+0x11c>
cmpl   $0x53b8,0x30(%rsp)
jne    124c <main+0x11c>
cmpl   $0x1c16,0x34(%rsp)
jne    124c <main+0x11c>
cmpl   $0x585ec,0x38(%rsp)
jne    124c <main+0x11c>
cmpl   $0xb223,0x3c(%rsp)
jne    124c <main+0x11c>
xor    %eax,%eax
add    $0x88,%rsp
ret
call   1030 <abort@plt>

LLVM IR (-O0):
@__const.main.check_results = [16 x i32] [i32 1872, i32 746, i32 28304, i32 4815, i32 8392, i32 2894, i32 139524, i32 18411, i32 14912, i32 5042, i32 250744, i32 32007, i32 21432, i32 7190, i32 361964, i32 45603]
define i32 @main(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i8**
%6 = alloca [16 x i32]
%7 = alloca [16 x i32]
%8 = alloca i32
%9 = alloca [16 x i32]
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
%10 = bitcast [16 x i32]* %9 to i8*
%11 = call i32 (...) @check_vect()
store i32 0, i32* %8
br label %12
12: ; preds = %24, %2
%13 = load i32, i32* %8
%14 = icmp ult i32 %13, 16
br i1 %14, label %15, label %27
15: ; preds = %12
%16 = load i32, i32* %8
%17 = urem i32 %16, 256
%18 = load i32, i32* %8
%19 = zext i32 %18 to i64
%20 = getelementptr inbounds [16 x i32], [16 x i32]* %6, i64 0, i64 %19
store i32 %17, i32* %20
%21 = load i32, i32* %8
%22 = zext i32 %21 to i64
%23 = getelementptr inbounds [16 x i32], [16 x i32]* %7, i64 0, i64 %22
store i32 0, i32* %23
br label %24
24: ; preds = %15
%25 = load i32, i32* %8
%26 = add i32 %25, 1
store i32 %26, i32* %8
br label %12
27: ; preds = %12
%28 = getelementptr inbounds [16 x i32], [16 x i32]* %6, i64 0, i64 0
%29 = getelementptr inbounds [16 x i32], [16 x i32]* %7, i64 0, i64 0
%30 = call i32 (i32*, i32*, ...) bitcast (i32 (...)* @foo to i32 (i32*, i32*, ...)*)(i32* %28, i32* %29)
store i32 0, i32* %8
br label %31
31: ; preds = %46, %27
%32 = load i32, i32* %8
%33 = icmp ult i32 %32, 16
br i1 %33, label %34, label %49
34: ; preds = %31
%35 = load i32, i32* %8
%36 = zext i32 %35 to i64
%37 = getelementptr inbounds [16 x i32], [16 x i32]* %7, i64 0, i64 %36
%38 = load i32, i32* %37
%39 = load i32, i32* %8
%40 = zext i32 %39 to i64
%41 = getelementptr inbounds [16 x i32], [16 x i32]* %9, i64 0, i64 %40
%42 = load i32, i32* %41
%43 = icmp ne i32 %38, %42
br i1 %43, label %44, label %45
44: ; preds = %34
unreachable
45: ; preds = %34
br label %46
46: ; preds = %45
%47 = load i32, i32* %8
%48 = add i32 %47, 1
store i32 %48, i32* %8
br label %31
49: ; preds = %31
ret i32 0
}

LLVM IR (-O2):
define i32 @main(i32 %0, i8** nocapture readnone %1) {
%3 = alloca [16 x i32]
%4 = alloca [16 x i32]
%5 = bitcast [16 x i32]* %3 to i8*
%6 = bitcast [16 x i32]* %4 to i8*
%7 = tail call i32 (...) @check_vect()
%8 = getelementptr inbounds [16 x i32], [16 x i32]* %3, i64 0, i64 0
%9 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 0
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%10 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 2
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%11 = bitcast [16 x i32]* %3 to <4 x i32>*
store <4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32>* %11
%12 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 3
%13 = bitcast [16 x i32]* %4 to <4 x i32>*
store <4 x i32> zeroinitializer, <4 x i32>* %13
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%14 = getelementptr inbounds [16 x i32], [16 x i32]* %3, i64 0, i64 4
%15 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 4
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%16 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 5
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%17 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 6
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%18 = bitcast i32* %14 to <4 x i32>*
store <4 x i32> <i32 4, i32 5, i32 6, i32 7>, <4 x i32>* %18
%19 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 7
%20 = bitcast i32* %15 to <4 x i32>*
store <4 x i32> zeroinitializer, <4 x i32>* %20
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%21 = getelementptr inbounds [16 x i32], [16 x i32]* %3, i64 0, i64 8
%22 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 8
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%23 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 9
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%24 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 10
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%25 = bitcast i32* %21 to <4 x i32>*
store <4 x i32> <i32 8, i32 9, i32 10, i32 11>, <4 x i32>* %25
%26 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 11
%27 = bitcast i32* %22 to <4 x i32>*
store <4 x i32> zeroinitializer, <4 x i32>* %27
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%28 = getelementptr inbounds [16 x i32], [16 x i32]* %3, i64 0, i64 12
%29 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 12
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%30 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 13
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%31 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 14
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%32 = bitcast i32* %28 to <4 x i32>*
store <4 x i32> <i32 12, i32 13, i32 14, i32 15>, <4 x i32>* %32
%33 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 15
%34 = bitcast i32* %29 to <4 x i32>*
store <4 x i32> zeroinitializer, <4 x i32>* %34
tail call void asm sideeffect "", "~{dirflag},~{fpsr},~{flags}"()
%35 = call i32 (i32*, i32*, ...) bitcast (i32 (...)* @foo to i32 (i32*, i32*, ...)*)(i32* %8, i32* %9)
%36 = load i32, i32* %9
%37 = icmp eq i32 %36, 1872
br i1 %37, label %39, label %38
38: ; preds = %82, %79, %76, %73, %70, %67, %64, %61, %58, %55, %52, %49, %46, %43, %39, %2
unreachable
39: ; preds = %2
%40 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 1
%41 = load i32, i32* %40
%42 = icmp eq i32 %41, 746
br i1 %42, label %43, label %38
43: ; preds = %39
%44 = load i32, i32* %10
%45 = icmp eq i32 %44, 28304
br i1 %45, label %46, label %38
46: ; preds = %43
%47 = load i32, i32* %12
%48 = icmp eq i32 %47, 4815
br i1 %48, label %49, label %38
49: ; preds = %46
%50 = load i32, i32* %15
%51 = icmp eq i32 %50, 8392
br i1 %51, label %52, label %38
52: ; preds = %49
%53 = load i32, i32* %16
%54 = icmp eq i32 %53, 2894
br i1 %54, label %55, label %38
55: ; preds = %52
%56 = load i32, i32* %17
%57 = icmp eq i32 %56, 139524
br i1 %57, label %58, label %38
58: ; preds = %55
%59 = load i32, i32* %19
%60 = icmp eq i32 %59, 18411
br i1 %60, label %61, label %38
61: ; preds = %58
%62 = load i32, i32* %22
%63 = icmp eq i32 %62, 14912
br i1 %63, label %64, label %38
64: ; preds = %61
%65 = load i32, i32* %23
%66 = icmp eq i32 %65, 5042
br i1 %66, label %67, label %38
67: ; preds = %64
%68 = load i32, i32* %24
%69 = icmp eq i32 %68, 250744
br i1 %69, label %70, label %38
70: ; preds = %67
%71 = load i32, i32* %26
%72 = icmp eq i32 %71, 32007
br i1 %72, label %73, label %38
73: ; preds = %70
%74 = load i32, i32* %29
%75 = icmp eq i32 %74, 21432
br i1 %75, label %76, label %38
76: ; preds = %73
%77 = load i32, i32* %30
%78 = icmp eq i32 %77, 7190
br i1 %78, label %79, label %38
79: ; preds = %76
%80 = load i32, i32* %31
%81 = icmp eq i32 %80, 361964
br i1 %81, label %82, label %38
82: ; preds = %79
%83 = load i32, i32* %33
%84 = icmp eq i32 %83, 45603
br i1 %84, label %85, label %38
85: ; preds = %82
ret i32 0
}