int main(int argc, const char *argv[]) {
  int input[16], output[16], i;
  int input2[16], output2[16];
  check_vect();
  for (i = 0; i < 16; i++) {
    input[i] = i % 256;
    input2[i] = i % 256;
    output[i] = 0;
    output2[i] = 0;
    asm volatile("" ::: "memory");
  }
  int check_results[16] = {1470,  395,  28271,  5958,  1655, 111653,
                           10446, 2915, 195035, 14934, 4175, 278417,
                           19422, 5435, 361799, 0};
  int check_results2[16] = {0, 405, 810, 1215, 1620, 0, 0, 0,
                            0, 0,   0,   0,    0,    0, 0, 0};
  foo(input, output, input2, output2);
  for (i = 0; i < 16; i++)
    if (output[i] != check_results[i] || output2[i] != check_results2[i])
      abort();
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x1a0,%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)
jge    11f4 <main+0xa4>
mov    -0x94(%rbp),%eax
mov    $0x100,%ecx
cltd
idiv   %ecx
movslq -0x94(%rbp),%rax
mov    %edx,-0x50(%rbp,%rax,4)
mov    -0x94(%rbp),%eax
mov    $0x100,%ecx
cltd
idiv   %ecx
movslq -0x94(%rbp),%rax
mov    %edx,-0xe0(%rbp,%rax,4)
movslq -0x94(%rbp),%rax
movl   $0x0,-0x90(%rbp,%rax,4)
movslq -0x94(%rbp),%rax
movl   $0x0,-0x120(%rbp,%rax,4)
mov    -0x94(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x94(%rbp)
jmp    117a <main+0x2a>
lea    -0x160(%rbp),%rdi
lea    0xdfe(%rip),%rsi
mov    $0x40,%edx
call   1060 <memcpy@plt>
lea    -0x1a0(%rbp),%rdi
xor    %esi,%esi
mov    $0x40,%edx
call   1050 <memset@plt>
movl   $0x195,-0x19c(%rbp)
movl   $0x32a,-0x198(%rbp)
movl   $0x4bf,-0x194(%rbp)
movl   $0x654,-0x190(%rbp)
lea    -0x50(%rbp),%rdi
lea    -0x90(%rbp),%rsi
lea    -0xe0(%rbp),%rdx
lea    -0x120(%rbp),%rcx
mov    $0x0,%al
call   1070 <foo@plt>
movl   $0x0,-0x94(%rbp)
cmpl   $0x10,-0x94(%rbp)
jge    12e0 <main+0x190>
movslq -0x94(%rbp),%rax
mov    -0x90(%rbp,%rax,4),%eax
movslq -0x94(%rbp),%rcx
cmp    -0x160(%rbp,%rcx,4),%eax
jne    12c2 <main+0x172>
movslq -0x94(%rbp),%rax
mov    -0x120(%rbp,%rax,4),%eax
movslq -0x94(%rbp),%rcx
cmp    -0x1a0(%rbp,%rcx,4),%eax
je     12c7 <main+0x177>
call   1030 <abort@plt>
jmp    12cc <main+0x17c>
mov    -0x94(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x94(%rbp)
jmp    1271 <main+0x121>
xor    %eax,%eax
add    $0x1a0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbx
sub    $0x140,%rsp
xor    %ebx,%ebx
xor    %eax,%eax
call   1040 <check_vect@plt>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %ebx,0x100(%rsp,%rbx,4)
mov    %ebx,0xc0(%rsp,%rbx,4)
movl   $0x0,0x80(%rsp,%rbx,4)
movl   $0x0,0x40(%rsp,%rbx,4)
add    $0x1,%rbx
cmp    $0x10,%rbx
jne    1150 <main+0x20>
xorps  %xmm0,%xmm0
movaps %xmm0,0x10(%rsp)
movaps %xmm0,(%rsp)
movaps %xmm0,0x30(%rsp)
movaps %xmm0,0x20(%rsp)
movaps 0xe68(%rip),%xmm0
movups %xmm0,0x4(%rsp)
xor    %ebx,%ebx
lea    0x100(%rsp),%rdi
lea    0x80(%rsp),%rsi
lea    0xc0(%rsp),%rdx
lea    0x40(%rsp),%rcx
xor    %eax,%eax
call   1050 <foo@plt>
lea    0xe46(%rip),%rax
nopw   0x0(%rax,%rax,1)
mov    0x80(%rsp,%rbx,4),%ecx
cmp    (%rax,%rbx,4),%ecx
jne    1211 <main+0xe1>
mov    0x40(%rsp,%rbx,4),%ecx
cmp    (%rsp,%rbx,4),%ecx
jne    1211 <main+0xe1>
mov    0x84(%rsp,%rbx,4),%ecx
cmp    0x4(%rax,%rbx,4),%ecx
jne    1211 <main+0xe1>
mov    0x44(%rsp,%rbx,4),%ecx
cmp    0x4(%rsp,%rbx,4),%ecx
jne    1211 <main+0xe1>
add    $0x2,%rbx
cmp    $0x10,%rbx
jne    11d0 <main+0xa0>
xor    %eax,%eax
add    $0x140,%rsp
pop    %rbx
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]
%10 = alloca [16 x i32]
%11 = alloca [16 x i32]
%12 = alloca [16 x i32]
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
%13 = call i32 (...) @check_vect()
store i32 0, i32* %8
br label %14
14: ; preds = %34, %2
%15 = load i32, i32* %8
%16 = icmp slt i32 %15, 16
br i1 %16, label %17, label %37
17: ; preds = %14
%18 = load i32, i32* %8
%19 = srem i32 %18, 256
%20 = load i32, i32* %8
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds [16 x i32], [16 x i32]* %6, i64 0, i64 %21
store i32 %19, i32* %22
%23 = load i32, i32* %8
%24 = srem i32 %23, 256
%25 = load i32, i32* %8
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds [16 x i32], [16 x i32]* %9, i64 0, i64 %26
store i32 %24, i32* %27
%28 = load i32, i32* %8
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds [16 x i32], [16 x i32]* %7, i64 0, i64 %29
store i32 0, i32* %30
%31 = load i32, i32* %8
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 %32
store i32 0, i32* %33
br label %34
34: ; preds = %17
%35 = load i32, i32* %8
%36 = add nsw i32 %35, 1
store i32 %36, i32* %8
br label %14
37: ; preds = %14
%38 = bitcast [16 x i32]* %11 to i8*
%39 = bitcast [16 x i32]* %12 to i8*
%40 = bitcast i8* %39 to <{ i32, i32, i32, i32, i32, [11 x i32] }>*
%41 = getelementptr inbounds <{ i32, i32, i32, i32, i32, [11 x i32] }>, <{ i32, i32, i32, i32, i32, [11 x i32] }>* %40, i32 0, i32 1
store i32 405, i32* %41
%42 = getelementptr inbounds <{ i32, i32, i32, i32, i32, [11 x i32] }>, <{ i32, i32, i32, i32, i32, [11 x i32] }>* %40, i32 0, i32 2
store i32 810, i32* %42
%43 = getelementptr inbounds <{ i32, i32, i32, i32, i32, [11 x i32] }>, <{ i32, i32, i32, i32, i32, [11 x i32] }>* %40, i32 0, i32 3
store i32 1215, i32* %43
%44 = getelementptr inbounds <{ i32, i32, i32, i32, i32, [11 x i32] }>, <{ i32, i32, i32, i32, i32, [11 x i32] }>* %40, i32 0, i32 4
store i32 1620, i32* %44
%45 = getelementptr inbounds [16 x i32], [16 x i32]* %6, i64 0, i64 0
%46 = getelementptr inbounds [16 x i32], [16 x i32]* %7, i64 0, i64 0
%47 = getelementptr inbounds [16 x i32], [16 x i32]* %9, i64 0, i64 0
%48 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 0
%49 = call i32 (i32*, i32*, i32*, i32*, ...) bitcast (i32 (...)* @foo to i32 (i32*, i32*, i32*, i32*, ...)*)(i32* %45, i32* %46, i32* %47, i32* %48)
store i32 0, i32* %8
br label %50
50: ; preds = %75, %37
%51 = load i32, i32* %8
%52 = icmp slt i32 %51, 16
br i1 %52, label %53, label %78
53: ; preds = %50
%54 = load i32, i32* %8
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds [16 x i32], [16 x i32]* %7, i64 0, i64 %55
%57 = load i32, i32* %56
%58 = load i32, i32* %8
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds [16 x i32], [16 x i32]* %11, i64 0, i64 %59
%61 = load i32, i32* %60
%62 = icmp ne i32 %57, %61
br i1 %62, label %73, label %63
63: ; preds = %53
%64 = load i32, i32* %8
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 %65
%67 = load i32, i32* %66
%68 = load i32, i32* %8
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds [16 x i32], [16 x i32]* %12, i64 0, i64 %69
%71 = load i32, i32* %70
%72 = icmp ne i32 %67, %71
br i1 %72, label %73, label %74
73: ; preds = %63, %53
unreachable
74: ; preds = %63
br label %75
75: ; preds = %74
%76 = load i32, i32* %8
%77 = add nsw i32 %76, 1
store i32 %77, i32* %8
br label %50
78: ; preds = %50
ret i32 0
}

LLVM IR (-O2):
@__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** nocapture readnone %1) {
%3 = alloca [16 x i32]
%4 = alloca [16 x i32]
%5 = alloca [16 x i32]
%6 = alloca [16 x i32]
%7 = alloca [16 x i32]
%8 = bitcast [16 x i32]* %3 to i8*
%9 = bitcast [16 x i32]* %4 to i8*
%10 = bitcast [16 x i32]* %5 to i8*
%11 = bitcast [16 x i32]* %6 to i8*
%12 = tail call i32 (...) @check_vect()
br label %13
13: ; preds = %2, %13
%14 = phi i64 [ 0, %2 ], [ %20, %13 ]
%15 = getelementptr inbounds [16 x i32], [16 x i32]* %3, i64 0, i64 %14
%16 = trunc i64 %14 to i32
store i32 %16, i32* %15
%17 = getelementptr inbounds [16 x i32], [16 x i32]* %5, i64 0, i64 %14
store i32 %16, i32* %17
%18 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 %14
store i32 0, i32* %18
%19 = getelementptr inbounds [16 x i32], [16 x i32]* %6, i64 0, i64 %14
store i32 0, i32* %19
tail call void asm sideeffect "", "~{memory},~{dirflag},~{fpsr},~{flags}"()
%20 = add nuw nsw i64 %14, 1
%21 = icmp eq i64 %20, 16
br i1 %21, label %22, label %13
22: ; preds = %13
%23 = bitcast [16 x i32]* %7 to i8*
%24 = getelementptr inbounds [16 x i32], [16 x i32]* %7, i64 0, i64 1
%25 = bitcast i32* %24 to <4 x i32>*
store <4 x i32> <i32 405, i32 810, i32 1215, i32 1620>, <4 x i32>* %25
%26 = getelementptr inbounds [16 x i32], [16 x i32]* %3, i64 0, i64 0
%27 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 0
%28 = getelementptr inbounds [16 x i32], [16 x i32]* %5, i64 0, i64 0
%29 = getelementptr inbounds [16 x i32], [16 x i32]* %6, i64 0, i64 0
%30 = call i32 (i32*, i32*, i32*, i32*, ...) bitcast (i32 (...)* @foo to i32 (i32*, i32*, i32*, i32*, ...)*)(i32* %26, i32* %27, i32* %28, i32* %29)
br label %47
31: ; preds = %54
%32 = or i64 %48, 1
%33 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 %32
%34 = load i32, i32* %33
%35 = getelementptr inbounds [16 x i32], [16 x i32]* @__const.main.check_results, i64 0, i64 %32
%36 = load i32, i32* %35
%37 = icmp eq i32 %34, %36
br i1 %37, label %38, label %60
38: ; preds = %31
%39 = getelementptr inbounds [16 x i32], [16 x i32]* %6, i64 0, i64 %32
%40 = load i32, i32* %39
%41 = getelementptr inbounds [16 x i32], [16 x i32]* %7, i64 0, i64 %32
%42 = load i32, i32* %41
%43 = icmp eq i32 %40, %42
br i1 %43, label %44, label %60
44: ; preds = %38
%45 = add nuw nsw i64 %48, 2
%46 = icmp eq i64 %45, 16
br i1 %46, label %61, label %47
47: ; preds = %44, %22
%48 = phi i64 [ 0, %22 ], [ %45, %44 ]
%49 = getelementptr inbounds [16 x i32], [16 x i32]* %4, i64 0, i64 %48
%50 = load i32, i32* %49
%51 = getelementptr inbounds [16 x i32], [16 x i32]* @__const.main.check_results, i64 0, i64 %48
%52 = load i32, i32* %51
%53 = icmp eq i32 %50, %52
br i1 %53, label %54, label %60
54: ; preds = %47
%55 = getelementptr inbounds [16 x i32], [16 x i32]* %6, i64 0, i64 %48
%56 = load i32, i32* %55
%57 = getelementptr inbounds [16 x i32], [16 x i32]* %7, i64 0, i64 %48
%58 = load i32, i32* %57
%59 = icmp eq i32 %56, %58
br i1 %59, label %31, label %60
60: ; preds = %38, %31, %54, %47
unreachable
61: ; preds = %44
ret i32 0
}