int main(int argc, const char *argv[]) {
  unsigned int input[16], output[16], i;
  check_vect();
  for (i = 0; i < 16; i++) {
    input[i] = i % 256;
    output[i] = 0;
    __asm__ volatile("");
  }
  unsigned int check_results[16] = {1470,  395,  28271,  5958,  1655, 111653,
                                    10446, 2915, 195035, 14934, 4175, 278417,
                                    19422, 5435, 361799, 0};
  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)
mov    $0x0,%al
call   1040 <check_vect@plt>
movl   $0x0,-0x94(%rbp)
cmpl   $0x10,-0x94(%rbp)
jae    11b2 <main+0x72>
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    116a <main+0x2a>
lea    -0xe0(%rbp),%rdi
lea    0xe40(%rip),%rsi
mov    $0x40,%edx
call   1050 <memcpy@plt>
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   $0x5be,(%rsp)
jne    1245 <main+0x115>
cmpl   $0x18b,0x4(%rsp)
jne    1245 <main+0x115>
cmpl   $0x6e6f,0x8(%rsp)
jne    1245 <main+0x115>
cmpl   $0x1746,0xc(%rsp)
jne    1245 <main+0x115>
cmpl   $0x677,0x10(%rsp)
jne    1245 <main+0x115>
cmpl   $0x1b425,0x14(%rsp)
jne    1245 <main+0x115>
cmpl   $0x28ce,0x18(%rsp)
jne    1245 <main+0x115>
cmpl   $0xb63,0x1c(%rsp)
jne    1245 <main+0x115>
cmpl   $0x2f9db,0x20(%rsp)
jne    1245 <main+0x115>
cmpl   $0x3a56,0x24(%rsp)
jne    1245 <main+0x115>
cmpl   $0x104f,0x28(%rsp)
jne    1245 <main+0x115>
cmpl   $0x43f91,0x2c(%rsp)
jne    1245 <main+0x115>
cmpl   $0x4bde,0x30(%rsp)
jne    1245 <main+0x115>
cmpl   $0x153b,0x34(%rsp)
jne    1245 <main+0x115>
cmpl   $0x58547,0x38(%rsp)
jne    1245 <main+0x115>
cmpl   $0x0,0x3c(%rsp)
jne    1245 <main+0x115>
xor    %eax,%eax
add    $0x88,%rsp
ret
call   1030 <abort@plt>

LLVM IR (-O0):
@__const.main.check_results = [16 x i32] [i32 1470, i32 395, i32 28271, i32 5958, i32 1655, i32 111653, i32 10446, i32 2915, i32 195035, i32 14934, i32 4175, i32 278417, i32 19422, i32 5435, i32 361799, i32 0]
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 = call i32 (...) @check_vect()
store i32 0, i32* %8
br label %11
11: ; preds = %23, %2
%12 = load i32, i32* %8
%13 = icmp ult i32 %12, 16
br i1 %13, label %14, label %26
14: ; preds = %11
%15 = load i32, i32* %8
%16 = urem i32 %15, 256
%17 = load i32, i32* %8
%18 = zext i32 %17 to i64
%19 = getelementptr inbounds [16 x i32], [16 x i32]* %6, i64 0, i64 %18
store i32 %16, i32* %19
%20 = load i32, i32* %8
%21 = zext i32 %20 to i64
%22 = getelementptr inbounds [16 x i32], [16 x i32]* %7, i64 0, i64 %21
store i32 0, i32* %22
br label %23
23: ; preds = %14
%24 = load i32, i32* %8
%25 = add i32 %24, 1
store i32 %25, i32* %8
br label %11
26: ; preds = %11
%27 = bitcast [16 x i32]* %9 to i8*
%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, %26
%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, 1470
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, 395
br i1 %42, label %43, label %38
43: ; preds = %39
%44 = load i32, i32* %10
%45 = icmp eq i32 %44, 28271
br i1 %45, label %46, label %38
46: ; preds = %43
%47 = load i32, i32* %12
%48 = icmp eq i32 %47, 5958
br i1 %48, label %49, label %38
49: ; preds = %46
%50 = load i32, i32* %15
%51 = icmp eq i32 %50, 1655
br i1 %51, label %52, label %38
52: ; preds = %49
%53 = load i32, i32* %16
%54 = icmp eq i32 %53, 111653
br i1 %54, label %55, label %38
55: ; preds = %52
%56 = load i32, i32* %17
%57 = icmp eq i32 %56, 10446
br i1 %57, label %58, label %38
58: ; preds = %55
%59 = load i32, i32* %19
%60 = icmp eq i32 %59, 2915
br i1 %60, label %61, label %38
61: ; preds = %58
%62 = load i32, i32* %22
%63 = icmp eq i32 %62, 195035
br i1 %63, label %64, label %38
64: ; preds = %61
%65 = load i32, i32* %23
%66 = icmp eq i32 %65, 14934
br i1 %66, label %67, label %38
67: ; preds = %64
%68 = load i32, i32* %24
%69 = icmp eq i32 %68, 4175
br i1 %69, label %70, label %38
70: ; preds = %67
%71 = load i32, i32* %26
%72 = icmp eq i32 %71, 278417
br i1 %72, label %73, label %38
73: ; preds = %70
%74 = load i32, i32* %29
%75 = icmp eq i32 %74, 19422
br i1 %75, label %76, label %38
76: ; preds = %73
%77 = load i32, i32* %30
%78 = icmp eq i32 %77, 5435
br i1 %78, label %79, label %38
79: ; preds = %76
%80 = load i32, i32* %31
%81 = icmp eq i32 %80, 361799
br i1 %81, label %82, label %38
82: ; preds = %79
%83 = load i32, i32* %33
%84 = icmp eq i32 %83, 0
br i1 %84, label %85, label %38
85: ; preds = %82
ret i32 0
}