void init(int c[512], int d[512]) {
  for (int i = 0; i < 512; i++) {
    c[i] = i;
    d[i] = i + 512;
  }
}


x86 assembly (clang, -O0):
<init>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x200,-0x14(%rbp)
jge    1150 <init+0x50>
mov    -0x14(%rbp),%edx
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x14(%rbp),%edx
add    $0x200,%edx
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1113 <init+0x13>
pop    %rbp
ret

x86 assembly (clang, -O2):
<init>:
lea    0x800(%rsi),%rax
cmp    %rdi,%rax
jbe    1170 <init+0x70>
lea    0x800(%rdi),%rax
cmp    %rsi,%rax
jbe    1170 <init+0x70>
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
mov    %eax,(%rdi,%rax,4)
lea    0x200(%rax),%ecx
mov    %ecx,(%rsi,%rax,4)
lea    0x1(%rax),%ecx
mov    %ecx,0x4(%rdi,%rax,4)
lea    0x201(%rax),%ecx
mov    %ecx,0x4(%rsi,%rax,4)
lea    0x2(%rax),%ecx
mov    %ecx,0x8(%rdi,%rax,4)
lea    0x202(%rax),%ecx
mov    %ecx,0x8(%rsi,%rax,4)
lea    0x3(%rax),%ecx
mov    %ecx,0xc(%rdi,%rax,4)
lea    0x203(%rax),%ecx
mov    %ecx,0xc(%rsi,%rax,4)
add    $0x4,%rax
cmp    $0x200,%rax
jne    1120 <init+0x20>
jmp    124e <init+0x14e>
movdqa 0xe88(%rip),%xmm3
xor    %eax,%eax
movdqa 0xe8d(%rip),%xmm8
movdqa 0xe94(%rip),%xmm9
movdqa 0xe9b(%rip),%xmm10
movdqa 0xea2(%rip),%xmm11
movdqa 0xeaa(%rip),%xmm5
movdqa 0xeb2(%rip),%xmm6
movdqa 0xeba(%rip),%xmm7
movdqa 0xec2(%rip),%xmm1
movdqa %xmm3,%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqa %xmm3,%xmm2
paddd  %xmm8,%xmm2
movdqu %xmm3,(%rdi,%rax,4)
movdqu %xmm2,0x10(%rdi,%rax,4)
movdqa %xmm0,%xmm2
paddd  %xmm9,%xmm2
movdqa %xmm0,%xmm4
paddd  %xmm10,%xmm4
movdqu %xmm2,(%rsi,%rax,4)
movdqu %xmm4,0x10(%rsi,%rax,4)
movdqa %xmm3,%xmm2
paddd  %xmm11,%xmm2
movdqa %xmm3,%xmm4
paddd  %xmm5,%xmm4
movdqu %xmm2,0x20(%rdi,%rax,4)
movdqu %xmm4,0x30(%rdi,%rax,4)
movdqa %xmm0,%xmm2
paddd  %xmm6,%xmm2
movdqa %xmm0,%xmm4
paddd  %xmm7,%xmm4
movdqu %xmm2,0x20(%rsi,%rax,4)
movdqu %xmm4,0x30(%rsi,%rax,4)
add    $0x10,%rax
paddd  %xmm1,%xmm3
paddd  %xmm1,%xmm0
cmp    $0x200,%rax
jne    11d0 <init+0xd0>
ret

LLVM IR (-O0):
define void @init(i32* %0, i32* %1) {
%3 = alloca i32*
%4 = alloca i32*
%5 = alloca i32
store i32* %0, i32** %3
store i32* %1, i32** %4
store i32 0, i32* %5
br label %6
6: ; preds = %21, %2
%7 = load i32, i32* %5
%8 = icmp slt i32 %7, 512
br i1 %8, label %9, label %24
9: ; preds = %6
%10 = load i32, i32* %5
%11 = load i32*, i32** %3
%12 = load i32, i32* %5
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i32, i32* %11, i64 %13
store i32 %10, i32* %14
%15 = load i32, i32* %5
%16 = add nsw i32 %15, 512
%17 = load i32*, i32** %4
%18 = load i32, i32* %5
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i32, i32* %17, i64 %19
store i32 %16, i32* %20
br label %21
21: ; preds = %9
%22 = load i32, i32* %5
%23 = add nsw i32 %22, 1
store i32 %23, i32* %5
br label %6
24: ; preds = %6
ret void
}

LLVM IR (-O2):
define void @init(i32* nocapture writeonly %0, i32* nocapture writeonly %1) {
%3 = getelementptr i32, i32* %0, i64 512
%4 = getelementptr i32, i32* %1, i64 512
%5 = icmp ugt i32* %4, %0
%6 = icmp ugt i32* %3, %1
%7 = and i1 %5, %6
br i1 %7, label %41, label %8
8: ; preds = %2, %8
%9 = phi i64 [ %36, %8 ], [ 0, %2 ]
%10 = phi <4 x i32> [ %37, %8 ], [ <i32 0, i32 1, i32 2, i32 3>, %2 ]
%11 = phi <4 x i32> [ %38, %8 ], [ <i32 0, i32 1, i32 2, i32 3>, %2 ]
%12 = add <4 x i32> %10, <i32 4, i32 4, i32 4, i32 4>
%13 = getelementptr inbounds i32, i32* %0, i64 %9
%14 = bitcast i32* %13 to <4 x i32>*
store <4 x i32> %10, <4 x i32>* %14
%15 = getelementptr inbounds i32, i32* %13, i64 4
%16 = bitcast i32* %15 to <4 x i32>*
store <4 x i32> %12, <4 x i32>* %16
%17 = getelementptr inbounds i32, i32* %1, i64 %9
%18 = add <4 x i32> %11, <i32 512, i32 512, i32 512, i32 512>
%19 = add <4 x i32> %11, <i32 516, i32 516, i32 516, i32 516>
%20 = bitcast i32* %17 to <4 x i32>*
store <4 x i32> %18, <4 x i32>* %20
%21 = getelementptr inbounds i32, i32* %17, i64 4
%22 = bitcast i32* %21 to <4 x i32>*
store <4 x i32> %19, <4 x i32>* %22
%23 = or i64 %9, 8
%24 = add <4 x i32> %10, <i32 8, i32 8, i32 8, i32 8>
%25 = add <4 x i32> %10, <i32 12, i32 12, i32 12, i32 12>
%26 = getelementptr inbounds i32, i32* %0, i64 %23
%27 = bitcast i32* %26 to <4 x i32>*
store <4 x i32> %24, <4 x i32>* %27
%28 = getelementptr inbounds i32, i32* %26, i64 4
%29 = bitcast i32* %28 to <4 x i32>*
store <4 x i32> %25, <4 x i32>* %29
%30 = getelementptr inbounds i32, i32* %1, i64 %23
%31 = add <4 x i32> %11, <i32 520, i32 520, i32 520, i32 520>
%32 = add <4 x i32> %11, <i32 524, i32 524, i32 524, i32 524>
%33 = bitcast i32* %30 to <4 x i32>*
store <4 x i32> %31, <4 x i32>* %33
%34 = getelementptr inbounds i32, i32* %30, i64 4
%35 = bitcast i32* %34 to <4 x i32>*
store <4 x i32> %32, <4 x i32>* %35
%36 = add nuw nsw i64 %9, 16
%37 = add <4 x i32> %10, <i32 16, i32 16, i32 16, i32 16>
%38 = add <4 x i32> %11, <i32 16, i32 16, i32 16, i32 16>
%39 = icmp eq i64 %36, 512
br i1 %39, label %40, label %8
40: ; preds = %8, %41
ret void
41: ; preds = %2, %41
%42 = phi i64 [ %66, %41 ], [ 0, %2 ]
%43 = getelementptr inbounds i32, i32* %0, i64 %42
%44 = trunc i64 %42 to i32
store i32 %44, i32* %43
%45 = getelementptr inbounds i32, i32* %1, i64 %42
%46 = trunc i64 %42 to i32
%47 = add nuw nsw i32 %46, 512
store i32 %47, i32* %45
%48 = or i64 %42, 1
%49 = getelementptr inbounds i32, i32* %0, i64 %48
%50 = trunc i64 %48 to i32
store i32 %50, i32* %49
%51 = getelementptr inbounds i32, i32* %1, i64 %48
%52 = trunc i64 %48 to i32
%53 = add nuw nsw i32 %52, 512
store i32 %53, i32* %51
%54 = or i64 %42, 2
%55 = getelementptr inbounds i32, i32* %0, i64 %54
%56 = trunc i64 %54 to i32
store i32 %56, i32* %55
%57 = getelementptr inbounds i32, i32* %1, i64 %54
%58 = trunc i64 %54 to i32
%59 = add nuw nsw i32 %58, 512
store i32 %59, i32* %57
%60 = or i64 %42, 3
%61 = getelementptr inbounds i32, i32* %0, i64 %60
%62 = trunc i64 %60 to i32
store i32 %62, i32* %61
%63 = getelementptr inbounds i32, i32* %1, i64 %60
%64 = trunc i64 %60 to i32
%65 = add nuw nsw i32 %64, 512
store i32 %65, i32* %63
%66 = add nuw nsw i64 %42, 4
%67 = icmp eq i64 %66, 512
br i1 %67, label %40, label %41
}